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#include <string.h> 27a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 28a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#if defined(HAS_DFP) 29a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 30a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesregister double f14 __asm__ ("fr14"); 31a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesregister double f15 __asm__ ("fr15"); 32a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesregister double f16 __asm__ ("fr16"); 33a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesregister double f17 __asm__ ("fr17"); 34a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesregister double f18 __asm__ ("fr18"); 35a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesregister double f19 __asm__ ("fr19"); 36a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 37a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 38a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef unsigned char Bool; 39a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define True 1 40a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define False 0 41a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 42a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 43a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" 44a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 45a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_CR(_arg) \ 46a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR ); 47a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 48a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_XER(_arg) \ 49a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" ); 50a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 51a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_CR(_lval) \ 52a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mfcr %0" : "=b"(_lval) ) 53a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 54a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_XER(_lval) \ 55a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) ) 56a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 57a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_CR_XER(_lval_cr,_lval_xer) \ 58a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0) 59a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 60a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_CR_ZERO \ 61a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_CR(0) 62a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 63a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_XER_ZERO \ 64a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_XER(0) 65a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 66a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_CR_XER_ZERO \ 67a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes do { SET_CR_ZERO; SET_XER_ZERO; } while (0) 68a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 69a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_FPSCR_ZERO \ 70a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes do { double _d = 0.0; \ 71a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \ 72a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } while (0) 73a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 74a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define GET_FPSCR(_arg) \ 75a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mffs %0" : "=f"(_arg) ) 76a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 77a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define SET_FPSCR_DRN \ 78a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("mtfsf 1, %0, 0, 1" : : "f"(f14) ) 79a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 80a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 81a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// The assembly-level instructions being tested 82a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_drintx(int R, int RMC) 83a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 84a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3 || R < 0 || R > 1) { 85a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", R, RMC); 86a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 87a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 88a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 89a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 90a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 91a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 1, %0, %1, 0" : "=f" (f18) : "f" (f16)); 92a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 93a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 0, %0, %1, 0" : "=f" (f18) : "f" (f16)); 94a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 95a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 96a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 97a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 1, %0, %1, 1" : "=f" (f18) : "f" (f16)); 98a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 99a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 0, %0, %1, 1" : "=f" (f18) : "f" (f16)); 100a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 101a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 102a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 103a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 1, %0, %1, 2" : "=f" (f18) : "f" (f16)); 104a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 105a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 0, %0, %1, 2" : "=f" (f18) : "f" (f16)); 106a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 107a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 108a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 109a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 1, %0, %1, 3" : "=f" (f18) : "f" (f16)); 110a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 111a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintx 0, %0, %1, 3" : "=f" (f18) : "f" (f16)); 112a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 113a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 114a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 115a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 116a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 117a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 118a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_drintn(int R, int RMC) 119a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 120a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3 || R < 0 || R > 1) { 121a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", R, RMC); 122a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 123a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 124a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 125a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 126a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 127a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 1, %0, %1, 0" : "=f" (f18) : "f" (f16)); 128a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 129a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 0, %0, %1, 0" : "=f" (f18) : "f" (f16)); 130a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 131a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 132a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 133a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 1, %0, %1, 1" : "=f" (f18) : "f" (f16)); 134a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 135a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 0, %0, %1, 1" : "=f" (f18) : "f" (f16)); 136a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 137a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 138a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 139a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 1, %0, %1, 2" : "=f" (f18) : "f" (f16)); 140a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 141a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 0, %0, %1, 2" : "=f" (f18) : "f" (f16)); 142a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 143a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 144a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 145a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 1, %0, %1, 3" : "=f" (f18) : "f" (f16)); 146a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 147a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintn 0, %0, %1, 3" : "=f" (f18) : "f" (f16)); 148a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 149a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 150a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 151a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 152a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 153a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 154a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 155a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_diex(int a __attribute__((unused)), int b __attribute__((unused))) 156a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 157a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("diex %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16)); 158a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 159a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 160a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dxex(int a __attribute__((unused)), int b __attribute__((unused))) 161a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 162a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dxex %0, %1" : "=f" (f18) : "f" (f16)); 163a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 164a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 165a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dcmpo(int BF, int x __attribute__((unused))) 166a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 167a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF < 0 || BF > 7) { 168a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", BF); 169a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 170a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 171a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (BF) { 172a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 173a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 0, %0, %1" : : "f" (f14),"f" (f16)); 174a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 175a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 176a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 1, %0, %1" : : "f" (f14),"f" (f16)); 177a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 178a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 179a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 2, %0, %1" : : "f" (f14),"f" (f16)); 180a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 181a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 182a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 3, %0, %1" : : "f" (f14),"f" (f16)); 183a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 184a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 185a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 4, %0, %1" : : "f" (f14),"f" (f16)); 186a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 187a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 188a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 5, %0, %1" : : "f" (f14),"f" (f16)); 189a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 190a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 6: 191a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 6, %0, %1" : : "f" (f14),"f" (f16)); 192a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 193a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 7: 194a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpo 7, %0, %1" : : "f" (f14),"f" (f16)); 195a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 196a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 197a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 198a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 199a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 200a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 201a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dcmpu(int BF, int x __attribute__((unused))) 202a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 203a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF < 0 || BF > 7) { 204a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", BF); 205a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 206a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 207a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (BF) { 208a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 209a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 0, %0, %1" : : "f" (f14),"f" (f16)); 210a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 211a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 212a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 1, %0, %1" : : "f" (f14),"f" (f16)); 213a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 214a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 215a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 2, %0, %1" : : "f" (f14),"f" (f16)); 216a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 217a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 218a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 3, %0, %1" : : "f" (f14),"f" (f16)); 219a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 220a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 221a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 4, %0, %1" : : "f" (f14),"f" (f16)); 222a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 223a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 224a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 5, %0, %1" : : "f" (f14),"f" (f16)); 225a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 226a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 6: 227a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 6, %0, %1" : : "f" (f14),"f" (f16)); 228a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 229a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 7: 230a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpu 7, %0, %1" : : "f" (f14),"f" (f16)); 231a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 232a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 233a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 234a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 235a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 236a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 237a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// Quad instruction testing 238a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_drintxq(int R, int RMC) 239a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 240a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3 || R < 0 || R > 1) { 241a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", R, RMC); 242a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 243a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 244a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 245a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 246a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 247a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 1, %0, %1, 0" : "=f" (f18) : "f" (f16)); 248a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 249a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 0, %0, %1, 0" : "=f" (f18) : "f" (f16)); 250a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 251a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 252a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 253a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 1, %0, %1, 1" : "=f" (f18) : "f" (f16)); 254a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 255a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 0, %0, %1, 1" : "=f" (f18) : "f" (f16)); 256a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 257a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 258a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 259a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 1, %0, %1, 2" : "=f" (f18) : "f" (f16)); 260a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 261a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 0, %0, %1, 2" : "=f" (f18) : "f" (f16)); 262a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 263a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 264a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 265a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 1, %0, %1, 3" : "=f" (f18) : "f" (f16)); 266a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 267a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintxq 0, %0, %1, 3" : "=f" (f18) : "f" (f16)); 268a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 269a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 270a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 271a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 272a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 273a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 274a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_drintnq(int R, int RMC) 275a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 276a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3 || R < 0 || R > 1) { 277a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", R, RMC); 278a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 279a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 280a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 281a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 282a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 283a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 1, %0, %1, 0" : "=f" (f18) : "f" (f16)); 284a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 285a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 0, %0, %1, 0" : "=f" (f18) : "f" (f16)); 286a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 287a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 288a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 289a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 1, %0, %1, 1" : "=f" (f18) : "f" (f16)); 290a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 291a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 0, %0, %1, 1" : "=f" (f18) : "f" (f16)); 292a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 293a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 294a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 295a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 1, %0, %1, 2" : "=f" (f18) : "f" (f16)); 296a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 297a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 0, %0, %1, 2" : "=f" (f18) : "f" (f16)); 298a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 299a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 300a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (R) 301a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 1, %0, %1, 3" : "=f" (f18) : "f" (f16)); 302a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes else 303a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drintnq 0, %0, %1, 3" : "=f" (f18) : "f" (f16)); 304a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 305a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 306a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 307a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 308a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 309a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 310a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_diexq(int a __attribute__((unused)), int b __attribute__((unused))) 311a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 312a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("diexq %0, %1, %2" : "=f" (f18) : "f" (f14),"f" (f16)); 313a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 314a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 315a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dxexq(int a __attribute__((unused)), int b __attribute__((unused))) 316a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 317a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dxexq %0, %1" : "=f" (f18) : "f" (f16)); 318a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 319a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 320a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dcmpoq(int BF, int x __attribute__((unused))) 321a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 322a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF < 0 || BF > 7) { 323a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", BF ); 324a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 325a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 326a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (BF) { 327a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 328a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 0, %0, %1" : : "f" (f14),"f" (f16)); 329a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 330a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 331a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 1, %0, %1" : : "f" (f14),"f" (f16)); 332a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 333a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 334a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 2, %0, %1" : : "f" (f14),"f" (f16)); 335a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 336a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 337a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 3, %0, %1" : : "f" (f14),"f" (f16)); 338a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 339a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 340a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 4, %0, %1" : : "f" (f14),"f" (f16)); 341a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 342a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 343a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 5, %0, %1" : : "f" (f14),"f" (f16)); 344a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 345a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 6: 346a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 6, %0, %1" : : "f" (f14),"f" (f16)); 347a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 348a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 7: 349a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpoq 7, %0, %1" : : "f" (f14),"f" (f16)); 350a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 351a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 352a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 353a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 354a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 355a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 356a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dcmpuq(int BF, int x __attribute__((unused))) 357a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 358a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (BF < 0 || BF > 7) { 359a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", BF); 360a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 361a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 362a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (BF) { 363a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 364a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 0, %0, %1" : : "f" (f14),"f" (f16)); 365a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 366a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 367a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 1, %0, %1" : : "f" (f14),"f" (f16)); 368a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 369a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 370a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 2, %0, %1" : : "f" (f14),"f" (f16)); 371a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 372a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 373a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 3, %0, %1" : : "f" (f14),"f" (f16)); 374a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 375a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 4: 376a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 4, %0, %1" : : "f" (f14),"f" (f16)); 377a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 378a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 379a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 5, %0, %1" : : "f" (f14),"f" (f16)); 380a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 381a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 6: 382a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 6, %0, %1" : : "f" (f14),"f" (f16)); 383a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 384a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 7: 385a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dcmpuq 7, %0, %1" : : "f" (f14),"f" (f16)); 386a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 387a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 388a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 389a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 390a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 391a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 392a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_drrnd(int x __attribute__((unused)), int RMC) 393a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 394a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 31) { 395a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", RMC); 396a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 397a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 398a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 399a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 400a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrnd %0, %1, %2, 0" : "=f" (f18) : "f" (f14), "f" (f16)); 401a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 402a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 403a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrnd %0, %1, %2, 1" : "=f" (f18) : "f" (f14), "f" (f16)); 404a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 405a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 406a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrnd %0, %1, %2, 2" : "=f" (f18) : "f" (f14), "f" (f16)); 407a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 408a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 409a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrnd %0, %1, %2, 3" : "=f" (f18) : "f" (f14), "f" (f16)); 410a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 411a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 412a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 413a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 414a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 415a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 416a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_drrndq(int x __attribute__((unused)), int RMC) 417a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 418a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3) { 419a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%dn", RMC); 420a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 421a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 422a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 423a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 424a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrndq %0, %1, %2, 0" : "=f" (f18) : "f" (f14), "f" (f16)); 425a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 426a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 427a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrndq %0, %1, %2, 1" : "=f" (f18) : "f" (f14), "f" (f16)); 428a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 429a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 430a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrndq %0, %1, %2, 2" : "=f" (f18) : "f" (f14), "f" (f16)); 431a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 432a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 433a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("drrndq %0, %1, %2, 3" : "=f" (f18) : "f" (f14), "f" (f16)); 434a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 435a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 436a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 437a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 438a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 439a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 440a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dqua(int x __attribute__((unused)), int RMC) 441a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 442a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3) { 443a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", RMC); 444a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 445a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 446a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 447a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 448a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dqua %0, %1, %2, 0" : "=f" (f18) : "f" (f14), "f" (f16)); 449a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 450a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 451a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dqua %0, %1, %2, 1" : "=f" (f18) : "f" (f14), "f" (f16)); 452a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 453a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 454a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dqua %0, %1, %2, 2" : "=f" (f18) : "f" (f14), "f" (f16)); 455a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 456a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 457a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dqua %0, %1, %2, 3" : "=f" (f18) : "f" (f14), "f" (f16)); 458a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 459a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 460a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 461a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 462a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 463a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 464a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dquaq(int x __attribute__((unused)), int RMC) 465a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 466a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3) { 467a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid input to asm test: a=%d\n", RMC); 468a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 469a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 470a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 471a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 472a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaq %0, %1, %2, 0" : "=f" (f18) : "f" (f14), "f" (f16)); 473a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 474a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 475a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaq %0, %1, %2, 1" : "=f" (f18) : "f" (f14), "f" (f16)); 476a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 477a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 478a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaq %0, %1, %2, 2" : "=f" (f18) : "f" (f14), "f" (f16)); 479a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 480a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 481a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaq %0, %1, %2, 3" : "=f" (f18) : "f" (f14), "f" (f16)); 482a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 483a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 484a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 485a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 486a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 487a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 488a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic int TE_vals[] = { -16, -2, 0, 5}; 489a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define TE_VAL_LEN sizeof(TE_vals)/sizeof(int) 490a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic Bool __is_TE_val(int x) 491a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 492a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i; 493a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < TE_VAL_LEN; i++) { 494a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (x==TE_vals[i]) 495a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return True; 496a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 497a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return False; 498a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 499a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 500a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dquai(int TE, int RMC) 501a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 502a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3 || !__is_TE_val(TE)) { 503a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", TE, RMC); 504a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 505a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 506a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 507a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 508a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 509a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 510a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -16, %0, %1, 0" : "=f" (f18) : "f" (f16)); 511a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 512a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 513a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -2, %0, %1, 0" : "=f" (f18) : "f" (f16)); 514a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 515a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 516a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 0, %0, %1, 0" : "=f" (f18) : "f" (f16)); 517a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 518a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 519a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 5, %0, %1, 0" : "=f" (f18) : "f" (f16)); 520a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 521a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 522a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 523a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 524a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 525a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 526a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 527a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 528a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -16, %0, %1, 1" : "=f" (f18) : "f" (f16)); 529a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 530a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 531a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -2, %0, %1, 1" : "=f" (f18) : "f" (f16)); 532a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 533a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 534a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 0, %0, %1, 1" : "=f" (f18) : "f" (f16)); 535a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 536a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 537a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 5, %0, %1, 1" : "=f" (f18) : "f" (f16)); 538a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 539a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 540a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 541a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 542a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 543a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 544a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 545a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 546a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -16, %0, %1, 2" : "=f" (f18) : "f" (f16)); 547a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 548a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 549a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -2, %0, %1, 2" : "=f" (f18) : "f" (f16)); 550a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 551a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 552a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 0, %0, %1, 2" : "=f" (f18) : "f" (f16)); 553a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 554a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 555a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 5, %0, %1, 2" : "=f" (f18) : "f" (f16)); 556a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 557a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 558a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 559a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 560a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 561a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 562a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 563a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 564a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -16, %0, %1, 3" : "=f" (f18) : "f" (f16)); 565a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 566a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 567a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai -2, %0, %1, 3" : "=f" (f18) : "f" (f16)); 568a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 569a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 570a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 0, %0, %1, 3" : "=f" (f18) : "f" (f16)); 571a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 572a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 573a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquai 5, %0, %1, 3" : "=f" (f18) : "f" (f16)); 574a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 575a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 576a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 577a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 578a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 579a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 580a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 581a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 582a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 583a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 584a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void _test_dquaiq(int TE, int RMC) 585a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 586a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (RMC < 0 || RMC > 3 || !__is_TE_val(TE)) { 587a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes fprintf(stderr, "Invalid inputs to asm test: a=%d, b=%d\n", TE, RMC); 588a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return; 589a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 590a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (RMC) { 591a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 592a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 593a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 594a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -16, %0, %1, 0" : "=f" (f18) : "f" (f16)); 595a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 596a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 597a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -2, %0, %1, 0" : "=f" (f18) : "f" (f16)); 598a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 599a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 600a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 0, %0, %1, 0" : "=f" (f18) : "f" (f16)); 601a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 602a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 603a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 5, %0, %1, 0" : "=f" (f18) : "f" (f16)); 604a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 605a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 606a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 607a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 608a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 609a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 1: 610a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 611a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 612a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -16, %0, %1, 1" : "=f" (f18) : "f" (f16)); 613a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 614a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 615a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -2, %0, %1, 1" : "=f" (f18) : "f" (f16)); 616a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 617a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 618a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 0, %0, %1, 1" : "=f" (f18) : "f" (f16)); 619a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 620a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 621a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 5, %0, %1, 1" : "=f" (f18) : "f" (f16)); 622a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 623a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 624a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 625a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 626a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 627a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 2: 628a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 629a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 630a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -16, %0, %1, 2" : "=f" (f18) : "f" (f16)); 631a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 632a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 633a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -2, %0, %1, 2" : "=f" (f18) : "f" (f16)); 634a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 635a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 636a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 0, %0, %1, 2" : "=f" (f18) : "f" (f16)); 637a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 638a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 639a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 5, %0, %1, 2" : "=f" (f18) : "f" (f16)); 640a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 641a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 642a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 643a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 644a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 645a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 3: 646a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes switch (TE) { 647a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -16: 648a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -16, %0, %1, 3" : "=f" (f18) : "f" (f16)); 649a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 650a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case -2: 651a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq -2, %0, %1, 3" : "=f" (f18) : "f" (f16)); 652a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 653a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 0: 654a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 0, %0, %1, 3" : "=f" (f18) : "f" (f16)); 655a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 656a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes case 5: 657a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes __asm__ __volatile__ ("dquaiq 5, %0, %1, 3" : "=f" (f18) : "f" (f16)); 658a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 659a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 660a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 661a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 662a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 663a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes default: 664a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes break; 665a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 666a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 667a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 668a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 669a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef void (*test_func_t)(int a, int b); 670a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef void (*test_driver_func_t)(void); 671a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct test_table 672a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 673a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_driver_func_t test_category; 674a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes char * name; 675a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} test_table_t; 676a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 677a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* 678a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 345.0DD (0x2207c00000000000 0xe50) 679a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 1.2300e+5DD (0x2207c00000000000 0x14c000) 680a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * -16.0DD (0xa207c00000000000 0xe0) 681a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 0.00189DD (0x2206c00000000000 0xcf) 682a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * -4.1235DD (0xa205c00000000000 0x10a395bcf) 683a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 9.8399e+20DD (0x2209400000000000 0x253f1f534acdd4) 684a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 0DD (0x2208000000000000 0x0) 685a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 0DD (0x2208000000000000 0x0) 686a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * infDD (0x7800000000000000 0x0) 687a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * nanDD (0x7c00000000000000 0x0 688a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 689a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic unsigned long long dfp128_vals[] = { 690a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // Some finite numbers 691a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2207c00000000000ULL, 0x0000000000000e50ULL, 692a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2207c00000000000ULL, 0x000000000014c000ULL, 693a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa207c00000000000ULL, 0x00000000000000e0ULL, 694a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2206c00000000000ULL, 0x00000000000000cfULL, 695a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa205c00000000000ULL, 0x000000010a395bcfULL, 696a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x6209400000fd0000ULL, 0x00253f1f534acdd4ULL, // huge number 697a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x000400000089b000ULL, 0x0a6000d000000049ULL, // very small number 698a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of zero 699a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2208000000000000ULL, 0x0000000000000000ULL, 700a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa208000000000000ULL, 0x0000000000000000ULL, // negative 701a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa248000000000000ULL, 0x0000000000000000ULL, 702a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of NAN 703a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7c00000000000000ULL, 0x0000000000000000ULL, // quiet 704a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xfc00000000000000ULL, 0xc00100035b007700ULL, 705a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling 706a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of Infinity 707a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7800000000000000ULL, 0x0000000000000000ULL, 708a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xf800000000000000ULL, 0x0000000000000000ULL, // negative 709a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xf900000000000000ULL, 0x0000000000000000ULL 710a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 711a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 712a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic unsigned long long dfp64_vals[] = { 713a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // various finite numbers 714a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2234000000000e50ULL, 715a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x223400000014c000ULL, 716a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa2340000000000e0ULL,// negative 717a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x22240000000000cfULL, 718a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa21400010a395bcfULL,// negative 719a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x6e4d3f1f534acdd4ULL,// huge number 720a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x000400000089b000ULL,// very small number 721a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of zero 722a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x2238000000000000ULL, 723a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xa238000000000000ULL, 724a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x4248000000000000ULL, 725a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of NAN 726a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7e34000000000111ULL, 727a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xfe000000d0e0a0d0ULL,//signaling 728a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xfc00000000000000ULL,//quiet 729a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // flavors of Infinity 730a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7800000000000000ULL, 731a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0xf800000000000000ULL,//negative 732a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 0x7a34000000000000ULL, 733a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 734a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 735a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// Both Long and Quad arrays of DFP values should have the same length. 736a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// If that length is changed, t 737a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NUM_DFP_VALS (sizeof(dfp64_vals)/8) 738a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 739a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct dfp_test_args { 740a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int fra_idx; 741a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int frb_idx; 742a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_test_args_t; 743a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 744a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 745a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes// Index pairs from dfp64_vals array to be used with dfp_two_arg_tests 746a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_test_args_t dfp_2args_x1[] = { 747a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {0, 1}, 748a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {2, 1}, 749a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {3, 4}, 750a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {0, 6}, 751a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {2, 4}, 752a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {5, 1}, 753a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {5, 2}, 754a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {7, 1}, 755a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {7, 2}, 756a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {8, 0}, 757a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {8, 1}, 758a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {8, 2}, 759a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {7, 8}, 760a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 14}, 761a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 1}, 762a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 13}, 763a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 12}, 764a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {12, 11}, 765a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 14}, 766a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 0}, 767a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 13}, 768a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {11, 11}, 769a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {14, 14}, 770a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {14, 3}, 771a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes {14, 15}, 772a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 773a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 774a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef enum { 775a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes LONG_TEST, 776a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes QUAD_TEST 777a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} precision_type_t; 778a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 779a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct dfp_test 780a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 781a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t test_func; 782a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * name; 783a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_test_args_t * targs; 784a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int num_tests; 785a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes precision_type_t precision; 786a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * op; 787a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_test_t; 788a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 789a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughestypedef struct dfp_one_arg_test 790a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 791a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t test_func; 792a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * name; 793a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes precision_type_t precision; 794a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes const char * op; 795a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} dfp_one_arg_test_t; 796a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 797a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 798a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_one_arg_test_t 799a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_quai_tests[] = { 800a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dquai, "dquai", LONG_TEST, "[QI]"}, 801a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dquaiq, "dquaiq", QUAD_TEST, "[QI]"}, 802a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, 0, NULL} 803a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 804a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 805a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_quai_ops(void) 806a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 807a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t func; 808a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u0, u0x; 809a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double res, d0, *d0p, d0x, *d0xp; 810a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 811a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 812a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = u0x = 0; 813a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0p = &d0; 814a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0xp = &d0x; 815a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 816a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_quai_tests[k].test_func)) { 817a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i; 818a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_one_arg_test_t test_def = dfp_quai_tests[k]; 819a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 820a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NUM_DFP_VALS; i++) { 821a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int TE, RMC; 822a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 823a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 824a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp64_vals[i]; 825a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 826a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp128_vals[i * 2]; 827a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = dfp128_vals[(i * 2) + 1]; 828a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 829a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0p = u0; 830a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f16 = d0; 831a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 832a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0xp = u0x; 833a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f17 = d0x; 834a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 835a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 836a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (TE = 0; TE < TE_VAL_LEN; TE++) { 837a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (RMC = 0; RMC < 4; RMC++) { 838a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(TE_vals[TE], RMC); 839a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes res = f18; 840a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s (RMC=%2d, TE=%3d) %s %016llx", test_def.name, RMC, 841a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes TE_vals[TE], test_def.op, u0); 842a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 843a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" => %016llx\n", 844a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res))); 845a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 846a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double resx = f19; 847a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" %016llx ==> %016llx %016llx\n", 848a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x, *((unsigned long long *)(&res)), *((unsigned long long *)(&resx))); 849a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 850a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 851a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 852a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 853a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 854a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 855a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 856a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 857a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 858a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 859a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_test_t 860a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_qua_tests[] = { 861a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dqua, "dqua", dfp_2args_x1, 25, LONG_TEST, "[Q]"}, 862a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dquaq, "dquaq", dfp_2args_x1, 25, QUAD_TEST, "[Q]"}, 863a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, NULL, 0, 0, NULL} 864a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 865a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 866a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_qua_ops(void) 867a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 868a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t func; 869a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u0, u0x, u1, u1x; 870a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double res, d0, d1, *d0p, *d1p; 871a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double d0x, d1x, *d0xp, *d1xp; 872a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 873a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = u1x = 0; 874a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0p = &d0; 875a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0xp = &d0x; 876a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d1p = &d1; 877a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d1xp = &d1x; 878a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 879a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_qua_tests[k].test_func)) { 880a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i, RMC; 881a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_test_t test_def = dfp_qua_tests[k]; 882a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 883a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < test_def.num_tests; i++) { 884a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 885a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp64_vals[test_def.targs[i].fra_idx]; 886a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u1 = dfp64_vals[test_def.targs[i].frb_idx]; 887a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 888a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp128_vals[test_def.targs[i].fra_idx * 2]; 889a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = dfp128_vals[(test_def.targs[i].fra_idx * 2) + 1]; 890a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u1 = dfp128_vals[test_def.targs[i].frb_idx * 2]; 891a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u1x = dfp128_vals[(test_def.targs[i].frb_idx * 2) + 1]; 892a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 893a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0p = u0; 894a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d1p = u1; 895a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f14 = d0; 896a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f16 = d1; 897a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 898a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0xp = u0x; 899a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d1xp = u1x; 900a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f15 = d0x; 901a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f17 = d1x; 902a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 903a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (RMC = 0; RMC < 4; RMC++) { 904a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(-1, RMC); 905a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes res = f18; 906a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s (RMC=%2d) %s %016llx", test_def.name, RMC, test_def.op, u0); 907a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 908a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(", %016llx => %016llx\n", u1, *((unsigned long long *)(&res))); 909a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 910a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double resx = f19; 911a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" %016llx, %016llx %016llx ==> %016llx %016llx\n",u0x, u1, u1x, 912a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res)), *((unsigned long long *)(&resx))); 913a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 914a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 915a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 916a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 917a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 918a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 919a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 920a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 921a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 922a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_one_arg_test_t 923a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_rrnd_tests[] = { 924a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_drrnd, "drrnd", LONG_TEST, "[RR]"}, 925a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_drrndq, "drrndq", QUAD_TEST, "[RR]"}, 926a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, 0, NULL} 927a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 928a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 929a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_rrnd_ops(void) 930a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 931a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t func; 932a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u0, u0x; 933a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double res, d0, *d0p, d0x, *d0xp, reference_sig, *reference_sig_p; 934a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes long long reference_sig_vals[] = {0ULL, 2ULL, 6ULL, 63ULL}; 935a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int num_reference_sig_vals = sizeof(reference_sig_vals)/sizeof(long long); 936a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 937a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 938a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = u0x = 0; 939a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0p = &d0; 940a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0xp = &d0x; 941a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes reference_sig_p = &reference_sig; 942a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 943a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_rrnd_tests[k].test_func)) { 944a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i, j; 945a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_one_arg_test_t test_def = dfp_rrnd_tests[k]; 946a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 947a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NUM_DFP_VALS; i++) { 948a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int RMC; 949a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 950a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 951a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp64_vals[i]; 952a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 953a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp128_vals[i * 2]; 954a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = dfp128_vals[(i * 2) + 1]; 955a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 956a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0p = u0; 957a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f16 = d0; 958a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 959a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0xp = u0x; 960a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f17 = d0x; 961a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 962a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 963a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (j = 0; j < num_reference_sig_vals; j++) { 964a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(long long *)reference_sig_p = reference_sig_vals[j]; 965a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f14 = reference_sig; 966a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (RMC = 0; RMC < 4; RMC++) { 967a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(-1, RMC); 968a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes res = f18; 969a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s (RMC=%d, ref sig=%d) %s%016llx", test_def.name, RMC, 970a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (int)reference_sig_vals[j], test_def.op, u0); 971a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 972a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" => %016llx\n", 973a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res))); 974a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 975a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double resx = f19; 976a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" %016llx ==> %016llx %016llx\n", 977a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x, *((unsigned long long *)(&res)), *((unsigned long long *)(&resx))); 978a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 979a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 980a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 981a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 982a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 983a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 984a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 985a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 986a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 987a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 988a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_one_arg_test_t 989a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_xiex_tests[] = { 990a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_diex, "diex", LONG_TEST, ">>"}, 991a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_diexq, "diexq", QUAD_TEST, ">>"}, 992a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dxex, "dxex", LONG_TEST, "<<"}, 993a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dxexq, "dxexq", QUAD_TEST, "<<"}, 994a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, 0, NULL} 995a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 996a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 997a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_xiex_ops(void) 998a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 999a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t func; 1000a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u0, u0x; 1001a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double res, d0, *d0p, d0x, *d0xp, target_exp, *target_exp_p; 1002a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* The first two positions are placeholders and will be filled in later, 1003a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * based on the precision of the DFP argument. 1004a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 1005a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes long long target_exp_vals[] = {0ULL, 0ULL, 0ULL, -1ULL, -2ULL, -3ULL, -4ULL, -5ULL}; 1006a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int num_exp_vals = sizeof(target_exp_vals)/sizeof(long long); 1007a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 1008a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = u0x = 0; 1009a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0p = &d0; 1010a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0xp = &d0x; 1011a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes target_exp_p = &target_exp; 1012a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1013a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_xiex_tests[k].test_func)) { 1014a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i; 1015a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes Bool insert_insn = False; 1016a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_one_arg_test_t test_def = dfp_xiex_tests[k]; 1017a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1018a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (!strncmp(test_def.name, "di", 2)) 1019a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes insert_insn = True; 1020a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1021a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 1022a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes target_exp_vals[0] = 12288ULL; // > max biased exponent 1023a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes target_exp_vals[1] = 5235ULL; 1024a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1025a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes target_exp_vals[0] = 768ULL; // > max biased exponent 1026a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes target_exp_vals[1] = 355ULL; 1027a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1028a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1029a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NUM_DFP_VALS; i++) { 1030a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int j; 1031a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1032a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 1033a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp128_vals[i * 2]; 1034a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = dfp128_vals[(i * 2) + 1]; 1035a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1036a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp64_vals[i]; 1037a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1038a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0p = u0; 1039a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f16 = d0; 1040a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 1041a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0xp = u0x; 1042a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f17 = d0x; 1043a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1044a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1045a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (!insert_insn) { 1046a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // This is just for extract insns (dexex[q]) 1047a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(0, 0); 1048a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes res = f18; 1049a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s %s ", test_def.name, test_def.op); 1050a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 1051a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx => %016llx\n", u0, 1052a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res))); 1053a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1054a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double resx = f19; 1055a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx %016llx ==> %016llx %016llx\n", u0, u0x, 1056a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res)), *((unsigned long long *)(&resx))); 1057a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1058a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes continue; 1059a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1060a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // The following for-loop is just for insert insns (diex[q]) 1061a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (j = 0; j < num_exp_vals; j++) { 1062a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(long long *)target_exp_p = target_exp_vals[j]; 1063a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f14 = target_exp; 1064a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(0, 0); 1065a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes res = f18; 1066a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s %s %5d, ", test_def.name, test_def.op, (int)target_exp_vals[j]); 1067a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1068a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 1069a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx => %016llx\n", u0, 1070a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res))); 1071a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1072a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double resx = f19; 1073a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%016llx %016llx ==> %016llx %016llx\n", u0, u0x, 1074a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res)), *((unsigned long long *)(&resx))); 1075a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1076a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1077a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1078a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 1079a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 1080a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1081a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 1082a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1083a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_one_arg_test_t 1084a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_rint_tests[] = { 1085a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_drintn, "drintn", LONG_TEST, "~"}, 1086a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_drintnq, "drintnq", QUAD_TEST, "~"}, 1087a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_drintx, "drintx", LONG_TEST, "~"}, 1088a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_drintxq, "drintxq", QUAD_TEST, "~"}, 1089a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, 0, NULL} 1090a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 1091a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1092a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_rint_ops(void) 1093a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 1094a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t func; 1095a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u0, u0x; 1096a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double res, d0, *d0p, d0x, *d0xp; 1097a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0; 1098a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = u0x = 0; 1099a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0p = &d0; 1100a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0xp = &d0x; 1101a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1102a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_rint_tests[k].test_func)) { 1103a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i; 1104a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_one_arg_test_t test_def = dfp_rint_tests[k]; 1105a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1106a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NUM_DFP_VALS; i++) { 1107a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int R, RMC; 1108a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1109a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 1110a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp64_vals[i]; 1111a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1112a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp128_vals[i * 2]; 1113a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = dfp128_vals[(i * 2) + 1]; 1114a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1115a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0p = u0; 1116a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f16 = d0; 1117a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 1118a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0xp = u0x; 1119a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f17 = d0x; 1120a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1121a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1122a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (R = 0; R < 2; R++) { 1123a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (RMC = 0; RMC < 4; RMC++) { 1124a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(R, RMC); 1125a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes res = f18; 1126a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s (RM=%d) %s%016llx", test_def.name, (RMC + (R << 2)), test_def.op, u0); 1127a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 1128a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" => %016llx\n", 1129a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *((unsigned long long *)(&res))); 1130a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1131a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double resx = f19; 1132a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" %016llx ==> %016llx %016llx\n", 1133a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x, *((unsigned long long *)(&res)), *((unsigned long long *)(&resx))); 1134a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1135a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1136a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1137a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1138a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 1139a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 1140a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1141a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 1142a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1143a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic dfp_test_t 1144a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesdfp_cmp_tests[] = { 1145a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dcmpo, "dcmpo", dfp_2args_x1, 25, LONG_TEST, "<>"}, 1146a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dcmpoq, "dcmpoq", dfp_2args_x1, 25, QUAD_TEST, "<>"}, 1147a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dcmpu, "dcmpu", dfp_2args_x1, 25, LONG_TEST, "<>"}, 1148a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &_test_dcmpuq, "dcmpuq", dfp_2args_x1, 25, QUAD_TEST, "<>"}, 1149a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL, NULL, 0, 0, NULL} 1150a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 1151a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1152a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void test_dfp_cmp_ops(void) 1153a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 1154a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_func_t func; 1155a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned long long u0, u0x, u1, u1x; 1156a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double d0, d1, *d0p, *d1p; 1157a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes double d0x, d1x, *d0xp, *d1xp; 1158a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes /* BF is a 3-bit instruction field that indicates the CR field in which the 1159a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * result of the compare should be placed. We won't iterate through all 1160a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * 8 possible BF values since storing compare results to a given field is 1161a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * a well-tested mechanism in VEX. But we will test two BF values, just as 1162a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes * a sniff-test. 1163a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes */ 1164a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int k = 0, BF; 1165a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = u1x = 0; 1166a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0p = &d0; 1167a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d0xp = &d0x; 1168a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d1p = &d1; 1169a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes d1xp = &d1x; 1170a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1171a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = dfp_cmp_tests[k].test_func)) { 1172a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i, repeat = 1; 1173a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes dfp_test_t test_def = dfp_cmp_tests[k]; 1174a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes BF = 0; 1175a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1176a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesagain: 1177a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < test_def.num_tests; i++) { 1178a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int condreg; 1179a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes unsigned int flags; 1180a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1181a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 1182a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp64_vals[test_def.targs[i].fra_idx]; 1183a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u1 = dfp64_vals[test_def.targs[i].frb_idx]; 1184a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1185a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0 = dfp128_vals[test_def.targs[i].fra_idx * 2]; 1186a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x = dfp128_vals[(test_def.targs[i].fra_idx * 2) + 1]; 1187a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u1 = dfp128_vals[test_def.targs[i].frb_idx * 2]; 1188a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u1x = dfp128_vals[(test_def.targs[i].frb_idx * 2) + 1]; 1189a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1190a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0p = u0; 1191a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d1p = u1; 1192a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f14 = d0; 1193a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f16 = d1; 1194a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == QUAD_TEST) { 1195a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d0xp = u0x; 1196a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes *(unsigned long long *)d1xp = u1x; 1197a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f15 = d0x; 1198a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes f17 = d1x; 1199a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1200a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1201a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_FPSCR_ZERO; 1202a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes SET_CR_XER_ZERO; 1203a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(BF, 0); 1204a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes GET_CR(flags); 1205a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1206a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes condreg = ((flags >> (4 * (7-BF)))) & 0xf; 1207a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf("%s %016llx", test_def.name, u0); 1208a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (test_def.precision == LONG_TEST) { 1209a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" %s %016llx => %x (BF=%d)\n", 1210a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_def.op, u1, condreg, BF); 1211a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } else { 1212a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf(" %016llx %s %016llx %016llx ==> %x (BF=%d)\n", 1213a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes u0x, test_def.op, u1, u1x, 1214a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes condreg, BF); 1215a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1216a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1217a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes if (repeat) { 1218a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes repeat = 0; 1219a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes BF = 5; 1220a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes goto again; 1221a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1222a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes k++; 1223a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "\n" ); 1224a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1225a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 1226a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1227a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1228a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic test_table_t 1229a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes all_tests[] = 1230a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes{ 1231a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_cmp_ops, 1232a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP compare instructions"}, 1233a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_rint_ops, 1234a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP round instructions"}, 1235a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_xiex_ops, 1236a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP insert/extract instructions"}, 1237a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_rrnd_ops, 1238a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP reround instructions"}, 1239a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_qua_ops, 1240a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP quantize instructions"}, 1241a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { &test_dfp_quai_ops, 1242a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes "Test DFP quantize immediate instructions"}, 1243a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes { NULL, NULL } 1244a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}; 1245a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#endif // HAS_DFP 1246a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1247a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesint main() { 1248a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#if defined(HAS_DFP) 1249a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1250a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_table_t aTest; 1251a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes test_driver_func_t func; 1252a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes int i = 0; 1253a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1254a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes while ((func = all_tests[i].test_category)) { 1255a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes aTest = all_tests[i]; 1256a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes printf( "%s\n", aTest.name ); 1257a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes (*func)(); 1258a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes i++; 1259a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes } 1260a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 1261a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#endif // HAS_DFP 1262a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes return 0; 1263a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes} 1264