1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Copyright (C) 2011 IBM 2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Author: Maynard Johnson <maynardj@us.ibm.com> 4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is free software; you can redistribute it and/or 6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng modify it under the terms of the GNU General Public License as 7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng published by the Free Software Foundation; either version 2 of the 8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng License, or (at your option) any later version. 9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng This program is distributed in the hope that it will be useful, but 11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng WITHOUT ANY WARRANTY; without even the implied warranty of 12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng General Public License for more details. 14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng You should have received a copy of the GNU General Public License 16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng along with this program; if not, write to the Free Software 17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 02111-1307, USA. 19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng The GNU General Public License is contained in the file COPYING. 21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef HAS_VSX 24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h> 26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h> 27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdlib.h> 28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <string.h> 29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <malloc.h> 30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <altivec.h> 31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <math.h> 32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifndef __powerpc64__ 34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef uint32_t HWord_t; 35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else 36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef uint64_t HWord_t; 37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif /* __powerpc64__ */ 38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef unsigned char Bool; 40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define True 1 41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define False 0 42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r14 __asm__ ("r14"); 43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r15 __asm__ ("r15"); 44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r16 __asm__ ("r16"); 45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister HWord_t r17 __asm__ ("r17"); 46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f14 __asm__ ("fr14"); 47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f15 __asm__ ("fr15"); 48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f16 __asm__ ("fr16"); 49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengregister double f17 __asm__ ("fr17"); 50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic volatile unsigned int div_flags, div_xer; 52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_CR(_arg) \ 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR ); 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_XER(_arg) \ 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" ); 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_CR(_lval) \ 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("mfcr %0" : "=b"(_lval) ) 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_XER(_lval) \ 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) ) 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define GET_CR_XER(_lval_cr,_lval_xer) \ 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0) 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_CR_ZERO \ 71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR(0) 72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_XER_ZERO \ 74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_XER(0) 75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_CR_XER_ZERO \ 77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do { SET_CR_ZERO; SET_XER_ZERO; } while (0) 78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SET_FPSCR_ZERO \ 80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do { double _d = 0.0; \ 81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \ 82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } while (0) 83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef void (*test_func_t)(void); 86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct test_table test_table_t; 87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* These functions below that construct a table of floating point 90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * values were lifted from none/tests/ppc32/jm-insns.c. 91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (DEBUG_ARGS_BUILD) 94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0) 95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#else 96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define AB_DPRINTF(fmt, args...) do { } while (0) 97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic inline void register_farg (void *farg, 100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int s, uint16_t _exp, uint64_t mant) 101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t tmp; 103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant; 105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *(uint64_t *)farg = tmp; 106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng AB_DPRINTF("%d %03x %013llx => %016llx %0e\n", 107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s, _exp, mant, *(uint64_t *)farg, *(double *)farg); 108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic inline void register_sp_farg (void *farg, 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int s, uint16_t _exp, uint32_t mant) 112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uint32_t tmp; 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov tmp = ((uint32_t)s << 31) | ((uint32_t)_exp << 23) | mant; 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov *(uint32_t *)farg = tmp; 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct fp_test_args { 119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int fra_idx; 120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int frb_idx; 121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} fp_test_args_t; 122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengfp_test_args_t fp_cmp_tests[] = { 125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 8}, 126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 14}, 127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 6}, 128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 5}, 129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 4}, 130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 7}, 131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 9}, 132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 11}, 133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 8}, 134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 14}, 135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 6}, 136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 5}, 137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 4}, 138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 7}, 139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 9}, 140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 11}, 141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 8}, 142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 14}, 143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 6}, 144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 5}, 145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 4}, 146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 7}, 147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 9}, 148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 11}, 149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 8}, 150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 14}, 151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 6}, 152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 5}, 153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 4}, 154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 7}, 155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 9}, 156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 11}, 157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 8}, 158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 14}, 159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 6}, 160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 5}, 161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 1}, 162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 7}, 163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 9}, 164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 11}, 165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 8}, 166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 14}, 167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 6}, 168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 5}, 169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 4}, 170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 7}, 171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 9}, 172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 11}, 173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 8}, 174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 14}, 175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 6}, 176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 5}, 177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 4}, 178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 7}, 179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 9}, 180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 10}, 181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 8}, 182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 14}, 183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 6}, 184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 5}, 185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {1, 1}, 186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {2, 2}, 187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {3, 3}, 188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 4}, 189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengfp_test_args_t two_arg_fp_tests[] = { 193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 8}, 194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 14}, 195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {15, 16}, 196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 5}, 197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 4}, 198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 7}, 199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 9}, 200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {8, 11}, 201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 8}, 202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 14}, 203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 6}, 204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 5}, 205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 4}, 206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 7}, 207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 9}, 208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {14, 11}, 209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 8}, 210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 14}, 211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 6}, 212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 5}, 213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 4}, 214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 7}, 215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 9}, 216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {6, 11}, 217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 8}, 218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 14}, 219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 6}, 220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 5}, 221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 4}, 222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 7}, 223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 9}, 224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {5, 11}, 225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 8}, 226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 14}, 227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 6}, 228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 5}, 229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 1}, 230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 7}, 231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 9}, 232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {4, 11}, 233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 8}, 234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 14}, 235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 6}, 236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 5}, 237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 4}, 238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 7}, 239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 9}, 240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {7, 11}, 241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 8}, 242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 14}, 243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 6}, 244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 5}, 245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 4}, 246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 7}, 247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 9}, 248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {10, 11}, 249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 8 }, 250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 14}, 251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {12, 6}, 252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {15, 16}, 253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {15, 16}, 254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {9, 11}, 255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {11, 11}, 256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng {11, 12} 257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic int nb_special_fargs; 261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic double * spec_fargs; 262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic float * spec_sp_fargs; 263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void build_special_fargs_table(void) 265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* 267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Entry Sign Exp fraction Special value 268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0 0 3fd 0x8000000000000ULL Positive finite number 269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1 0 404 0xf000000000000ULL ... 270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 2 0 001 0x8000000b77501ULL ... 271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3 0 7fe 0x800000000051bULL ... 272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4 0 012 0x3214569900000ULL ... 273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 5 0 000 0x0000000000000ULL +0.0 (+zero) 274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 6 1 000 0x0000000000000ULL -0.0 (-zero) 275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 7 0 7ff 0x0000000000000ULL +infinity 276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 8 1 7ff 0x0000000000000ULL -infinity 277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 9 0 7ff 0x7FFFFFFFFFFFFULL +SNaN 278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 10 1 7ff 0x7FFFFFFFFFFFFULL -SNaN 279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 11 0 7ff 0x8000000000000ULL +QNaN 280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 12 1 7ff 0x8000000000000ULL -QNaN 281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 13 1 000 0x8340000078000ULL Denormalized val (zero exp and non-zero fraction) 282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 14 1 40d 0x0650f5a07b353ULL Negative finite number 283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 15 0 412 0x32585a9900000ULL A couple more positive finite numbers 284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 16 0 413 0x82511a2000000ULL ... 285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/ 286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t mant; 288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov uint32_t mant_sp; 289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint16_t _exp; 290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int s; 291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int j, i = 0; 292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (spec_fargs) 294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return; 295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng spec_fargs = malloc( 17 * sizeof(double) ); 297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng spec_sp_fargs = malloc( 17 * sizeof(float) ); 298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #0 300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x3fd; 302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x8000000000000ULL; 303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #1 306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x404; 308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0xf000000000000ULL; 309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* None of the ftdiv tests succeed. 312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * FRA = value #0; FRB = value #1 313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * ea_ = -2; e_b = 5 314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 100 315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /************************************************* 318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fe_flag tests 319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *************************************************/ 321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if FRA is a NaN 323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * FRA = value #9; FRB = value #1 324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 1024; e_b = 5 325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if FRB is a NaN 329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * FRA = value #1; FRB = value #12 330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 5; e_b = 1024 331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if e_b <= -1022 335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * FRA = value #0; FRB = value #2 336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = -2; e_b = -1022 337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #2 341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x001; 343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x8000000b77501ULL; 344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if e_b >= 1021 347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * FRA = value #1; FRB = value #3 348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 5; e_b = 1023 349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #3 352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7fe; 354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x800000000051bULL; 355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if FRA != 0 && e_a - e_b >= 1023 358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA = value #3 and FRB be value #0. 359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 1023; e_b = -2 360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if FRA != 0 && e_a - e_b <= -1023 364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA = value #0 above and FRB be value #3 above 365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = -2; e_b = 1023 366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fe_flag <- 1 if FRA != 0 && e_a <= -970 370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA = value #4 and FRB be value #0 371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = -1005; e_b = -2 372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 101 373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #4 375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x012; 377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x3214569900000ULL; 378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /************************************************* 381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fg_flag tests 382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *************************************************/ 384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fg_flag <- 1 if FRA is an Infinity 385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * NOTE: FRA = Inf also sets fe_flag 386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Do two tests, using values #7 and #8 (+/- Inf) for FRA. 387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Test 1: 388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA be value #7 and FRB be value #1 389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 1024; e_b = 5 390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 111 391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Test 2: 393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA be value #8 and FRB be value #1 394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 1024; e_b = 5 395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 111 396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fg_flag <- 1 if FRB is an Infinity 400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * NOTE: FRB = Inf also sets fe_flag 401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA be value #1 and FRB be value #7 402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = 5; e_b = 1024 403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 111 404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fg_flag <- 1 if FRB is denormalized 407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * NOTE: e_b < -1022 ==> fe_flag <- 1 408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA be value #0 and FRB be value #13 409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * e_a = -2; e_b = -1023 410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 111 411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fg_flag <- 1 if FRB is +zero 414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * NOTE: FRA = Inf also sets fe_flag 415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA = val #5; FRB = val #5 416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * ea_ = -1023; e_b = -1023 417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 111 418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* fg_flag <- 1 if FRB is -zero 421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * NOTE: FRA = Inf also sets fe_flag 422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Let FRA = val #5; FRB = val #6 423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * ea_ = -1023; e_b = -1023 424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * fl_flag || fg_flag || fe_flag = 111 425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Special values */ 428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* +0.0 : 0 0x000 0x0000000000000 */ 429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #5 430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x000; 432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x0000000000000ULL; 433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* -0.0 : 1 0x000 0x0000000000000 */ 436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #6 437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 1; 438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x000; 439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x0000000000000ULL; 440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* +infinity : 0 0x7FF 0x0000000000000 */ 443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #7 444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7FF; 446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x0000000000000ULL; 447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* -infinity : 1 0x7FF 0x0000000000000 */ 450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #8 451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 1; 452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7FF; 453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x0000000000000ULL; 454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* 457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * This comment applies to values #9 and #10 below: 458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * When src is a SNaN, it's converted to a QNaN first before rounding to single-precision, 459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * so we can't just copy the double-precision value to the corresponding slot in the 460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * single-precision array (i.e., in the loop at the end of this function). Instead, we 461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * have to manually set the bits using register_sp_farg(). 462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov */ 463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* +SNaN : 0 0x7FF 0x7FFFFFFFFFFFF */ 465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #9 466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7FF; 468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x7FFFFFFFFFFFFULL; 469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov _exp = 0xff; 471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mant_sp = 0x3FFFFF; 472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register_sp_farg(&spec_sp_fargs[i-1], s, _exp, mant_sp); 473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* -SNaN : 1 0x7FF 0x7FFFFFFFFFFFF */ 475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #10 476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 1; 477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7FF; 478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x7FFFFFFFFFFFFULL; 479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov _exp = 0xff; 481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov mant_sp = 0x3FFFFF; 482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov register_sp_farg(&spec_sp_fargs[i-1], s, _exp, mant_sp); 483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* +QNaN : 0 0x7FF 0x8000000000000 */ 485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #11 486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7FF; 488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x8000000000000ULL; 489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* -QNaN : 1 0x7FF 0x8000000000000 */ 492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #12 493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 1; 494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x7FF; 495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x8000000000000ULL; 496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* denormalized value */ 499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #13 500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 1; 501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x000; 502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x8340000078000ULL; 503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Negative finite number */ 506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #14 507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 1; 508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x40d; 509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x0650f5a07b353ULL; 510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* A couple positive finite numbers ... */ 513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #15 514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x412; 516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x32585a9900000ULL; 517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // #16 520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng s = 0; 521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _exp = 0x413; 522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng mant = 0x82511a2000000ULL; 523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng register_farg(&spec_fargs[i++], s, _exp, mant); 524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng nb_special_fargs = i; 526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (j = 0; j < i; j++) { 527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (!(j == 9 || j == 10)) 528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov spec_sp_fargs[j] = spec_fargs[j]; 529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstruct test_table 534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t test_category; 536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng char * name; 537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum { 540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SINGLE_TEST, 541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng DOUBLE_TEST 542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} precision_type_t; 543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum { 545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VX_SCALAR_FP_NMSUB = 0, 546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // ALL VECTOR-TYPE OPS SHOULD BE ADDED AFTER THIS LINE 547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VX_VECTOR_FP_MULT_AND_OP2 = 10, 548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // and before this line 549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VX_BASIC_CMP = 30, 550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VX_CONV_WORD, 551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng VX_DEFAULT 552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} vx_fp_test_type; 553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct vx_fp_test 555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t test_func; 557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng const char * name; 558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fp_test_args_t * targs; 559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int num_tests; 560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng precision_type_t precision; 561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_type type; 562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng const char * op; 563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} vx_fp_test_t; 564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vector unsigned int vec_out, vec_inA, vec_inB, vec_inC; 566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_dot; 568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpeqdp(void) 569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpeqdp. %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpeqdp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgedp(void) 577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgedp. %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgedp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgtdp(void) 585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgtdp. %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgtdp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpeqsp(void) 593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpeqsp. %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpeqsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgesp(void) 601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgesp. %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgesp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcmpgtsp(void) 609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgtsp. %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcmpgtsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_aXp; 617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_dp; 618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsnmsub(void) 619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_aXp) 621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xsnmsubadp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xsnmsubmdp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmadd(void) 627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_aXp) 629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmaddadp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmaddasp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmaddmdp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmaddmsp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvnmadd(void) 641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_aXp) 643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmaddadp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmaddasp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmaddmdp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmaddmsp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvnmsub(void) 655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_aXp) 657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmsubadp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmsubasp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmsubmdp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvnmsubmsp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmsub(void) 669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_aXp) 671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmsubadp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmsubasp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmsubmdp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmsubmsp %x0, %x1, %x2" : "+wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xssqrtdp(void) 683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xssqrtdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsrdpim(void) 688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xsrdpim %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsrdpip(void) 693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xsrdpip %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xstdivdp(void) 698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xstdivdp 6, %x0, %x1" : : "wa" (vec_inA), "wa" (vec_inB)); 700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsmaxdp(void) 703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xsmaxdp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xsmindp(void) 708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xsmindp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvadddp(void) 713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvadddp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvaddsp(void) 718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvaddsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvdivdp(void) 723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvdivdp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvdivsp(void) 728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvdivsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmuldp(void) 733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmuldp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmulsp(void) 738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmulsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvsubdp(void) 743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvsubdp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmaxdp(void) 748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmaxdp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmindp(void) 753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmindp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvmaxsp(void) 758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvmaxsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvminsp(void) 763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvminsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvsubsp(void) 768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvsubsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvresp(void) 773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvresp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xxsel(void) 778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long * dst; 780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long xa[] = { 0xa12bc37de56f9708ULL, 0x3894c1fddeadbeefULL}; 781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long xb[] = { 0xfedc432124681235ULL, 0xf1e2d3c4e0057708ULL}; 782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long xc[] = { 0xffffffff01020304ULL, 0x128934bd00000000ULL}; 783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inA, xa, 16); 785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inB, xb, 16); 786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inC, xc, 16); 787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xxsel %x0, %x1, %x2, %x3" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB),"wa" (vec_inC)); 790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst = (unsigned long long *) &vec_out; 791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("xxsel %016llx,%016llx,%016llx => %016llx\n", xa[0], xb[0], xc[0], *dst); 792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst++; 793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("xxsel %016llx,%016llx,%016llx => %016llx\n", xa[1], xb[1], xc[1], *dst); 794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xxspltw(void) 798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int uim; 800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long * dst = NULL; 801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long xb[] = { 0xfedc432124681235ULL, 0xf1e2d3c4e0057708ULL}; 802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inB, xb, 16); 803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (uim = 0; uim < 4; uim++) { 805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (uim) { 806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 0: 807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xxspltw %x0, %x1, 0" : "=wa" (vec_out): "wa" (vec_inB)); 808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xxspltw %x0, %x1, 1" : "=wa" (vec_out): "wa" (vec_inB)); 811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 2: 813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xxspltw %x0, %x1, 2" : "=wa" (vec_out): "wa" (vec_inB)); 814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 3: 816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xxspltw %x0, %x1, 3" : "=wa" (vec_out): "wa" (vec_inB)); 817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst = (unsigned long long *) &vec_out; 820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("xxspltw 0x%016llx%016llx %d=> 0x%016llx", xb[0], xb[1], uim, *dst); 821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst++; 822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%016llx\n", *dst); 823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xscvdpsxws(void) 828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xscvdpsxws %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xscvdpuxds(void) 833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xscvdpuxds %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcpsgndp(void) 838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcpsgndp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcpsgnsp(void) 843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcpsgnsp %x0, %x1, %x2" : "=wa" (vec_out): "wa" (vec_inA),"wa" (vec_inB)); 845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcvdpsxws(void) 848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcvdpsxws %x0, %x1 " : "=wa" (vec_out): "wa" (vec_inB)); 850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_xvcvspsxws(void) 853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("xvcvspsxws %x0, %x1 " : "=wa" (vec_out): "wa" (vec_inB)); 855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t 858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_vector_one_fp_arg_tests[] = { 859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvresp, "xvresp", NULL, 16, SINGLE_TEST, VX_BASIC_CMP, "1/x"}, 860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcvdpsxws, "xvcvdpsxws", NULL, 16, DOUBLE_TEST, VX_CONV_WORD, "conv"}, 861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcvspsxws, "xvcvspsxws", NULL, 16, SINGLE_TEST, VX_CONV_WORD, "conv"}, 862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL, NULL, 0 , 0, 0, NULL} 863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t 866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_vector_fp_tests[] = { 867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcmpeqdp, "xvcmpeqdp", fp_cmp_tests, 64, DOUBLE_TEST, VX_BASIC_CMP, "eq"}, 868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcmpgedp, "xvcmpgedp", fp_cmp_tests, 64, DOUBLE_TEST, VX_BASIC_CMP, "ge"}, 869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcmpgtdp, "xvcmpgtdp", fp_cmp_tests, 64, DOUBLE_TEST, VX_BASIC_CMP, "gt"}, 870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcmpeqsp, "xvcmpeqsp", fp_cmp_tests, 64, SINGLE_TEST, VX_BASIC_CMP, "eq"}, 871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcmpgesp, "xvcmpgesp", fp_cmp_tests, 64, SINGLE_TEST, VX_BASIC_CMP, "ge"}, 872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcmpgtsp, "xvcmpgtsp", fp_cmp_tests, 64, SINGLE_TEST, VX_BASIC_CMP, "gt"}, 873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvadddp, "xvadddp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "+" }, 874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvaddsp, "xvaddsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "+" }, 875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvdivdp, "xvdivdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "/" }, 876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvdivsp, "xvdivsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "/" }, 877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmuldp, "xvmuldp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "*" }, 878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmulsp, "xvmulsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "*" }, 879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvsubdp, "xvsubdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "-" }, 880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvsubsp, "xvsubsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "-" }, 881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmaxdp, "xvmaxdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "@max@" }, 882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmindp, "xvmindp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "@min@" }, 883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmaxsp, "xvmaxsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "@max@" }, 884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvminsp, "xvminsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "@min@" }, 885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcpsgndp, "xvcpsgndp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, "+-cp"}, 886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvcpsgnsp, "xvcpsgnsp", two_arg_fp_tests, 64, SINGLE_TEST, VX_DEFAULT, "+-cp"}, 887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL, NULL, 0 , 0, 0, NULL} 888663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 889663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 891663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t 892663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_aORm_fp_tests[] = { 893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xsnmsub, "xsnmsub", two_arg_fp_tests, 64, DOUBLE_TEST, VX_SCALAR_FP_NMSUB, "!*-"}, 894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmadd, "xvmadd", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*+"}, 895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmadd, "xvmadd", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*+"}, 896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvnmadd, "xvnmadd", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*+"}, 897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvnmadd, "xvnmadd", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*+"}, 898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmsub, "xvmsub", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*-"}, 899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvmsub, "xvmsub", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "*-"}, 900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvnmsub, "xvnmsub", two_arg_fp_tests, 64, DOUBLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*-"}, 901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xvnmsub, "xvnmsub", two_arg_fp_tests, 64, SINGLE_TEST, VX_VECTOR_FP_MULT_AND_OP2, "!*-"}, 902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL, NULL, 0, 0, 0, NULL } 903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic vx_fp_test_t 906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvx_simple_scalar_fp_tests[] = { 907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xssqrtdp, "xssqrtdp", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL}, 908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xsrdpim, "xsrdpim", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL}, 909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xsrdpip, "xsrdpip", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL}, 910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xstdivdp, "xstdivdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, NULL}, 911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xsmaxdp, "xsmaxdp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, NULL}, 912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xsmindp, "xsmindp", two_arg_fp_tests, 64, DOUBLE_TEST, VX_DEFAULT, NULL}, 913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xscvdpsxws, "xscvdpsxws", NULL, 17, DOUBLE_TEST, VX_CONV_WORD, NULL}, 914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xscvdpuxds, "xscvdpuxds", NULL, 17, DOUBLE_TEST, VX_DEFAULT, NULL}, 915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL, NULL, 0, 0, 0, NULL } 916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__ 920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_bpermd(void) 921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* NOTE: Bit number is '0 . . . 63' 923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Permuted bits are generated bit 0 -7 as follows: 925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * index = (r14)8*i:8*i+7 926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * perm[i] = (r15)index 927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * So, for i = 0, index is (r14)8*0:8*0+7, or (r14)0:7, which is the MSB 929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * byte of r14, 0x1b(27/base 10). This identifies bit 27 of r15, which is '1'. 930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * For i = 1, index is 0x2c, identifying bit 44 of r15, which is '1'. 931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * So the result of the first two iterations of i are: 932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * perm = 0b01xxxxxx 933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * 934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r15 = 0xa12bc37de56f9708ULL; 936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r14 = 0x1b2c31f030000001ULL; 937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("bpermd %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("bpermd: 0x%016llx : 0x%016llx => 0x%llx\n", (unsigned long long)r14, 939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (unsigned long long)r15, (unsigned long long)r17); 940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool do_OE; 945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum { 946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng DIV_BASE = 1, 947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng DIV_OE = 2, 948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng DIV_DOT = 4, 949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} div_type_t; 950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Possible divde type combinations are: 951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * - base 952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * - base+dot 953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * - base+OE 954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * - base+OE+dot 955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__ 957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_divde(void) 958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int divde_type = DIV_BASE; 960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_OE) 961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng divde_type |= DIV_OE; 962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng divde_type |= DIV_DOT; 964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (divde_type) { 966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divde %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 3: 972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divdeo %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 5: 977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 978663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divde. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 979663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 981663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 7: 982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divdeo. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fprintf(stderr, "Invalid divde type. Exiting\n"); 988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng exit(1); 989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_divweu(void) 994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int divweu_type = DIV_BASE; 996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_OE) 997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng divweu_type |= DIV_OE; 998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng divweu_type |= DIV_DOT; 1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch (divweu_type) { 1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 1: 1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 1004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divweu %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 1005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 3: 1008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 1009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divweuo %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 1010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 1011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 5: 1013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 1014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divweu. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 1015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 1016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case 7: 1018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 1019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("divweuo. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 1020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR_XER(div_flags, div_xer); 1021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 1022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 1023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fprintf(stderr, "Invalid divweu type. Exiting\n"); 1024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng exit(1); 1025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctiduz(void) 1029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 1031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctiduz. %0, %1" : "=d" (f17) : "d" (f14)); 1032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctiduz %0, %1" : "=d" (f17) : "d" (f14)); 1034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctidu(void) 1037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 1039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctidu. %0, %1" : "=d" (f17) : "d" (f14)); 1040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctidu %0, %1" : "=d" (f17) : "d" (f14)); 1042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctiwuz(void) 1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctiwuz. %0, %1" : "=d" (f17) : "d" (f14)); 1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctiwuz %0, %1" : "=d" (f17) : "d" (f14)); 1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fctiwu(void) 1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dot) 1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctiwu. %0, %1" : "=d" (f17) : "d" (f14)); 1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("fctiwu %0, %1" : "=d" (f17) : "d" (f14)); 1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct simple_test { 1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t test_func; 1062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng char * name; 1063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng precision_type_t precision; 1064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} simple_test_t; 1065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic simple_test_t fct_tests[] = { 1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_fctiduz, "fctiduz", DOUBLE_TEST }, 1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_fctidu, "fctidu", DOUBLE_TEST }, 1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_fctiwuz, "fctiwuz", SINGLE_TEST }, 1070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_fctiwu, "fctiwu", SINGLE_TEST }, 1071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL } 1072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 1073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void setup_sp_fp_args(fp_test_args_t * targs, Bool swap_inputs) 1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int a_idx, b_idx, i; 1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * inA, * inB; 1078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * vec_src = swap_inputs ? &vec_out : &vec_inB; 1079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < 4; i++) { 1081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng a_idx = targs->fra_idx; 1082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng b_idx = targs->frb_idx; 1083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inA = (void *)&spec_sp_fargs[a_idx]; 1084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_sp_fargs[b_idx]; 1085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // copy single precision FP into vector element i 1086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(((void *)&vec_inA) + (i * 4), inA, 4); 1087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vec_src + (i * 4), inB, 4); 1088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng targs++; 1089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1090663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1091663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void setup_dp_fp_args(fp_test_args_t * targs, Bool swap_inputs) 1093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int a_idx, b_idx, i; 1095663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * inA, * inB; 1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * vec_src = swap_inputs ? (void *)&vec_out : (void *)&vec_inB; 1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < 2; i++) { 1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng a_idx = targs->fra_idx; 1100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng b_idx = targs->frb_idx; 1101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inA = (void *)&spec_fargs[a_idx]; 1102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_fargs[b_idx]; 1103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // copy double precision FP into vector element i 1104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(((void *)&vec_inA) + (i * 8), inA, 8); 1105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vec_src + (i * 8), inB, 8); 1106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng targs++; 1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define VX_NOT_CMP_OP 0xffffffff 1111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void print_vector_fp_result(unsigned int cc, vx_fp_test_t * test_group, int i) 1112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int a_idx, b_idx, k; 1114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng char * name = malloc(20); 1115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int dp = test_group->precision == DOUBLE_TEST ? 1 : 0; 1116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int loops = dp ? 2 : 4; 1117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fp_test_args_t * targs = &test_group->targs[i]; 1118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long * frA_dp, * frB_dp, * dst_dp; 1119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * frA_sp, *frB_sp, * dst_sp; 1120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcpy(name, test_group->name); 1121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s%s ", dp? i/2 : i/4, name, (do_dot ? "." : "")); 1122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (k = 0; k < loops; k++) { 1123663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng a_idx = targs->fra_idx; 1124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng b_idx = targs->frb_idx; 1125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (k) 1126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" AND "); 1127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) { 1128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frA_dp = (unsigned long long *)&spec_fargs[a_idx]; 1129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frB_dp = (unsigned long long *)&spec_fargs[b_idx]; 1130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%016llx %s %016llx", *frA_dp, test_group->op, *frB_dp); 1131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frA_sp = (unsigned int *)&spec_sp_fargs[a_idx]; 1133663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frB_sp = (unsigned int *)&spec_sp_fargs[b_idx]; 1134663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%08x %s %08x", *frA_sp, test_group->op, *frB_sp); 1135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1136663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng targs++; 1137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1138663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (cc != VX_NOT_CMP_OP) 1139663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" ? cc=%x", cc); 1140663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1141663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) { 1142663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst_dp = (unsigned long long *) &vec_out; 1143663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" => %016llx %016llx\n", dst_dp[0], dst_dp[1]); 1144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst_sp = (unsigned int *) &vec_out; 1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" => %08x %08x %08x %08x\n", dst_sp[0], dst_sp[1], dst_sp[2], dst_sp[3]); 1147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng free(name); 1149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void print_vx_aORm_fp_result(unsigned long long * XT_arg, unsigned long long * XB_arg, 1153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_t * test_group, int i) 1154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1155663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int a_idx, k; 1156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng char * name = malloc(20); 1157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int dp = test_group->precision == DOUBLE_TEST ? 1 : 0; 1158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int loops = dp ? 2 : 4; 1159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fp_test_args_t * targs = &test_group->targs[i]; 1160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long frA_dp, * dst_dp; 1161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int frA_sp, * dst_sp; 1162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcpy(name, test_group->name); 1164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_aXp) 1165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) 1166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcat(name, "adp"); 1167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcat(name, "asp"); 1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) 1171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcat(name, "mdp"); 1172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcat(name, "msp"); 1174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s ", dp? i/2 : i/4, name); 1176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (k = 0; k < loops; k++) { 1177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng a_idx = targs->fra_idx; 1178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (k) 1179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" AND "); 1180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) { 1181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frA_dp = *((unsigned long long *)&spec_fargs[a_idx]); 1182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s(%016llx,%016llx,%016llx)", test_group->op, XT_arg[k], frA_dp, XB_arg[k]); 1183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * xt_sp = (unsigned int *)XT_arg; 1185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * xb_sp = (unsigned int *)XB_arg; 1186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frA_sp = *((unsigned int *)&spec_sp_fargs[a_idx]); 1187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s(%08x,%08x,%08x)", test_group->op, xt_sp[k], frA_sp, xb_sp[k]); 1188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng targs++; 1190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) { 1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst_dp = (unsigned long long *) &vec_out; 1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" => %016llx %016llx\n", dst_dp[0], dst_dp[1]); 1195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst_sp = (unsigned int *) &vec_out; 1197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" => %08x %08x %08x %08x\n", dst_sp[0], dst_sp[1], dst_sp[2], dst_sp[3]); 1198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng free(name); 1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* This function currently only supports double precision input arguments. */ 1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_simple_scalar_fp_ops(void) 1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int k = 0; 1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng build_special_fargs_table(); 1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = vx_simple_scalar_fp_tests[k].test_func)) { 1210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long * frap, * frbp, * dst; 1211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * pv; 1212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int idx; 1213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_t test_group = vx_simple_scalar_fp_tests[k]; 1214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool convToWord = (test_group.type == VX_CONV_WORD); 1215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.precision != DOUBLE_TEST) { 1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fprintf(stderr, "Unsupported single precision for scalar op in test_vx_aORm_fp_ops\n"); 1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng exit(1); 1218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng pv = (unsigned int *)&vec_out; 1220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // clear vec_out 1221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (idx = 0; idx < 4; idx++, pv++) 1222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *pv = 0; 1223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* If num_tests is exactly equal to nb_special_fargs, this implies the 1225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * instruction being tested only requires one floating point argument 1226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * (e.g. xssqrtdp). 1227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 1228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.num_tests == nb_special_fargs && !test_group.targs) { 1229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * inB; 1230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i; 1231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < nb_special_fargs; i++) { 1232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_fargs[i]; 1233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frbp = (unsigned long long *)&spec_fargs[i]; 1234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inB, inB, 8); 1235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst = (unsigned long long *) &vec_out; 1237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s %016llx => %016llx\n", i, test_group.name, *frbp, 1238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng convToWord ? (*dst & 0x00000000ffffffffULL) : *dst); 1239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * inA, * inB; 1242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int condreg, flags; 1243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int isTdiv = (strstr(test_group.name, "xstdivdp") != NULL) ? 1 : 0; 1244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i; 1245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < test_group.num_tests; i++) { 1246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fp_test_args_t aTest = test_group.targs[i]; 1247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inA = (void *)&spec_fargs[aTest.fra_idx]; 1248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_fargs[aTest.frb_idx]; 1249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frap = (unsigned long long *)&spec_fargs[aTest.fra_idx]; 1250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frbp = (unsigned long long *)&spec_fargs[aTest.frb_idx]; 1251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // Only need to copy one doubleword into each vector's element 0 1252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inA, inA, 8); 1253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inB, inB, 8); 1254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_FPSCR_ZERO; 1255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 1256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR(flags); 1258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (isTdiv) { 1259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng condreg = (flags & 0x000000f0) >> 4; 1260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s %016llx,%016llx => cr %x\n", i, test_group.name, *frap, *frbp, condreg); 1261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst = (unsigned long long *) &vec_out; 1263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s %016llx,%016llx => %016llx\n", i, test_group.name, 1264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *frap, *frbp, *dst); 1265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k++; 1270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_aORm_fp_ops(void) 1274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* These ops need a third src argument, which is stored in element 0 of 1276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * VSX[XT] -- i.e., vec_out. For the xs<ZZZ>m{d|s}p cases, VSX[XT] holds 1277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * src3 and VSX[XB] holds src2; for the xs<ZZZ>a{d|s}p cases, VSX[XT] holds 1278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * src2 and VSX[XB] holds src3. The fp_test_args_t that holds the test 1279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * data (input args, result) contain only two inputs, so I arbitrarily 1280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * choose some spec_fargs elements for the third source argument. 1281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * Note that that by using the same input data for a given pair of 1282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * a{d|s}p/m{d|s}p-type instructions (by swapping the src2 and src3 1283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * arguments), the expected result should be the same. 1284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 1285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int k; 1288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng char * test_name = (char *)malloc(20); 1289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k = 0; 1290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = False; 1291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng build_special_fargs_table(); 1293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = vx_aORm_fp_tests[k].test_func)) { 1294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i, stride; 1295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool repeat = False; 1296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool scalar = False; 1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long * frap, * frbp, * dst; 1298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_t test_group = vx_aORm_fp_tests[k]; 1299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_type test_type = test_group.type; 1300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dp = test_group.precision == DOUBLE_TEST ? True : False; 1301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frap = frbp = NULL; 1302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_type < VX_VECTOR_FP_MULT_AND_OP2) { 1304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng scalar = True; 1305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcpy(test_name, test_group.name); 1306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!repeat) { 1307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng repeat = 1; 1308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stride = 1; 1309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // Only support double precision scalar ops in this function 1310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) { 1311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcat(test_name, "adp"); 1312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fprintf(stderr, "Unsupported single precision for scalar op in test_vx_aORm_fp_ops\n"); 1314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng exit(1); 1315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_aXp = True; 1317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else if (test_type < VX_BASIC_CMP) { 1319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // Then it must be a VX_VECTOR_xxx type 1320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng stride = do_dp ? 2 : 4; 1321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (!repeat) { 1322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // No need to work up the testcase name here, since that will be done in 1323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // the print_vx_aORm_fp_result() function we'll call for vector-type ops. 1324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng repeat = 1; 1325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_aXp = True; 1326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("ERROR: Invalid VX FP test type %d\n", test_type); 1329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng exit(1); 1330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1331663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1332663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain: 1333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < test_group.num_tests; i+=stride) { 1334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * inA, * inB; 1335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int m, fp_idx[4]; 1336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long vsr_XT[2]; 1337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long vsr_XB[2]; 1338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fp_test_args_t aTest = test_group.targs[i]; 1339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (m = 0; m < stride; m++) 1340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng fp_idx[m] = i % (nb_special_fargs - stride) + m; 1341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* When repeat == True, we're on the first time through of one of the VX_FP_SMx 1343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * test types, meaning we're testing a xs<ZZZ>adp case, thus we have to swap 1344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * inputs as described above: 1345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * src2 <= VSX[XT] 1346663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * src3 <= VSX[XB] 1347663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng */ 1348663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (scalar) { 1349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // For scalar op, only need to copy one doubleword into each vector's element 0 1350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inA = (void *)&spec_fargs[aTest.fra_idx]; 1351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_fargs[aTest.frb_idx]; 1352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frap = (unsigned long long *)&spec_fargs[aTest.fra_idx]; 1353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inA, inA, 8); 1354663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (repeat) { 1355663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_out, inB, 8); // src2 1356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inB, &spec_fargs[fp_idx[0]], 8); //src3 1357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frbp = (unsigned long long *)&spec_fargs[fp_idx[0]]; 1358663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1359663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frbp = (unsigned long long *)&spec_fargs[aTest.frb_idx]; 1360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_inB, inB, 8); // src2 1361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&vec_out, &spec_fargs[fp_idx[0]], 8); //src3 1362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1363663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vsr_XT, &vec_out, 8); 1364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int j, loops = do_dp ? 2 : 4; 1366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng size_t len = do_dp ? 8 : 4; 1367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * vec_src = repeat ? (void *)&vec_inB : (void *)&vec_out; 1368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (j = 0; j < loops; j++) { 1369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 1370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vec_src + (j * len), &spec_fargs[fp_idx[j]], len); 1371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vec_src + (j * len), &spec_sp_fargs[fp_idx[j]], len); 1373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (do_dp) 1375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng setup_dp_fp_args(&test_group.targs[i], repeat); 1376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng setup_sp_fp_args(&test_group.targs[i], repeat); 1378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vsr_XT, &vec_out, 16); 1380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(vsr_XB, &vec_inB, 16); 1381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst = (unsigned long long *) &vec_out; 1385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_type < VX_VECTOR_FP_MULT_AND_OP2) 1386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "#%d: %s %s(%016llx,%016llx,%016llx) = %016llx\n", i, 1387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_name, test_group.op, vsr_XT[0], *frap, *frbp, *dst ); 1388663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng print_vx_aORm_fp_result(vsr_XT, vsr_XB, &test_group, i); 1390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (repeat) { 1394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng repeat = 0; 1395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_type < VX_VECTOR_FP_MULT_AND_OP2) { 1396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcpy(test_name, test_group.name); 1397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcat(test_name, "mdp"); 1398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_aXp = False; 1400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto again; 1401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k++; 1403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng free(test_name); 1406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_vector_one_fp_arg(void) 1409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int k; 1412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k = 0; 1413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng build_special_fargs_table(); 1414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = vx_vector_one_fp_arg_tests[k].test_func)) { 1416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int idx, i; 1417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_t test_group = vx_vector_one_fp_arg_tests[k]; 1418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool convToWord = (test_group.type == VX_CONV_WORD); 1419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool dp = (test_group.precision == DOUBLE_TEST) ? True : False; 1420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng Bool xvrespTest = (strstr(test_group.name , "xvresp") != NULL) ? True: False; 1421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int stride = dp ? 2 : 4; 1422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < test_group.num_tests; i+=stride) { 1424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * pv; 1425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void * inB; 1426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng pv = (unsigned int *)&vec_out; 1428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // clear vec_out 1429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (idx = 0; idx < 4; idx++, pv++) 1430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *pv = 0; 1431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (dp) { 1433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int j; 1434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long * frB_dp, *dst_dp; 1435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (j = 0; j < 2; j++) { 1436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_fargs[i + j]; 1437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // copy double precision FP into vector element i 1438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(((void *)&vec_inB) + (j * 8), inB, 8); 1439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // execute test insn 1441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst_dp = (unsigned long long *) &vec_out; 1443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s ", i/2, test_group.name); 1444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (j = 0; j < 2; j++) { 1445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (j) 1446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("; "); 1447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frB_dp = (unsigned long long *)&spec_fargs[i + j]; 1448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s(%016llx)", test_group.op, *frB_dp); 1449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" = %016llx", convToWord ? (dst_dp[j] & 0x00000000ffffffffULL) : dst_dp[j]); 1450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 1452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int j; 1454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * frB_sp, * dst_sp; 1455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (j = 0; j < 4; j++) { 1457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng inB = (void *)&spec_sp_fargs[i + j]; 1458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // copy single precision FP into vector element i 1459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(((void *)&vec_inB) + (j * 4), inB, 4); 1460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // execute test insn 1462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng dst_sp = (unsigned int *) &vec_out; 1464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // print result 1465663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s ", i/4, test_group.name); 1466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (j = 0; j < 4; j++) { 1467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (j) 1468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("; "); 1469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng frB_sp = (unsigned int *)&spec_sp_fargs[i + j]; 1470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s(%08x)", test_group.op, *frB_sp); 1471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (xvrespTest) { 1472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng float calc_diff = fabs(spec_sp_fargs[i + j]/256); 1473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng float sp_res; 1474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng memcpy(&sp_res, &dst_sp[j], 4); 1475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng float div_result = 1/spec_sp_fargs[i + j]; 1476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng float real_diff = fabs(sp_res - div_result); 1477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( " ==> %s", 1478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ( ( sp_res == div_result ) 1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng || ( isnan(sp_res) && isnan(div_result) ) 1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng || ( real_diff <= calc_diff ) ) ? "PASS" 1481663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : "FAIL"); 1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1483663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" = %08x", dst_sp[j]); 1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 1487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k++; 1490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* This function assumes the instruction being tested requires two args. */ 1496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_vx_vector_fp_ops(void) 1497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int k; 1500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k = 0; 1501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng build_special_fargs_table(); 1502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = vx_vector_fp_tests[k].test_func)) { 1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int idx, i, repeat = 1; 1505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng vx_fp_test_t test_group = vx_vector_fp_tests[k]; 1506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int stride = test_group.precision == DOUBLE_TEST ? 2 : 4; 1507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = False; 1508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain: 1510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < test_group.num_tests; i+=stride) { 1511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int * pv, condreg; 1512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int flags; 1513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng pv = (unsigned int *)&vec_out; 1515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.precision == DOUBLE_TEST) 1516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng setup_dp_fp_args(&test_group.targs[i], False); 1517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng setup_sp_fp_args(&test_group.targs[i], False); 1519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // clear vec_out 1521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (idx = 0; idx < 4; idx++, pv++) 1522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *pv = 0; 1523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // execute test insn 1525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_FPSCR_ZERO; 1526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_CR_XER_ZERO; 1527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng GET_CR(flags); 1529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.type == VX_BASIC_CMP) { 1530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng condreg = (flags & 0x000000f0) >> 4; 1531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng condreg = VX_NOT_CMP_OP; 1533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng print_vector_fp_result(condreg, &test_group, i); 1535663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 1537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (repeat && test_group.type == VX_BASIC_CMP) { 1538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng repeat = 0; 1539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = True; 1540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto again; 1541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k++; 1543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// The div doubleword test data 1549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengsigned long long div_dw_tdata[13][2] = { 1550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 4, -4 }, 1551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 4, -3 }, 1552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 4, 4 }, 1553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 4, -5 }, 1554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 3, 8 }, 1555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x8000000000000000ULL, 0xa }, 1556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x50c, -1 }, 1557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x50c, -4096 }, 1558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x1234fedc, 0x8000a873 }, 1559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0xabcd87651234fedcULL, 0xa123b893 }, 1560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x123456789abdcULL, 0 }, 1561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0, 2 }, 1562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x77, 0xa3499 } 1563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 1564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define dw_tdata_len (sizeof(div_dw_tdata)/sizeof(signed long long)/2) 1565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// The div word test data 1567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengunsigned int div_w_tdata[6][2] = { 1568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0, 2 }, 1569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 2, 0 }, 1570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0x7abc1234, 0xf0000000 }, 1571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 0xfabc1234, 5 }, 1572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 77, 66 }, 1573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 5, 0xfabc1234 }, 1574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 1575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define w_tdata_len (sizeof(div_w_tdata)/sizeof(unsigned int)/2) 1576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct div_ext_test 1578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t test_func; 1580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng const char *name; 1581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int num_tests; 1582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng div_type_t div_type; 1583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng precision_type_t precision; 1584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} div_ext_test_t; 1585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic div_ext_test_t div_tests[] = { 1587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__ 1588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_divde, "divde", dw_tdata_len, DIV_BASE, DOUBLE_TEST }, 1589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_divde, "divdeo", dw_tdata_len, DIV_OE, DOUBLE_TEST }, 1590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 1591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_divweu, "divweu", w_tdata_len, DIV_BASE, SINGLE_TEST }, 1592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_divweu, "divweuo", w_tdata_len, DIV_OE, SINGLE_TEST }, 1593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL, 0, 0, 0 } 1594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 1595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_div_extensions(void) 1597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int k; 1600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k = 0; 1601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = div_tests[k].test_func)) { 1603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i, repeat = 1; 1604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng div_ext_test_t test_group = div_tests[k]; 1605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = False; 1606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain: 1608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < test_group.num_tests; i++) { 1609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned int condreg; 1610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.div_type == DIV_OE) 1612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_OE = True; 1613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng else 1614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_OE = False; 1615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.precision == DOUBLE_TEST) { 1617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r14 = div_dw_tdata[i][0]; 1618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r15 = div_dw_tdata[i][1]; 1619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r14 = div_w_tdata[i][0]; 1621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r15 = div_w_tdata[i][1]; 1622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // execute test insn 1624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng condreg = (div_flags & 0xf0000000) >> 28; 1626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s%s: ", i, test_group.name, do_dot ? "." : ""); 1627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (test_group.precision == DOUBLE_TEST) { 1628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("0x%016llx / 0x%016llx = 0x%016llx;", 1629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng div_dw_tdata[i][0], div_dw_tdata[i][1], (signed long long) r17); 1630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } else { 1631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("0x%08x / 0x%08x = 0x%08x;", 1632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng div_w_tdata[i][0], div_w_tdata[i][1], (unsigned int) r17); 1633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf(" CR=%x; XER=%x\n", condreg, div_xer); 1635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 1637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (repeat) { 1638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng repeat = 0; 1639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = True; 1640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto again; 1641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k++; 1643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void test_fct_ops(void) 1649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int k; 1652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k = 0; 1653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = fct_tests[k].test_func)) { 1655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i, repeat = 1; 1656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng simple_test_t test_group = fct_tests[k]; 1657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = False; 1658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengagain: 1660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < nb_special_fargs; i++) { 1661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng double result; 1662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SINGLE_MASK 0x00000000FFFFFFFFULL 1663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng f14 = spec_fargs[i]; 1665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // execute test insn 1666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng SET_FPSCR_ZERO; 1667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng result = f17; 1669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("#%d: %s%s: ", i, test_group.name, do_dot ? "." : ""); 1670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("0x%016llx (%e) ==> 0x%016llx\n", 1671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *((unsigned long long *)(&spec_fargs[i])), spec_fargs[i], 1672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_group.precision == SINGLE_TEST ? (SINGLE_MASK & 1673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *((unsigned long long *)(&result))) : 1674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng *((unsigned long long *)(&result))); 1675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("\n"); 1677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (repeat) { 1678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng repeat = 0; 1679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng do_dot = True; 1680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng goto again; 1681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng k++; 1683663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1684663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__ 1688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid test_stdbrx(void) 1689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng unsigned long long store, val = 0xdeadbacf12345678ULL; 1691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("stdbrx: 0x%llx ==> ", val); 1692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r17 = (HWord_t)val; 1693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng r14 = (HWord_t)&store; 1694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ __volatile__ ("stdbrx %0, 0, %1" : : "r"(r17), "r"(r14)); 1695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("0x%llx\n", store); 1696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "\n" ); 1697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 1699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic test_table_t 1701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng all_tests[] = 1702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_vx_vector_one_fp_arg, 1704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test VSX vector single arg instructions"}, 1705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_vx_vector_fp_ops, 1706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test VSX floating point compare and basic arithmetic instructions" }, 1707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__ 1708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_bpermd, 1709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test bit permute double"}, 1710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 1711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xxsel, 1712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test xxsel instruction" }, 1713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_xxspltw, 1714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test xxspltw instruction" }, 1715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_div_extensions, 1716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test div extensions" }, 1717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_fct_ops, 1718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test floating point convert [word | doubleword] unsigned, with round toward zero" }, 1719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef __powerpc64__ 1720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_stdbrx, 1721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test stdbrx instruction"}, 1722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif 1723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_vx_aORm_fp_ops, 1724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test floating point arithmetic instructions -- with a{d|s}p or m{d|s}p"}, 1725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { &test_vx_simple_scalar_fp_ops, 1726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "Test scalar floating point arithmetic instructions"}, 1727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { NULL, NULL } 1728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 1729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif // HAS_VSX 1730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main(int argc, char *argv[]) 1732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 1733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#ifdef HAS_VSX 1734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_table_t aTest; 1736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test_func_t func; 1737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i = 0; 1738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng while ((func = all_tests[i].test_category)) { 1740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng aTest = all_tests[i]; 1741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf( "%s\n", aTest.name ); 1742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng (*func)(); 1743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng i++; 1744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 1745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (spec_fargs) 1746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng free(spec_fargs); 1747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (spec_sp_fargs) 1748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng free(spec_sp_fargs); 1749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif // HAS _VSX 1751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 1753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 1754