12062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj/* Copyright (C) 2011 IBM 22062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 32062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Author: Maynard Johnson <maynardj@us.ibm.com> 42062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 52062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj This program is free software; you can redistribute it and/or 62062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj modify it under the terms of the GNU General Public License as 72062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj published by the Free Software Foundation; either version 2 of the 82062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj License, or (at your option) any later version. 92062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj This program is distributed in the hope that it will be useful, but 112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj General Public License for more details. 142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj You should have received a copy of the GNU General Public License 162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj along with this program; if not, write to the Free Software 172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 02111-1307, USA. 192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj The GNU General Public License is contained in the file COPYING. 212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#ifdef HAS_VSX 242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <stdio.h> 262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <stdint.h> 272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <stdlib.h> 282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <string.h> 292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <malloc.h> 302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <altivec.h> 312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#include <math.h> 32ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#include <unistd.h> // getopt 332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#ifndef __powerpc64__ 352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef uint32_t HWord_t; 362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#else 372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef uint64_t HWord_t; 382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif /* __powerpc64__ */ 392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 40dd690bf8d81c9119a7228446be12e3366e202176carll#ifdef VGP_ppc64le_linux 41dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 1 42dd690bf8d81c9119a7228446be12e3366e202176carll#else 43dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 0 44dd690bf8d81c9119a7228446be12e3366e202176carll#endif 45dd690bf8d81c9119a7228446be12e3366e202176carll 462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef unsigned char Bool; 472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define True 1 482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define False 0 492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister HWord_t r14 __asm__ ("r14"); 502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister HWord_t r15 __asm__ ("r15"); 512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister HWord_t r16 __asm__ ("r16"); 522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister HWord_t r17 __asm__ ("r17"); 532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister double f14 __asm__ ("fr14"); 542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister double f15 __asm__ ("fr15"); 552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister double f16 __asm__ ("fr16"); 562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjregister double f17 __asm__ ("fr17"); 572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic volatile unsigned int div_flags, div_xer; 592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" 612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SET_CR(_arg) \ 632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR ); 642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SET_XER(_arg) \ 662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" ); 672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define GET_CR(_lval) \ 692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("mfcr %0" : "=b"(_lval) ) 702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define GET_XER(_lval) \ 722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) ) 732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define GET_CR_XER(_lval_cr,_lval_xer) \ 752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0) 762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SET_CR_ZERO \ 782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR(0) 792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SET_XER_ZERO \ 812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_XER(0) 822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SET_CR_XER_ZERO \ 842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do { SET_CR_ZERO; SET_XER_ZERO; } while (0) 852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SET_FPSCR_ZERO \ 872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do { double _d = 0.0; \ 882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \ 892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } while (0) 902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef void (*test_func_t)(void); 932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef struct test_table test_table_t; 942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 95ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes/* Defines for the instructiion groups, use bit field to identify */ 96ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#define SCALAR_DIV_INST 0x0001 97ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#define OTHER_INST 0x0002 982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj/* These functions below that construct a table of floating point 1002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * values were lifted from none/tests/ppc32/jm-insns.c. 1012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 1022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#if defined (DEBUG_ARGS_BUILD) 1042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0) 1052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#else 1062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define AB_DPRINTF(fmt, args...) do { } while (0) 1072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif 1082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic inline void register_farg (void *farg, 1102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int s, uint16_t _exp, uint64_t mant) 1112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 1122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj uint64_t tmp; 1132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant; 1152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj *(uint64_t *)farg = tmp; 1162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj AB_DPRINTF("%d %03x %013llx => %016llx %0e\n", 1172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s, _exp, mant, *(uint64_t *)farg, *(double *)farg); 1182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 1192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1208efe4e40e702e4a1eafac37076e1df2ccd9b047bcarllstatic inline void register_sp_farg (void *farg, 1218efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll int s, uint16_t _exp, uint32_t mant) 1228efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll{ 1238efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll uint32_t tmp; 1248efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll tmp = ((uint32_t)s << 31) | ((uint32_t)_exp << 23) | mant; 1258efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll *(uint32_t *)farg = tmp; 1268efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll} 1278efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll 1282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef struct fp_test_args { 1302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int fra_idx; 1312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int frb_idx; 1322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} fp_test_args_t; 1332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjfp_test_args_t two_arg_fp_tests[] = { 1362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 8}, 1372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 14}, 1382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {15, 16}, 1392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 5}, 1402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 4}, 1412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 7}, 1422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 9}, 1432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {8, 11}, 1442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 8}, 1452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 14}, 1462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 6}, 1472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 5}, 1482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 4}, 1492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 7}, 1502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 9}, 1512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {14, 11}, 1522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 8}, 1532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 14}, 1542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 6}, 1552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 5}, 1562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 4}, 1572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 7}, 1582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 9}, 1592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {6, 11}, 1602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 8}, 1612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 14}, 1622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 6}, 1632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 5}, 1642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 4}, 1652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 7}, 1662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 9}, 1672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {5, 11}, 1682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 8}, 1692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 14}, 1702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 6}, 1712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 5}, 1722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 1}, 1732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 7}, 1742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 9}, 1752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {4, 11}, 1762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 8}, 1772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 14}, 1782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 6}, 1792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 5}, 1802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 4}, 1812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 7}, 1822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 9}, 1832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {7, 11}, 1842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {10, 8}, 1852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {10, 14}, 1862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {12, 6}, 1872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {12, 5}, 1882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {10, 4}, 1892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {10, 7}, 1902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {10, 9}, 1912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {10, 11}, 1922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {12, 8 }, 1932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {12, 14}, 1942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {12, 6}, 1952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {15, 16}, 1962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {15, 16}, 1972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {9, 11}, 1982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {11, 11}, 1992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {11, 12}, 2002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {16, 18}, 2012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {17, 16}, 2022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {19, 19}, 2032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj {19, 18} 2042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 2052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic int nb_special_fargs; 2082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic double * spec_fargs; 2092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic float * spec_sp_fargs; 2102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void build_special_fargs_table(void) 2122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 2132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj/* 2142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Entry Sign Exp fraction Special value 2152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0 0 3fd 0x8000000000000ULL Positive finite number 2162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1 0 404 0xf000000000000ULL ... 2172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2 0 001 0x8000000b77501ULL ... 2182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3 0 7fe 0x800000000051bULL ... 2192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4 0 012 0x3214569900000ULL ... 2202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5 0 000 0x0000000000000ULL +0.0 (+zero) 2212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6 1 000 0x0000000000000ULL -0.0 (-zero) 2222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7 0 7ff 0x0000000000000ULL +infinity 2232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8 1 7ff 0x0000000000000ULL -infinity 2242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 9 0 7ff 0x7FFFFFFFFFFFFULL +SNaN 2252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10 1 7ff 0x7FFFFFFFFFFFFULL -SNaN 2262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 11 0 7ff 0x8000000000000ULL +QNaN 2272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12 1 7ff 0x8000000000000ULL -QNaN 2282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13 1 000 0x8340000078000ULL Denormalized val (zero exp and non-zero fraction) 2292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14 1 40d 0x0650f5a07b353ULL Negative finite number 2302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15 0 412 0x32585a9900000ULL A few more positive finite numbers 2312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 16 0 413 0x82511a2000000ULL ... 2322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 17 . . . . . . . . . . . . . . . . . . . . . . . 2332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 18 . . . . . . . . . . . . . . . . . . . . . . . 2342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 19 . . . . . . . . . . . . . . . . . . . . . . . 2352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj*/ 2362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj uint64_t mant; 2388efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll uint32_t mant_sp; 2392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj uint16_t _exp; 2402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int s; 2412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int j, i = 0; 2422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (spec_fargs) 2442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return; 2452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj spec_fargs = malloc( 20 * sizeof(double) ); 2472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj spec_sp_fargs = malloc( 20 * sizeof(float) ); 2482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #0 2502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x3fd; 2522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x8000000000000ULL; 2532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #1 2562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x404; 2582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0xf000000000000ULL; 2592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #2 2622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x001; 2642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x8000000b77501ULL; 2652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #3 2682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7fe; 2702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x800000000051bULL; 2712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #4 2742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x012; 2762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x3214569900000ULL; 2772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* Special values */ 2812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* +0.0 : 0 0x000 0x0000000000000 */ 2822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #5 2832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x000; 2852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x0000000000000ULL; 2862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* -0.0 : 1 0x000 0x0000000000000 */ 2892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #6 2902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 1; 2912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x000; 2922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x0000000000000ULL; 2932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 2942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 2952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* +infinity : 0 0x7FF 0x0000000000000 */ 2962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #7 2972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 2982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7FF; 2992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x0000000000000ULL; 3002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* -infinity : 1 0x7FF 0x0000000000000 */ 3032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #8 3042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 1; 3052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7FF; 3062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x0000000000000ULL; 3072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3098efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll /* 3108efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * This comment applies to values #9 and #10 below: 3118efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * When src is a SNaN, it's converted to a QNaN first before rounding to single-precision, 3128efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * so we can't just copy the double-precision value to the corresponding slot in the 3138efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * single-precision array (i.e., in the loop at the end of this function). Instead, we 3148efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * have to manually set the bits using register_sp_farg(). 3158efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll */ 3168efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll 3178efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll /* +SNaN : 0 0x7FF 0x7FFFFFFFFFFFF */ 3182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #9 3192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7FF; 3212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x7FFFFFFFFFFFFULL; 3222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3238efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll _exp = 0xff; 3248efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll mant_sp = 0x3FFFFF; 3258efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll register_sp_farg(&spec_sp_fargs[i-1], s, _exp, mant_sp); 3262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3278efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll /* -SNaN : 1 0x7FF 0x7FFFFFFFFFFFF */ 3282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #10 3292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 1; 3302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7FF; 3312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x7FFFFFFFFFFFFULL; 3322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3338efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll _exp = 0xff; 3348efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll mant_sp = 0x3FFFFF; 3358efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll register_sp_farg(&spec_sp_fargs[i-1], s, _exp, mant_sp); 3362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3378efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll /* +QNaN : 0 0x7FF 0x8000000000000 */ 3382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #11 3392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7FF; 3412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x8000000000000ULL; 3422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3448efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll /* -QNaN : 1 0x7FF 0x8000000000000 */ 3452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #12 3462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 1; 3472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x7FF; 3482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x8000000000000ULL; 3492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* denormalized value */ 3522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #13 3532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 1; 3542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x000; 3552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x8340000078000ULL; 3562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* Negative finite number */ 3592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #14 3602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 1; 3612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x40d; 3622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x0650f5a07b353ULL; 3632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* A few positive finite numbers ... */ 3662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #15 3672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x412; 3692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x32585a9900000ULL; 3702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #16 3732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x413; 3752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x82511a2000000ULL; 3762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #17 3792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x403; 3812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x12ef5a9300000ULL; 3822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #18 3852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x405; 3872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x14bf5d2300000ULL; 3882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // #19 3912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj s = 0; 3922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj _exp = 0x409; 3932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj mant = 0x76bf982440000ULL; 3942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj register_farg(&spec_fargs[i++], s, _exp, mant); 3952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 3962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj nb_special_fargs = i; 3972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < i; j++) { 3988efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll if (!(j == 9 || j == 10)) 3998efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll spec_sp_fargs[j] = spec_fargs[j]; 4002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 4012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 4022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstruct test_table 4052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 4062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t test_category; 4072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj char * name; 408ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes unsigned int test_group; 4092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 4102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj/* Type of input for floating point operations.*/ 4122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef enum { 4132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SINGLE_TEST, 4142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj DOUBLE_TEST 4152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} precision_type_t; 4162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef enum { 4182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj VX_SCALAR_CONV_TO_WORD, 4192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj VX_CONV_TO_SINGLE, 4202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj VX_CONV_TO_DOUBLE, 4212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj VX_ESTIMATE, 4222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj VX_DEFAULT 4232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} vx_fp_test_type; 4242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic vector unsigned int vec_out, vec_inA, vec_inB; 4262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj/* This function is for checking the reciprocal and reciprocal square root 4282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * estimate instructions. 4292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 4302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjBool check_estimate(precision_type_t type, Bool is_rsqrte, int idx, int output_vec_idx) 4312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 4322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* Technically, the number of bits of precision for xvredp and xvrsqrtedp is 4332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * 14 bits (14 = log2 16384). However, the VEX emulation of these instructions 4342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * does an actual reciprocal calculation versus estimation, so the answer we get back from 4352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * valgrind can easily differ from the estimate in the lower bits (within the 14 bits of 4362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * precision) and the estimate may still be within expected tolerances. On top of that, 4372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * we can't count on these estimates always being the same across implementations. 4382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * For example, with the fre[s] instruction (which should be correct to within one part 4392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * in 256 -- i.e., 8 bits of precision) . . . When approximating the value 1.0111_1111_1111, 4402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * one implementation could return 1.0111_1111_0000 and another implementation could return 4412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * 1.1000_0000_0000. Both estimates meet the 1/256 accuracy requirement, but share only a 4422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * single bit in common. 4432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * 4442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * The upshot is we can't validate the VEX output for these instructions by comparing against 4452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * stored bit patterns. We must check that the result is within expected tolerances. 4462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 4472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* A mask to be used for validation as a last resort. 4502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * Only use 12 bits of precision for reasons discussed above. 4512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 4522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define VSX_RECIP_ESTIMATE_MASK_DP 0xFFFFFF0000000000ULL 4532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define VSX_RECIP_ESTIMATE_MASK_SP 0xFFFFFF00 4542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool result = False; 4562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool dp_test = type == DOUBLE_TEST; 4572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj double src_dp, res_dp; 4582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj float src_sp, res_sp; 4592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_dp = res_dp = 0; 4602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_sp = res_sp = 0; 4612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define SRC (dp_test ? src_dp : src_sp) 4622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define RES (dp_test ? res_dp : res_sp) 4632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool src_is_negative = False; 4642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool res_is_negative = False; 4652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * dst_dp = NULL; 4662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * dst_sp = NULL; 4672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp_test) { 4682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * src_dp_ull; 4692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_dp = (unsigned long long *) &vec_out; 4702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_dp = spec_fargs[idx]; 4712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_dp_ull = (unsigned long long *) &src_dp; 4722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_is_negative = (*src_dp_ull & 0x8000000000000000ULL) ? True : False; 4732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj res_is_negative = (dst_dp[output_vec_idx] & 0x8000000000000000ULL) ? True : False; 4742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(&res_dp, &dst_dp[output_vec_idx], 8); 4752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 4762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * src_sp_uint; 4772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_sp = (unsigned int *) &vec_out; 4782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_sp = spec_sp_fargs[idx]; 4792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_sp_uint = (unsigned int *) &src_sp; 4802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj src_is_negative = (*src_sp_uint & 0x80000000) ? True : False; 4812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj res_is_negative = (dst_sp[output_vec_idx] & 0x80000000) ? True : False; 4822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(&res_sp, &dst_sp[output_vec_idx], 4); 4832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 4842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 4852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // Below are common rules for xvre{d|s}p and xvrsqrte{d|s}p 4862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (isnan(SRC)) 4872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return isnan(RES); 4882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (fpclassify(SRC) == FP_ZERO) 4892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return isinf(RES); 4902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (!src_is_negative && isinf(SRC)) 4912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return !res_is_negative && (fpclassify(RES) == FP_ZERO); 4922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (is_rsqrte) { 4932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (src_is_negative) 4942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return isnan(RES); 4952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 4962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (src_is_negative && isinf(SRC)) 4972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return res_is_negative && (fpclassify(RES) == FP_ZERO); 4982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 4992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp_test) { 5002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj double calc_diff; 5012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj double real_diff; 5022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj double recip_divisor; 5032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj double div_result; 5042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj double calc_diff_tmp; 5052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (is_rsqrte) 5072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj recip_divisor = sqrt(src_dp); 5082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj else 5092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj recip_divisor = src_dp; 5102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj div_result = 1.0/recip_divisor; 5122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj calc_diff_tmp = recip_divisor * 16384.0; 5132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (isnormal(calc_diff_tmp)) { 5142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj calc_diff = fabs(1.0/calc_diff_tmp); 5152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj real_diff = fabs(res_dp - div_result); 5162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj result = ( ( res_dp == div_result ) 5172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj || ( real_diff <= calc_diff ) ); 5182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 5192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* Unable to compute theoretical difference, so we fall back to masking out 5202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * un-precise bits. 5212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 5222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * div_result_dp = (unsigned long long *) &div_result; 5232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj result = (dst_dp[output_vec_idx] & VSX_RECIP_ESTIMATE_MASK_DP) == (*div_result_dp & VSX_RECIP_ESTIMATE_MASK_DP); 5242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 5252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* For debug use . . . 5262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (!result) { 5272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * dv = &div_result; 5282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * rd = &real_diff; 5292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * cd = &calc_diff; 5302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n\t {actual div_result: %016llx; real_diff: %016llx; calc_diff: %016llx}\n", 5312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj *dv, *rd, *cd); 5322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 5332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 5342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { // single precision test (only have xvrsqrtesp, since xvresp was implemented in stage 2) 5352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj float calc_diff; 5362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj float real_diff; 5372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj float div_result; 5382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj float calc_diff_tmp; 5392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj float recip_divisor = sqrt(src_sp); 5402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj div_result = 1.0/recip_divisor; 5422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj calc_diff_tmp = recip_divisor * 16384.0; 5432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (isnormal(calc_diff_tmp)) { 5442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj calc_diff = fabsf(1.0/calc_diff_tmp); 5452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj real_diff = fabsf(res_sp - div_result); 5462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj result = ( ( res_sp == div_result ) 5472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj || ( real_diff <= calc_diff ) ); 5482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 5492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* Unable to compute theoretical difference, so we fall back to masking out 5502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * un-precise bits. 5512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 5522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * div_result_sp = (unsigned int *) &div_result; 5532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj result = (dst_sp[output_vec_idx] & VSX_RECIP_ESTIMATE_MASK_SP) == (*div_result_sp & VSX_RECIP_ESTIMATE_MASK_SP); 5542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 5552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* For debug use . . . 5562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (!result) { 5572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * dv = &div_result; 5582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * rd = &real_diff; 5592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * cd = &calc_diff; 5602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n\t {actual div_result: %016llx; real_diff: %016llx; calc_diff: %016llx}\n", 5612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj *dv, *rd, *cd); 5622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 5632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 5642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 5652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return result; 5662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 5672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef struct vx_fp_test 5692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 5702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t test_func; 5712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj const char * name; 5722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj fp_test_args_t * targs; 5732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int num_tests; 5742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj precision_type_t precision; 5752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj vx_fp_test_type type; 5762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj const char * op; 5772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} vx_fp_test_t; 5782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic Bool do_dot; 5812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvredp(void) 5832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 5842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvredp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 5852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 5862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xsredp(void) 5882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 5892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xsredp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 5902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 5912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrsqrtedp(void) 5932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 5942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrsqrtedp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 5952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 5962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 5972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xsrsqrtedp(void) 5982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 5992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xsrsqrtedp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrsqrtesp(void) 6032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrsqrtesp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xstsqrtdp(void) 6082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xstsqrtdp cr1, %x0" : : "wa" (vec_inB)); 6102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvtsqrtdp(void) 6132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvtsqrtdp cr1, %x0" : : "wa" (vec_inB)); 6152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvtsqrtsp(void) 6182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvtsqrtsp cr1, %x0" : : "wa" (vec_inB)); 6202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvsqrtdp(void) 6232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvsqrtdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvsqrtsp(void) 6282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvsqrtsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvtdivdp(void) 6332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvtdivdp cr1, %x0, %x1" : : "wa" (vec_inA), "wa" (vec_inB)); 6352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvtdivsp(void) 6382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvtdivsp cr1, %x0, %x1" : : "wa" (vec_inA), "wa" (vec_inB)); 6402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xscvdpsp(void) 6432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xscvdpsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xscvdpuxws(void) 6482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xscvdpuxws %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xscvspdp(void) 6532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xscvspdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvdpsp(void) 6582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvdpsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvdpuxds(void) 6632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvdpuxds %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvdpuxws(void) 6682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvdpuxws %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvspdp(void) 6732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvspdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvspsxds(void) 6782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvspsxds %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvspuxds(void) 6832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvspuxds %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvdpsxds(void) 6882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvdpsxds %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvspuxws(void) 6932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvspuxws %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 6952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 6962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 6972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvsxddp(void) 6982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 6992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvsxddp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvuxddp(void) 7032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvuxddp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvsxdsp(void) 7082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvsxdsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvuxdsp(void) 7132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvuxdsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvsxwdp(void) 7182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvsxwdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvuxwdp(void) 7232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvuxwdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvsxwsp(void) 7282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvsxwsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvcvuxwsp(void) 7332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvcvuxwsp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xsrdpic(void) 7382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xsrdpic %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xsrdpiz(void) 7432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xsrdpiz %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xsrdpi(void) 7482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xsrdpi %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvabsdp(void) 7532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvabsdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvnabsdp(void) 7582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvnabsdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvnegdp(void) 7632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvnegdp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvabssp(void) 7682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvabssp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvnabssp(void) 7732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvnabssp %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrdpi(void) 7782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrdpi %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrdpic(void) 7832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrdpic %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrdpim(void) 7882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrdpim %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrdpip(void) 7932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrdpip %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 7952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 7962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 7972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrdpiz(void) 7982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 7992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrdpiz %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 8002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 8012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrspi(void) 8032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 8042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrspi %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 8052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 8062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrspic(void) 8082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 8092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrspic %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 8102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 8112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrspim(void) 8132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 8142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrspim %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 8152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 8162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrspip(void) 8182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 8192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrspip %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 8202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 8212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_xvrspiz(void) 8232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 8242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("xvrspiz %x0, %x1" : "=wa" (vec_out): "wa" (vec_inB)); 8252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 8262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic vx_fp_test_t 8282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjvsx_one_fp_arg_tests[] = { 8292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvredp, "xvredp", NULL, 18, DOUBLE_TEST, VX_ESTIMATE, "1/x"}, 8302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xsredp, "xsredp", NULL, 18, DOUBLE_TEST, VX_ESTIMATE, "1/x"}, 8312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrsqrtedp, "xvrsqrtedp", NULL, 18, DOUBLE_TEST, VX_ESTIMATE, "1/x-sqrt"}, 8322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xsrsqrtedp, "xsrsqrtedp", NULL, 18, DOUBLE_TEST, VX_ESTIMATE, "1/x-sqrt"}, 8332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrsqrtesp, "xvrsqrtesp", NULL, 18, SINGLE_TEST, VX_ESTIMATE, "1/x-sqrt"}, 8342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvsqrtdp, "xvsqrtdp", NULL, 18, DOUBLE_TEST, VX_DEFAULT, "sqrt"}, 8352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvsqrtsp, "xvsqrtsp", NULL, 18, SINGLE_TEST, VX_DEFAULT, "sqrt"}, 8362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xscvdpsp, "xscvdpsp", NULL, 20, DOUBLE_TEST, VX_CONV_TO_SINGLE, "conv"}, 8372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xscvdpuxws, "xscvdpuxws", NULL, 20, DOUBLE_TEST, VX_SCALAR_CONV_TO_WORD, "conv"}, 8382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xscvspdp, "xscvspdp", NULL, 20, SINGLE_TEST, VX_CONV_TO_DOUBLE, "conv"}, 8392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvdpsp, "xvcvdpsp", NULL, 20, DOUBLE_TEST, VX_CONV_TO_SINGLE, "conv"}, 8402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvdpuxds, "xvcvdpuxds", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "conv"}, 8412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvdpuxws, "xvcvdpuxws", NULL, 20, DOUBLE_TEST, VX_CONV_TO_SINGLE, "conv"}, 8422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvspdp, "xvcvspdp", NULL, 20, SINGLE_TEST, VX_CONV_TO_DOUBLE, "conv"}, 8432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvspsxds, "xvcvspsxds", NULL, 20, SINGLE_TEST, VX_CONV_TO_DOUBLE, "conv"}, 8442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvdpsxds, "xvcvdpsxds", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "conv"}, 8452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvspuxds, "xvcvspuxds", NULL, 20, SINGLE_TEST, VX_CONV_TO_DOUBLE, "conv"}, 8462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvcvspuxws, "xvcvspuxws", NULL, 20, SINGLE_TEST, VX_CONV_TO_SINGLE, "conv"}, 8472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xsrdpic, "xsrdpic", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xsrdpiz, "xsrdpiz", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xsrdpi, "xsrdpi", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvabsdp, "xvabsdp", NULL, 20, DOUBLE_TEST, VX_DEFAULT, "abs"}, 8512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvnabsdp, "xvnabsdp", NULL, 20, DOUBLE_TEST, VX_DEFAULT, "nabs"}, 8522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvnegdp, "xvnegdp", NULL, 20, DOUBLE_TEST, VX_DEFAULT, "neg"}, 8532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvabssp, "xvabssp", NULL, 20, SINGLE_TEST, VX_DEFAULT, "abs"}, 8542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvnabssp, "xvnabssp", NULL, 20, SINGLE_TEST, VX_DEFAULT, "nabs"}, 8552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrdpi, "xvrdpi", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrdpic, "xvrdpic", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrdpim, "xvrdpim", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrdpip, "xvrdpip", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrdpiz, "xvrdpiz", NULL, 20, DOUBLE_TEST, VX_CONV_TO_DOUBLE, "round"}, 8602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrspi, "xvrspi", NULL, 20, SINGLE_TEST, VX_CONV_TO_SINGLE, "round"}, 8612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrspic, "xvrspic", NULL, 20, SINGLE_TEST, VX_CONV_TO_SINGLE, "round"}, 8622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrspim, "xvrspim", NULL, 20, SINGLE_TEST, VX_CONV_TO_SINGLE, "round"}, 8632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrspip, "xvrspip", NULL, 20, SINGLE_TEST, VX_CONV_TO_SINGLE, "round"}, 8642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvrspiz, "xvrspiz", NULL, 20, SINGLE_TEST, VX_CONV_TO_SINGLE, "round"}, 8652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { NULL, NULL, NULL, 0, 0, 0, NULL} 8662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 8672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic vx_fp_test_t 8692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjvx_tdivORtsqrt_tests[] = { 8702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xstsqrtdp, "xstsqrtdp", NULL, 20, DOUBLE_TEST, VX_DEFAULT, "test-sqrt"}, 8712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvtsqrtdp, "xvtsqrtdp", NULL, 20, DOUBLE_TEST, VX_DEFAULT, "test-sqrt"}, 8722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvtsqrtsp, "xvtsqrtsp", NULL, 20, SINGLE_TEST, VX_DEFAULT, "test-sqrt"}, 8732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvtdivdp, "xvtdivdp", two_arg_fp_tests, 68, DOUBLE_TEST, VX_DEFAULT, "test-div"}, 8742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_xvtdivsp, "xvtdivsp", two_arg_fp_tests, 68, SINGLE_TEST, VX_DEFAULT, "test-div"}, 8752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { NULL, NULL, NULL, 0 , 0, 0, NULL} 8762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 8772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic unsigned long long doubleWord[] = { 0, 8792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0xffffffff00000000LL, 8802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x00000000ffffffffLL, 8812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0xffffffffffffffffLL, 8822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x89abcde123456789LL, 8832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x0102030405060708LL, 8842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x00000000a0b1c2d3LL, 8852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x1111222233334444LL 8862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 8872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic unsigned int singleWord[] = {0, 8892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0xffff0000, 8902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x0000ffff, 8912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0xffffffff, 8922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x89a73522, 8932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x01020304, 8942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x0000abcd, 8952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 0x11223344 8962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 8972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 8982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef struct vx_intToFp_test 8992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 9002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t test_func; 9012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj const char * name; 9022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj void * targs; 9032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int num_tests; 9042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj precision_type_t precision; 9052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj vx_fp_test_type type; 9062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} vx_intToFp_test_t; 9072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 9082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic vx_intToFp_test_t 9092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjintToFp_tests[] = { 9102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvsxddp, "xvcvsxddp", (void *)doubleWord, 8, DOUBLE_TEST, VX_CONV_TO_DOUBLE }, 9112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvuxddp, "xvcvuxddp", (void *)doubleWord, 8, DOUBLE_TEST, VX_CONV_TO_DOUBLE }, 9122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvsxdsp, "xvcvsxdsp", (void *)doubleWord, 8, DOUBLE_TEST, VX_CONV_TO_SINGLE }, 9132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvuxdsp, "xvcvuxdsp", (void *)doubleWord, 8, DOUBLE_TEST, VX_CONV_TO_SINGLE }, 9142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvsxwdp, "xvcvsxwdp", (void *)singleWord, 8, SINGLE_TEST, VX_CONV_TO_DOUBLE }, 9152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvuxwdp, "xvcvuxwdp", (void *)singleWord, 8, SINGLE_TEST, VX_CONV_TO_DOUBLE }, 9162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvsxwsp, "xvcvsxwsp", (void *)singleWord, 8, SINGLE_TEST, VX_CONV_TO_SINGLE }, 9172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { test_xvcvuxwsp, "xvcvuxwsp", (void *)singleWord, 8, SINGLE_TEST, VX_CONV_TO_SINGLE }, 9182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { NULL, NULL, NULL, 0, 0 } 9192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 9202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 9212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic Bool do_OE; 9222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef enum { 9232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj DIV_BASE = 1, 9242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj DIV_OE = 2, 9252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj DIV_DOT = 4, 9262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} div_type_t; 9272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj/* Possible divde type combinations are: 9282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * - base 9292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * - base+dot 9302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * - base+OE 9312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * - base+OE+dot 9322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 9332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#ifdef __powerpc64__ 9342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_divdeu(void) 9352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 9362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int divdeu_type = DIV_BASE; 9372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (do_OE) 9382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj divdeu_type |= DIV_OE; 9392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (do_dot) 9402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj divdeu_type |= DIV_DOT; 9412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 9422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj switch (divdeu_type) { 9432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 1: 9442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divdeu %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 3: 9492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divdeuo %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 5: 9542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divdeu. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 7: 9592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divdeuo. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj default: 9642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj fprintf(stderr, "Invalid divdeu type. Exiting\n"); 9652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj exit(1); 9662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 9672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 9682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif 9692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 9702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_divwe(void) 9712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 9722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int divwe_type = DIV_BASE; 9732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (do_OE) 9742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj divwe_type |= DIV_OE; 9752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (do_dot) 9762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj divwe_type |= DIV_DOT; 9772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 9782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj switch (divwe_type) { 9792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 1: 9802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divwe %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 3: 9852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divweo %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 5: 9902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divwe. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case 7: 9952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 9962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("divweo. %0, %1, %2" : "=r" (r17) : "r" (r14),"r" (r15)); 9972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR_XER(div_flags, div_xer); 9982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 9992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj default: 10002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj fprintf(stderr, "Invalid divweu type. Exiting\n"); 10012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj exit(1); 10022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 10042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef struct simple_test { 10072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t test_func; 10082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj char * name; 10092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj precision_type_t precision; 10102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} simple_test_t; 10112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void setup_sp_fp_args(fp_test_args_t * targs, Bool swap_inputs) 10142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 10152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int a_idx, b_idx, i; 10162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj void * inA, * inB; 10172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj void * vec_src = swap_inputs ? &vec_out : &vec_inB; 10182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < 4; i++) { 10202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj a_idx = targs->fra_idx; 10212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj b_idx = targs->frb_idx; 10222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inA = (void *)&spec_sp_fargs[a_idx]; 10232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&spec_sp_fargs[b_idx]; 10242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy single precision FP into vector element i 10252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(((void *)&vec_inA) + (i * 4), inA, 4); 10262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(vec_src + (i * 4), inB, 4); 10272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj targs++; 10282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 10302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void setup_dp_fp_args(fp_test_args_t * targs, Bool swap_inputs) 10322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 10332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int a_idx, b_idx, i; 10342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj void * inA, * inB; 10352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj void * vec_src = swap_inputs ? (void *)&vec_out : (void *)&vec_inB; 10362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < 2; i++) { 10382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj a_idx = targs->fra_idx; 10392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj b_idx = targs->frb_idx; 10402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inA = (void *)&spec_fargs[a_idx]; 10412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&spec_fargs[b_idx]; 10422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy double precision FP into vector element i 10432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(((void *)&vec_inA) + (i * 8), inA, 8); 10442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(vec_src + (i * 8), inB, 8); 10452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj targs++; 10462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 10482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define VX_NOT_CMP_OP 0xffffffff 10502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void print_vector_fp_result(unsigned int cc, vx_fp_test_t * test_group, int i, Bool print_vec_out) 10512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 10522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int a_idx, b_idx, k; 10532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj char * name = malloc(20); 10542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int dp = test_group->precision == DOUBLE_TEST ? 1 : 0; 10552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int loops = dp ? 2 : 4; 10562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj fp_test_args_t * targs = &test_group->targs[i]; 10572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * frA_dp, * frB_dp, * dst_dp; 10582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * frA_sp, *frB_sp, * dst_sp; 10592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj strcpy(name, test_group->name); 10602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s%s ", dp? i/2 : i/4, name, (do_dot ? "." : "")); 10612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (k = 0; k < loops; k++) { 10622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj a_idx = targs->fra_idx; 10632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj b_idx = targs->frb_idx; 10642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (k) 10652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" AND "); 10662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp) { 10672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frA_dp = (unsigned long long *)&spec_fargs[a_idx]; 10682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frB_dp = (unsigned long long *)&spec_fargs[b_idx]; 10692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("%016llx %s %016llx", *frA_dp, test_group->op, *frB_dp); 10702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 10712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frA_sp = (unsigned int *)&spec_sp_fargs[a_idx]; 10722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frB_sp = (unsigned int *)&spec_sp_fargs[b_idx]; 10732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("%08x %s %08x", *frA_sp, test_group->op, *frB_sp); 10742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj targs++; 10762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (cc != VX_NOT_CMP_OP) 10782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" ? cc=%x", cc); 10792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (print_vec_out) { 10812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp) { 10822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_dp = (unsigned long long *) &vec_out; 10832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" => %016llx %016llx\n", dst_dp[0], dst_dp[1]); 10842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 10852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_sp = (unsigned int *) &vec_out; 10862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" => %08x %08x %08x %08x\n", dst_sp[0], dst_sp[1], dst_sp[2], dst_sp[3]); 10872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 10892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n"); 10902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 10912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj free(name); 10922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 10932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 10962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_vsx_one_fp_arg(void) 10972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 10982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t func; 10992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int k; 11002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k = 0; 11012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj build_special_fargs_table(); 11022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 11032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj while ((func = vsx_one_fp_arg_tests[k].test_func)) { 11042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int idx, i; 11052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj vx_fp_test_t test_group = vsx_one_fp_arg_tests[k]; 11062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool estimate = (test_group.type == VX_ESTIMATE); 11072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool dp = (test_group.precision == DOUBLE_TEST) ? True : False; 11082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool is_sqrt = (strstr(test_group.name, "sqrt")) ? True : False; 11092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool is_scalar = (strstr(test_group.name, "xs")) ? True : False; 11102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool sparse_sp = False; 11112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int stride = dp ? 2 : 4; 11122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int loops = is_scalar ? 1 : stride; 11132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj stride = is_scalar ? 1: stride; 11142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 11152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* For conversions of single to double, the 128-bit input register is sparsely populated: 11162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * |___ SP___|_Unused_|___SP___|__Unused__| // for vector op 11172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * or 11182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * |___ SP___|_Unused_|_Unused_|__Unused__| // for scalar op 11192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * 11202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * For the vector op case, we need to adjust stride from '4' to '2', since 11212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * we'll only be loading two values per loop into the input register. 11222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 11232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (!dp && !is_scalar && test_group.type == VX_CONV_TO_DOUBLE) { 11242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj sparse_sp = True; 11252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj stride = 2; 11262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 11272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 11282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < test_group.num_tests; i+=stride) { 11292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * pv; 1130dd690bf8d81c9119a7228446be12e3366e202176carll void * inB, * vecB_void_ptr = (void *)&vec_inB; 11312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 11322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj pv = (unsigned int *)&vec_out; 11332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // clear vec_out 11342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (idx = 0; idx < 4; idx++, pv++) 11352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj *pv = 0; 11362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 11372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp) { 11382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int j; 11392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * frB_dp, *dst_dp; 11402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 11412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&spec_fargs[i + j]; 11422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy double precision FP into vector element i 1143dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && is_scalar) 1144dd690bf8d81c9119a7228446be12e3366e202176carll vecB_void_ptr += 8; 1145dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + (j * 8), inB, 8); 11462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 11472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 11482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 11492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_dp = (unsigned long long *) &vec_out; 1150dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && is_scalar) 1151dd690bf8d81c9119a7228446be12e3366e202176carll dst_dp++; 11522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s ", i/stride, test_group.name); 11532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 11542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (j) 11552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("; "); 11562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frB_dp = (unsigned long long *)&spec_fargs[i + j]; 11572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("%s(%016llx)", test_group.op, *frB_dp); 11582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (estimate) { 1159dd690bf8d81c9119a7228446be12e3366e202176carll Bool res = check_estimate(DOUBLE_TEST, is_sqrt, i + j, (isLE && is_scalar) ? 1: j); 11602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" ==> %s)", res ? "PASS" : "FAIL"); 11612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* For debugging . . . 11622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" ==> %s (res=%016llx)", res ? "PASS" : "FAIL", dst_dp[j]); 11632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 11642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 11652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj vx_fp_test_type type = test_group.type; 11662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj switch (type) { 11672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case VX_SCALAR_CONV_TO_WORD: 11682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dp[j] & 0x00000000ffffffffULL); 11692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 11702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj case VX_CONV_TO_SINGLE: 11712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dp[j] & 0xffffffff00000000ULL); 11722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj break; 11732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj default: // For VX_CONV_TO_DOUBLE and non-convert instructions . . . 11742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dp[j]); 11752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 11762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 11772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 11782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n"); 11792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 1180dd690bf8d81c9119a7228446be12e3366e202176carll int j; 11812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * frB_sp, * dst_sp = NULL; 11822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * dst_dp = NULL; 1183dd690bf8d81c9119a7228446be12e3366e202176carll if (sparse_sp) 11842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj loops = 2; 11852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 11862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&spec_sp_fargs[i + j]; 11872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy single precision FP into vector element i 1188dd690bf8d81c9119a7228446be12e3366e202176carll if (sparse_sp) { 1189dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1190dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + ((2 * j * 4) + 4), inB, 4); 1191dd690bf8d81c9119a7228446be12e3366e202176carll else 1192dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + ((2 * j * 4) ), inB, 4); 1193dd690bf8d81c9119a7228446be12e3366e202176carll } else { 1194dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && is_scalar) 1195dd690bf8d81c9119a7228446be12e3366e202176carll vecB_void_ptr += 12; 1196dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + (j * 4), inB, 4); 1197dd690bf8d81c9119a7228446be12e3366e202176carll } 11982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 11992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 12002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 1201dd690bf8d81c9119a7228446be12e3366e202176carll if (test_group.type == VX_CONV_TO_DOUBLE) { 12022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_dp = (unsigned long long *) &vec_out; 1203dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && is_scalar) 1204dd690bf8d81c9119a7228446be12e3366e202176carll dst_dp++; 1205dd690bf8d81c9119a7228446be12e3366e202176carll } else { 12062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_sp = (unsigned int *) &vec_out; 1207dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && is_scalar) 1208dd690bf8d81c9119a7228446be12e3366e202176carll dst_sp += 3; 1209dd690bf8d81c9119a7228446be12e3366e202176carll } 12102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // print result 12112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s ", i/stride, test_group.name); 12122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 12132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (j) 12142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("; "); 12152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frB_sp = (unsigned int *)&spec_sp_fargs[i + j]; 12162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("%s(%08x)", test_group.op, *frB_sp); 12172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (estimate) { 1218dd690bf8d81c9119a7228446be12e3366e202176carll Bool res = check_estimate(SINGLE_TEST, is_sqrt, i + j, (isLE && is_scalar) ? 3 : j); 12192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" ==> %s)", res ? "PASS" : "FAIL"); 12202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 12212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.type == VX_CONV_TO_DOUBLE) 12222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dp[j]); 12232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj else 12242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* Special case: Current VEX implementation for fsqrts (single precision) 12252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * uses the same implementation as that used for double precision fsqrt. 12262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * However, I've found that for xvsqrtsp, the result from that implementation 12272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * may be off by the two LSBs. Generally, even this small inaccuracy can cause the 12282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * output to appear very different if you end up with a carry. But for the given 12292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * inputs in this testcase, we can simply mask out these bits. 12302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 12312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %08x", is_sqrt ? (dst_sp[j] & 0xfffffffc) : dst_sp[j]); 12322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n"); 12352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k++; 12382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "\n" ); 12392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 12412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_int_to_fp_convert(void) 12432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 12442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t func; 12452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int k; 12462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k = 0; 12472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj while ((func = intToFp_tests[k].test_func)) { 12492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int idx, i; 12502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj vx_intToFp_test_t test_group = intToFp_tests[k]; 12512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool dp = (test_group.precision == DOUBLE_TEST) ? True : False; 12522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool sparse_sp = False; 12532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int stride = dp ? 2 : 4; 12542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int loops = stride; 12552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj /* For conversions of single to double, the 128-bit input register is sparsely populated: 12572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * |___ int___|_Unused_|___int___|__Unused__| // for vector op 12582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * or 12592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * We need to adjust stride from '4' to '2', since we'll only be loading 12602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj * two values per loop into the input register. 12612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj */ 12622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (!dp && test_group.type == VX_CONV_TO_DOUBLE) { 12632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj sparse_sp = True; 12642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj stride = 2; 12652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < test_group.num_tests; i+=stride) { 12682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * pv; 12692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj void * inB; 12702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj pv = (unsigned int *)&vec_out; 12722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // clear vec_out 12732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (idx = 0; idx < 4; idx++, pv++) 12742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj *pv = 0; 12752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp) { 12772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int j; 12782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long *dst_dw, * targs = test_group.targs; 12792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 12802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&targs[i + j]; 12812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy doubleword into vector element i 12822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(((void *)&vec_inB) + (j * 8), inB, 8); 12832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 12852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 12862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_dw = (unsigned long long *) &vec_out; 12872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s ", i/stride, test_group.name); 12882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 12892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (j) 12902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("; "); 12912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("conv(%016llx)", targs[i + j]); 12922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 12932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.type == VX_CONV_TO_SINGLE) 12942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dw[j] & 0xffffffff00000000ULL); 12952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj else 12962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dw[j]); 12972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 12982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n"); 12992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 1300dd690bf8d81c9119a7228446be12e3366e202176carll int j; 13012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * dst_sp = NULL; 13022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * targs = test_group.targs; 13032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * dst_dp = NULL; 1304dd690bf8d81c9119a7228446be12e3366e202176carll void * vecB_void_ptr = (void *)&vec_inB; 1305dd690bf8d81c9119a7228446be12e3366e202176carll if (sparse_sp) 13062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj loops = 2; 13072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 13082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&targs[i + j]; 13092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy single word into vector element i 1310dd690bf8d81c9119a7228446be12e3366e202176carll if (sparse_sp) { 1311dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1312dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + ((2 * j * 4) + 4), inB, 4); 1313dd690bf8d81c9119a7228446be12e3366e202176carll else 1314dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + ((2 * j * 4) ), inB, 4); 1315dd690bf8d81c9119a7228446be12e3366e202176carll } else { 1316dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + (j * 4), inB, 4); 1317dd690bf8d81c9119a7228446be12e3366e202176carll } 13182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 13192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 13202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 13212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.type == VX_CONV_TO_DOUBLE) 13222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_dp = (unsigned long long *) &vec_out; 13232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj else 13242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj dst_sp = (unsigned int *) &vec_out; 13252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // print result 13262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s ", i/stride, test_group.name); 13272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 13282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (j) 13292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("; "); 13302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("conv(%08x)", targs[i + j]); 13312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.type == VX_CONV_TO_DOUBLE) 13322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %016llx", dst_dp[j]); 13332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj else 13342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" = %08x", dst_sp[j]); 13352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 13362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n"); 13372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 13382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 13392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k++; 13402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "\n" ); 13412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 13422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 13432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj// The div doubleword test data 13472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjsigned long long div_dw_tdata[13][2] = { 13482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 4, -4 }, 13492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 4, -3 }, 13502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 4, 4 }, 13512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 4, -5 }, 13522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 3, 8 }, 13537ea7aa23b433745c5ba163add38415aa79c92344bart { 0x8000000000000000ULL, 0xa }, 13542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0x50c, -1 }, 13552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0x50c, -4096 }, 13562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0x1234fedc, 0x8000a873 }, 13577ea7aa23b433745c5ba163add38415aa79c92344bart { 0xabcd87651234fedcULL, 0xa123b893 }, 13587ea7aa23b433745c5ba163add38415aa79c92344bart { 0x123456789abdcULL, 0 }, 13592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0, 2 }, 13602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0x77, 0xa3499 } 13612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 13622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define dw_tdata_len (sizeof(div_dw_tdata)/sizeof(signed long long)/2) 13632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj// The div word test data 13652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjunsigned int div_w_tdata[6][2] = { 13662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0, 2 }, 13672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 2, 0 }, 13682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0x7abc1234, 0xf0000000 }, 13692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 0xfabc1234, 5 }, 13702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 77, 66 }, 13712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { 5, 0xfabc1234 }, 13722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 13732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#define w_tdata_len (sizeof(div_w_tdata)/sizeof(unsigned int)/2) 13742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtypedef struct div_ext_test 13762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 13772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t test_func; 13782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj const char *name; 13792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int num_tests; 13802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj div_type_t div_type; 13812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj precision_type_t precision; 13822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} div_ext_test_t; 13832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic div_ext_test_t div_tests[] = { 13852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#ifdef __powerpc64__ 13862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_divdeu, "divdeu", dw_tdata_len, DIV_BASE, DOUBLE_TEST }, 13872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_divdeu, "divdeuo", dw_tdata_len, DIV_OE, DOUBLE_TEST }, 13882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif 13892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_divwe, "divwe", w_tdata_len, DIV_BASE, SINGLE_TEST }, 13902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_divwe, "divweo", w_tdata_len, DIV_OE, SINGLE_TEST }, 13912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { NULL, NULL, 0, 0, 0 } 13922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 13932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 13942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_div_extensions(void) 13952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 13962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t func; 13972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int k; 13982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k = 0; 13992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj while ((func = div_tests[k].test_func)) { 14012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int i, repeat = 1; 14022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj div_ext_test_t test_group = div_tests[k]; 14032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do_dot = False; 14042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjagain: 14062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < test_group.num_tests; i++) { 14072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int condreg; 14082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.div_type == DIV_OE) 14102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do_OE = True; 14112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj else 14122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do_OE = False; 14132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.precision == DOUBLE_TEST) { 14152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj r14 = div_dw_tdata[i][0]; 14162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj r15 = div_dw_tdata[i][1]; 14172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 14182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj r14 = div_w_tdata[i][0]; 14192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj r15 = div_w_tdata[i][1]; 14202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 14222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 14232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj condreg = (div_flags & 0xf0000000) >> 28; 14242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s%s: ", i, test_group.name, do_dot ? "." : ""); 14252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (test_group.precision == DOUBLE_TEST) { 14262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("0x%016llx0000000000000000 / 0x%016llx = 0x%016llx;", 14272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj div_dw_tdata[i][0], div_dw_tdata[i][1], (signed long long) r17); 14282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 14292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("0x%08x00000000 / 0x%08x = 0x%08x;", 14302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj div_w_tdata[i][0], div_w_tdata[i][1], (unsigned int) r17); 14312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf(" CR=%x; XER=%x\n", condreg, div_xer); 14332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("\n"); 14352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (repeat) { 14362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj repeat = 0; 14372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do_dot = True; 14382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj goto again; 14392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k++; 14412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "\n" ); 14422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 14442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_vx_tdivORtsqrt(void) 14472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 14482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t func; 14492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int k, crx; 14502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int flags; 14512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k = 0; 14522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj do_dot = False; 14532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj build_special_fargs_table(); 14542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj while ((func = vx_tdivORtsqrt_tests[k].test_func)) { 14562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int idx, i; 14572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj vx_fp_test_t test_group = vx_tdivORtsqrt_tests[k]; 14582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool dp = (test_group.precision == DOUBLE_TEST) ? True : False; 14592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool is_scalar = (strstr(test_group.name, "xs")) ? True : False; 14602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj Bool two_args = test_group.targs ? True : False; 14612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int stride = dp ? 2 : 4; 14622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int loops = is_scalar ? 1 : stride; 14632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj stride = is_scalar ? 1: stride; 14642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < test_group.num_tests; i+=stride) { 14662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * pv; 1467dd690bf8d81c9119a7228446be12e3366e202176carll void * inB, * vecB_void_ptr = (void *)&vec_inB; 14682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj pv = (unsigned int *)&vec_out; 14702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // clear vec_out 14712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (idx = 0; idx < 4; idx++, pv++) 14722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj *pv = 0; 14732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 14742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (dp) { 14752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int j; 14762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * frB_dp; 14772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (two_args) { 14782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj setup_dp_fp_args(&test_group.targs[i], False); 14792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 14802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 14812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&spec_fargs[i + j]; 14822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy double precision FP into vector element i 1483dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && is_scalar) 1484dd690bf8d81c9119a7228446be12e3366e202176carll vecB_void_ptr += 8; 1485dd690bf8d81c9119a7228446be12e3366e202176carll memcpy(vecB_void_ptr + (j * 8), inB, 8); 14862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 14882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 14892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // Must do set/get of CRs immediately before/after calling the asm func 14902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // to avoid CRs being modified by other instructions. 14912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_FPSCR_ZERO; 14922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 14932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 14942062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR(flags); 14952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // assumes using CR1 14962062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj crx = (flags & 0x0f000000) >> 24; 14972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (two_args) { 14982062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj print_vector_fp_result(crx, &test_group, i, False/*do not print vec_out*/); 14992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 15002062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s ", i/stride, test_group.name); 15012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 15022062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (j) 15032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("; "); 15042062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frB_dp = (unsigned long long *)&spec_fargs[i + j]; 15052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("%s(%016llx)", test_group.op, *frB_dp); 15062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( " ? %x (CRx)\n", crx); 15082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15092062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 15102062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int j; 15112062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int * frB_sp; 15122062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (two_args) { 15132062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj setup_sp_fp_args(&test_group.targs[i], False); 15142062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 15152062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 15162062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj inB = (void *)&spec_sp_fargs[i + j]; 15172062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // copy single precision FP into vector element i 15182062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj memcpy(((void *)&vec_inB) + (j * 4), inB, 4); 15192062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15202062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // execute test insn 15222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_FPSCR_ZERO; 15232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 15242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj (*func)(); 15252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR(flags); 15262062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj crx = (flags & 0x0f000000) >> 24; 15272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj // print result 15282062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (two_args) { 15292062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj print_vector_fp_result(crx, &test_group, i, False/*do not print vec_out*/); 15302062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } else { 15312062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("#%d: %s ", i/stride, test_group.name); 15322062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (j = 0; j < loops; j++) { 15332062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (j) 15342062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("; "); 15352062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frB_sp = (unsigned int *)&spec_sp_fargs[i + j]; 15362062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("%s(%08x)", test_group.op, *frB_sp); 15372062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15382062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( " ? %x (CRx)\n", crx); 15392062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15402062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15412062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15422062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj k++; 15432062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "\n" ); 15442062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15452062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 15462062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15472062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15482062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void test_ftsqrt(void) 15492062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 15502062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int i, crx; 15512062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int flags; 15522062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long * frbp; 15532062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj build_special_fargs_table(); 15542062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15552062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15562062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj for (i = 0; i < nb_special_fargs; i++) { 15572062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj f14 = spec_fargs[i]; 15582062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj frbp = (unsigned long long *)&spec_fargs[i]; 15592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_FPSCR_ZERO; 15602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj SET_CR_XER_ZERO; 15612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("ftsqrt cr1, %0" : : "d" (f14)); 15622062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj GET_CR(flags); 15632062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj crx = (flags & 0x0f000000) >> 24; 15642062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "ftsqrt: %016llx ? %x (CRx)\n", *frbp, crx); 15652062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 15662062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "\n" ); 15672062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 15682062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic void 15702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjtest_popcntw(void) 15712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 15722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#ifdef __powerpc64__ 15732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj uint64_t res; 15742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned long long src = 0x9182736405504536ULL; 15752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj r14 = src; 15762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("popcntw %0, %1" : "=r" (res): "r" (r14)); 15772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("popcntw: 0x%llx => 0x%016llx\n", (unsigned long long)src, (unsigned long long)res); 15782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#else 15792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj uint32_t res; 15802062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj unsigned int src = 0x9182730E; 15812062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj r14 = src; 15822062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj __asm__ __volatile__ ("popcntw %0, %1" : "=r" (res): "r" (r14)); 15832062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf("popcntw: 0x%x => 0x%08x\n", src, (int)res); 15842062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif 15852062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj printf( "\n" ); 15862062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 15872062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15882062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15892062dc6ae4b4674619f0e330a551e18f0ea21da1sewardjstatic test_table_t 15902062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj all_tests[] = 15912062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 15922062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 15932062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_vsx_one_fp_arg, 1594ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Test VSX vector and scalar single argument instructions", OTHER_INST } , 15952062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_int_to_fp_convert, 1596ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Test VSX vector integer to float conversion instructions", OTHER_INST }, 15972062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_div_extensions, 1598ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Test div extensions", SCALAR_DIV_INST }, 15992062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_ftsqrt, 1600ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Test ftsqrt instruction", OTHER_INST }, 16012062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_vx_tdivORtsqrt, 1602ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Test vector and scalar tdiv and tsqrt instructions", OTHER_INST }, 16032062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { &test_popcntw, 1604ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Test popcntw instruction", OTHER_INST }, 16052062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj { NULL, NULL } 16062062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj}; 16072062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif // HAS_VSX 16082062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 1609ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesstatic void usage (void) 1610ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes{ 1611ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes fprintf(stderr, 1612ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "Usage: test_isa_3_0 [OPTIONS]\n" 1613ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "\t-d: test scalar division instructions (default)\n" 1614ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "\t-o: test non scalar division instructions (default)\n" 1615ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "\t-A: test all instructions (default)\n" 1616ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes "\t-h: display this help and exit\n" 1617ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes ); 1618ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes} 1619ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes 1620ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesint main(int argc, char **argv) 16212062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj{ 16222062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#ifdef HAS_VSX 16232062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 16242062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_table_t aTest; 16252062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj test_func_t func; 1626ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes int c; 16272062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj int i = 0; 1628ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes unsigned int test_run_mask = 0; 1629ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes 1630ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes /* NOTE, ISA 3.0 introduces the OV32 and CA32 bits in the FPSCR. These 1631ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes * bits are set on various arithimetic instructions. This means this 1632ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes * test generates different FPSCR output for pre ISA 3.0 versus ISA 3.0 1633ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes * hardware. The tests have been grouped so that the tests that generate 1634ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes * different results are in one test and the rest are in a different test. 1635ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes * this minimizes the size of the result expect files for the two cases. 1636ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes */ 1637ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes 1638ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes while ((c = getopt(argc, argv, "doAh")) != -1) { 1639ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes switch (c) { 1640ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes case 'd': 1641ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes test_run_mask |= SCALAR_DIV_INST; 1642ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes break; 1643ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes case 'o': 1644ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes test_run_mask |= OTHER_INST; 1645ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes break; 1646ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes case 'A': 1647ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes test_run_mask = 0xFFFF; 1648ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes break; 1649ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes case 'h': 1650ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes usage(); 1651ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes return 0; 1652ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes 1653ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes default: 1654ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes usage(); 1655ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes fprintf(stderr, "Unknown argument: '%c'\n", c); 1656ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes return 1; 1657ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes } 1658ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes } 16592062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 16602062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj while ((func = all_tests[i].test_category)) { 16612062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj aTest = all_tests[i]; 1662ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes 1663ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes if(test_run_mask & aTest.test_group) { 1664ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes /* Test group specified on command line */ 1665ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes 1666ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes printf( "%s\n", aTest.name ); 1667ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes (*func)(); 1668ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes } 16692062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj i++; 16702062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj } 16712062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (spec_fargs) 16722062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj free(spec_fargs); 16732062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj if (spec_sp_fargs) 16742062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj free(spec_sp_fargs); 16752062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 16762062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj#endif // HAS _VSX 16772062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj 16782062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj return 0; 16792062dc6ae4b4674619f0e330a551e18f0ea21da1sewardj} 1680