1dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* HOW TO COMPILE: 3dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 4dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 32bit build: 56277067119ad816282b8e57727295b3adee14075carll gcc -Winline -Wall -g -O -mregnames -maltivec -m32 6dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 64bit build: 7dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll gcc -Winline -Wall -g -O -mregnames -maltivec -m64 8dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 9dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll * test_isa_2_07_part1.c: 11dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * PPC tests for the ISA 2.07. This file is based on the 12dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * jm-insns.c file for the new instructions in the ISA 2.07. The 13dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * test structure has been kept the same as the original file to 14dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * the extent possible. 15dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 16dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Copyright (C) 2013 IBM 17dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 18dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Authors: Carl Love <carll@us.ibm.com> 19dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Maynard Johnson <maynardj@us.ibm.com> 20dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 21dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * This program is free software; you can redistribute it and/or 22dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * modify it under the terms of the GNU General Public License as 23dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * published by the Free Software Foundation; either version 2 of the 24dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * License, or (at your option) any later version. 25dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 26dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * This program is distributed in the hope that it will be useful, 27dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * but WITHOUT ANY WARRANTY; without even the implied warranty of 28dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * GNU General Public License for more details. 30dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 31dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * You should have received a copy of the GNU General Public License 32dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * along with this program; if not, write to the Free Software 33dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 34dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 35dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 36dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 37dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* 38dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * Operation details 39dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * ----------------- 40dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 41dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * The 'loops' (e.g. int_loops) do the actual work: 42dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - loops over as many arguments as the insn needs (regs | imms) 43dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - sets up the environment (reset cr,xer, assign src regs...) 44dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - maybe modifies the asm instn to test different imm args 45dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - calls the test function 46dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - retrieves relevant register data (rD,cr,xer,...) 47dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - prints argument and result data. 48dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 49dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * More specifically... 50dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 51dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * all_tests[i] holds insn tests 52dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * - of which each holds: {instn_test_arr[], description, flags} 53dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 54dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * flags hold 3 instn classifiers: {family, type, arg_type} 55dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 56dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // The main test loop: 57dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * do_tests( user_ctl_flags ) { 58dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * foreach(curr_test = all_test[i]) { 59dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 60dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // flags are used to control what tests are run: 61dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * if (curr_test->flags && !user_ctl_flags) 62dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * continue; 63dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 64dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // a 'loop_family_arr' is chosen based on the 'family' flag... 65dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * switch(curr_test->flags->family) { 66dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * case x: loop_family_arr = int_loops; 67dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * ... 68dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * } 69dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 70dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // ...and the actual test_loop to run is found by indexing into 71dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // the loop_family_arr with the 'arg_type' flag: 72dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * test_loop = loop_family[curr_test->flags->arg_type] 73dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 74dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // finally, loop over all instn tests for this test: 75dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * foreach (instn_test = curr_test->instn_test_arr[i]) { 76dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 77dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * // and call the test_loop with the current instn_test function,name 78dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * test_loop( instn_test->func, instn_test->name ) 79dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * } 80dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * } 81dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * } 82dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * 83dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 84dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 85dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 86dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/**********************************************************************/ 87dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 88dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Uncomment to enable output of CR flags for float tests */ 89dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll//#define TEST_FLOAT_FLAGS 90dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 91dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Uncomment to enable debug output */ 92dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll//#define DEBUG_ARGS_BUILD 93dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll//#define DEBUG_FILTER 94dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 95dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/**********************************************************************/ 96dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <stdio.h> 97dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 98dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#ifdef HAS_ISA_2_07 99dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 100dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include "config.h" 101dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <altivec.h> 102dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <stdint.h> 103dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 104dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <assert.h> 105dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <ctype.h> // isspace 106dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <stdlib.h> 107dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <string.h> 108dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include <unistd.h> // getopt 109dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 110dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#if !defined (__TEST_PPC_H__) 111dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define __TEST_PPC_H__ 112dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 113dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include "tests/sys_mman.h" 114dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#include "tests/malloc.h" // memalign16 115dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 116dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define STATIC_ASSERT(e) sizeof(struct { int:-!(e); }) 117dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 118dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Something of the same size as void*, so can be safely be coerced 119dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * to/from a pointer type. Also same size as the host's gp registers. 120dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * According to the AltiVec section of the GCC manual, the syntax does 121dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * not allow the use of a typedef name as a type specifier in conjunction 122dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * with the vector keyword, so typedefs uint[32|64]_t are #undef'ed here 123dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * and redefined using #define. 124dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 125dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#undef uint32_t 126dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#undef uint64_t 127dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define uint32_t unsigned int 128dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define uint64_t unsigned long long int 129dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 130dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#ifndef __powerpc64__ 131dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef uint32_t HWord_t; 132a81925998c22a5af981c6933f56f24437e790447carll#define ZERO 0 133dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else 134dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef uint64_t HWord_t; 135a81925998c22a5af981c6933f56f24437e790447carll#define ZERO 0ULL 136dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif /* __powerpc64__ */ 137dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 138dd690bf8d81c9119a7228446be12e3366e202176carll#ifdef VGP_ppc64le_linux 139dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 1 140dd690bf8d81c9119a7228446be12e3366e202176carll#else 141dd690bf8d81c9119a7228446be12e3366e202176carll#define isLE 0 142dd690bf8d81c9119a7228446be12e3366e202176carll#endif 143dd690bf8d81c9119a7228446be12e3366e202176carll 144dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef uint64_t Word_t; 145dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 146dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllenum { 147dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll compile_time_test1 = STATIC_ASSERT(sizeof(uint32_t) == 4), 148dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll compile_time_test2 = STATIC_ASSERT(sizeof(uint64_t) == 8), 149dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 150dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 151dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" 152dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 153dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_CR(_arg) \ 154dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR ); 155dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 156dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_XER(_arg) \ 157dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" ); 158dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 159dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define GET_CR(_lval) \ 160dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mfcr %0" : "=b"(_lval) ) 161dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 162dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define GET_XER(_lval) \ 163dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) ) 164dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 165dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define GET_CR_XER(_lval_cr,_lval_xer) \ 166dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0) 167dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 168dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_CR_ZERO \ 169dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll SET_CR(0) 170dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 171dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_XER_ZERO \ 172dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll SET_XER(0) 173dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 174dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_CR_XER_ZERO \ 175dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll do { SET_CR_ZERO; SET_XER_ZERO; } while (0) 176dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 177dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define SET_FPSCR_ZERO \ 178dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll do { double _d = 0.0; \ 179dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \ 180dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } while (0) 181dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 182dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define DEFAULT_VSCR 0x0 183dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 18424e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic vector unsigned long long vec_out, vec_inA, vec_inB, vec_inC; 1856277067119ad816282b8e57727295b3adee14075carllstatic vector unsigned int vec_inA_wd, vec_inB_wd; 186dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 187dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* XXXX these must all be callee-save regs! */ 188dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f14 __asm__ ("fr14"); 189dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f15 __asm__ ("fr15"); 190dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f16 __asm__ ("fr16"); 191dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister double f17 __asm__ ("fr17"); 192dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister HWord_t r14 __asm__ ("r14"); 193a81925998c22a5af981c6933f56f24437e790447carllregister HWord_t r15 __asm__ ("r15"); 194a81925998c22a5af981c6933f56f24437e790447carllregister HWord_t r16 __asm__ ("r16"); 195dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllregister HWord_t r17 __asm__ ("r17"); 196dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 197dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef void (*test_func_t) (void); 198dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct _test test_t; 199dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct _test_table test_table_t; 200dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstruct _test { 201dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll test_func_t func; 202dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll const char *name; 203dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 204dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 205dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstruct _test_table { 206dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll test_t *tests; 207dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll const char *name; 208dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll uint32_t flags; 209dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 210dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 211dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef void (*test_loop_t) (const char *name, test_func_t func, 212dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll uint32_t flags); 213dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 214dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllenum test_flags { 215dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Nb arguments */ 216dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_ONE_ARG = 0x00000001, 217dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_TWO_ARGS = 0x00000002, 218dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_THREE_ARGS = 0x00000003, 219dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_CMP_ARGS = 0x00000004, // family: compare 220dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_CMPI_ARGS = 0x00000005, // family: compare 221dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_TWO_I16 = 0x00000006, // family: arith/logical 222dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_SPECIAL = 0x00000007, // family: logical 223dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_LD_ARGS = 0x00000008, // family: ldst 224dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_LDX_ARGS = 0x00000009, // family: ldst 225dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_ST_ARGS = 0x0000000A, // family: ldst 226dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_STX_ARGS = 0x0000000B, // family: ldst 227dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_STQ_ARGS = 0x0000000C, // family: ldst, two args, imm 228dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_LDQ_ARGS = 0x0000000D, // family: ldst, two args, imm 229dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_STQX_ARGS = 0x0000000E, // family: ldst, three args 230dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_LDQX_ARGS = 0x0000000F, // family: ldst, three_args 231dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_NB_ARGS = 0x0000000F, 232dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Type */ 233dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_ARITH = 0x00000100, 234dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_LOGICAL = 0x00000200, 235dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_COMPARE = 0x00000300, 236dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_CROP = 0x00000400, 237dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_LDST = 0x00000500, 238dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_POPCNT = 0x00000600, 2396277067119ad816282b8e57727295b3adee14075carll PPC_ARITH_DRES = 0x00000700, 2406277067119ad816282b8e57727295b3adee14075carll PPC_DOUBLE_IN_IRES = 0x00000800, 241dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_MOV = 0x00000A00, 24224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll PPC_SHA_OR_BCD = 0x00000B00, 243dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_TYPE = 0x00000F00, 244dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Family */ 245dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_INTEGER = 0x00010000, 246dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_FLOAT = 0x00020000, 247dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_405 = 0x00030000, // Leave so we keep numbering consistent 248dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_ALTIVEC = 0x00040000, 249dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_FALTIVEC = 0x00050000, 2506277067119ad816282b8e57727295b3adee14075carll PPC_ALTIVECD = 0x00060000, /* double word Altivec tests */ 251e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll PPC_ALTIVECQ = 0x00070000, 252dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_FAMILY = 0x000F0000, 253dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Flags: these may be combined, so use separate bitfields. */ 254dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_CR = 0x01000000, 255dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll PPC_XER_CA = 0x02000000, 256dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 257dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 258dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif /* !defined (__TEST_PPC_H__) */ 259dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 260dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* -------------- END #include "test-ppc.h" -------------- */ 261dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 262dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 263dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#if defined (DEBUG_ARGS_BUILD) 264dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0) 265dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else 266dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define AB_DPRINTF(fmt, args...) do { } while (0) 267dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif 268dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2696277067119ad816282b8e57727295b3adee14075carll 270dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#if defined (DEBUG_FILTER) 271dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define FDPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0) 272dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else 273dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define FDPRINTF(fmt, args...) do { } while (0) 274dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif 275dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 276dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#define unused __attribute__ (( unused )) 277dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 278dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct special { 279dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll const char *name; 280dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll void (*test_cb)(const char* name, test_func_t func, 281dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unused uint32_t test_flags); 282dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} special_t; 283dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 284a81925998c22a5af981c6933f56f24437e790447carllstatic void test_stq(void) 285a81925998c22a5af981c6933f56f24437e790447carll{ 286a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("stq %0, 0(%1)" : :"r" (r14), "r" (r16)); 287a81925998c22a5af981c6933f56f24437e790447carll} 288a81925998c22a5af981c6933f56f24437e790447carll 289a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_istq_ops_two_i16[] = { 290a81925998c22a5af981c6933f56f24437e790447carll { &test_stq , "stq", }, 291a81925998c22a5af981c6933f56f24437e790447carll { NULL, NULL, }, 292a81925998c22a5af981c6933f56f24437e790447carll}; 293a81925998c22a5af981c6933f56f24437e790447carll 294a81925998c22a5af981c6933f56f24437e790447carllstatic void test_lq(void) 295a81925998c22a5af981c6933f56f24437e790447carll{ 296a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("lq %0, 0(%1)" : :"r" (r14), "r" (r16)); 297a81925998c22a5af981c6933f56f24437e790447carll} 298a81925998c22a5af981c6933f56f24437e790447carll 299a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_ildq_ops_two_i16[] = { 300a81925998c22a5af981c6933f56f24437e790447carll { &test_lq , "lq", }, 301a81925998c22a5af981c6933f56f24437e790447carll { NULL, NULL, }, 302a81925998c22a5af981c6933f56f24437e790447carll}; 303a81925998c22a5af981c6933f56f24437e790447carll 304a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07 305a81925998c22a5af981c6933f56f24437e790447carllWord_t * mem_resv; 306a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_stbcx(void) 307a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{ 308a89b04673925f2b40bbc8e060c8aa9f5d451b680carll /* Have to do the lbarx to the memory address to create the reservation 309a89b04673925f2b40bbc8e060c8aa9f5d451b680carll * or the store will not occur. 310a89b04673925f2b40bbc8e060c8aa9f5d451b680carll */ 311a89b04673925f2b40bbc8e060c8aa9f5d451b680carll __asm__ __volatile__ ("lbarx %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17)); 312a89b04673925f2b40bbc8e060c8aa9f5d451b680carll r14 = (HWord_t) 0xABEFCD0145236789ULL; 313a89b04673925f2b40bbc8e060c8aa9f5d451b680carll r15 = (HWord_t) 0x1155337744226688ULL; 314a89b04673925f2b40bbc8e060c8aa9f5d451b680carll __asm__ __volatile__ ("stbcx. %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17)); 315a89b04673925f2b40bbc8e060c8aa9f5d451b680carll} 316a89b04673925f2b40bbc8e060c8aa9f5d451b680carll 317a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_sthcx(void) 318a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{ 319a89b04673925f2b40bbc8e060c8aa9f5d451b680carll /* Have to do the lharx to the memory address to create the reservation 320a89b04673925f2b40bbc8e060c8aa9f5d451b680carll * or the store will not occur. 321a89b04673925f2b40bbc8e060c8aa9f5d451b680carll */ 322a89b04673925f2b40bbc8e060c8aa9f5d451b680carll __asm__ __volatile__ ("lharx %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17)); 323a89b04673925f2b40bbc8e060c8aa9f5d451b680carll r14 = (HWord_t) 0xABEFCD0145236789ULL; 324a89b04673925f2b40bbc8e060c8aa9f5d451b680carll r15 = (HWord_t) 0x1155337744226688ULL; 325a89b04673925f2b40bbc8e060c8aa9f5d451b680carll __asm__ __volatile__ ("sthcx. %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17)); 326a89b04673925f2b40bbc8e060c8aa9f5d451b680carll} 327a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif 328a89b04673925f2b40bbc8e060c8aa9f5d451b680carll 329a81925998c22a5af981c6933f56f24437e790447carllstatic void test_stqcx(void) 330a81925998c22a5af981c6933f56f24437e790447carll{ 331a81925998c22a5af981c6933f56f24437e790447carll /* Have to do the lqarx to the memory address to create the reservation 332a81925998c22a5af981c6933f56f24437e790447carll * or the store will not occur. 333a81925998c22a5af981c6933f56f24437e790447carll */ 334a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("lqarx %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17)); 335a81925998c22a5af981c6933f56f24437e790447carll r14 = (HWord_t) 0xABEFCD0145236789ULL; 336a81925998c22a5af981c6933f56f24437e790447carll r15 = (HWord_t) 0x1155337744226688ULL; 337a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("stqcx. %0, %1, %2" : :"r" (r14), "r" (r16),"r" (r17)); 338a81925998c22a5af981c6933f56f24437e790447carll} 339a81925998c22a5af981c6933f56f24437e790447carll 340a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_stq_ops_three[] = { 341a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07 342a89b04673925f2b40bbc8e060c8aa9f5d451b680carll { &test_stbcx , "stbcx.", }, 343a89b04673925f2b40bbc8e060c8aa9f5d451b680carll { &test_sthcx , "sthcx.", }, 344a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif 345a81925998c22a5af981c6933f56f24437e790447carll { &test_stqcx , "stqcx.", }, 346a81925998c22a5af981c6933f56f24437e790447carll { NULL, NULL, }, 347a81925998c22a5af981c6933f56f24437e790447carll}; 348a81925998c22a5af981c6933f56f24437e790447carll 349a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07 350a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_lbarx(void) 351a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{ 352a89b04673925f2b40bbc8e060c8aa9f5d451b680carll __asm__ __volatile__ ("lbarx %0, %1, %2, 0" : :"r" (r14), "r" (r16),"r" (r17)); 353a89b04673925f2b40bbc8e060c8aa9f5d451b680carll} 354a89b04673925f2b40bbc8e060c8aa9f5d451b680carllstatic void test_lharx(void) 355a89b04673925f2b40bbc8e060c8aa9f5d451b680carll{ 356a89b04673925f2b40bbc8e060c8aa9f5d451b680carll __asm__ __volatile__ ("lharx %0, %1, %2, 0" : :"r" (r14), "r" (r16),"r" (r17)); 357a89b04673925f2b40bbc8e060c8aa9f5d451b680carll} 358a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif 359a81925998c22a5af981c6933f56f24437e790447carllstatic void test_lqarx(void) 360a81925998c22a5af981c6933f56f24437e790447carll{ 361a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("lqarx %0, %1, %2, 0" : :"r" (r14), "r" (r16),"r" (r17)); 362a81925998c22a5af981c6933f56f24437e790447carll} 363a81925998c22a5af981c6933f56f24437e790447carll 364a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_ldq_ops_three[] = { 365a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#ifdef HAS_ISA_2_07 366a89b04673925f2b40bbc8e060c8aa9f5d451b680carll { &test_lbarx , "lbarx", }, 367a89b04673925f2b40bbc8e060c8aa9f5d451b680carll { &test_lharx , "lharx", }, 368a89b04673925f2b40bbc8e060c8aa9f5d451b680carll#endif 369a81925998c22a5af981c6933f56f24437e790447carll { &test_lqarx , "lqarx", }, 370a81925998c22a5af981c6933f56f24437e790447carll { NULL, NULL, }, 371a81925998c22a5af981c6933f56f24437e790447carll}; 372a81925998c22a5af981c6933f56f24437e790447carll 373a81925998c22a5af981c6933f56f24437e790447carllstatic void test_fmrgew (void) 374a81925998c22a5af981c6933f56f24437e790447carll{ 375a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("fmrgew 17,14,15"); 376a81925998c22a5af981c6933f56f24437e790447carll}; 377a81925998c22a5af981c6933f56f24437e790447carll 378a81925998c22a5af981c6933f56f24437e790447carllstatic void test_fmrgow (void) 379a81925998c22a5af981c6933f56f24437e790447carll{ 380a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("fmrgow 17,14,15"); 381a81925998c22a5af981c6933f56f24437e790447carll}; 382a81925998c22a5af981c6933f56f24437e790447carll 383a81925998c22a5af981c6933f56f24437e790447carll 384dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 385dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll// VSX move instructions 386dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_mfvsrd (void) 387dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 388dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mfvsrd %0,%x1" : "=r" (r14) : "ws" (vec_inA)); 389dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 390dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 391a81925998c22a5af981c6933f56f24437e790447carllstatic void test_mfvsrwz (void) 392a81925998c22a5af981c6933f56f24437e790447carll{ 393a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("mfvsrwz %0,%x1" : "=r" (r14) : "ws" (vec_inA)); 394a81925998c22a5af981c6933f56f24437e790447carll}; 395a81925998c22a5af981c6933f56f24437e790447carll 396dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_mtvsrd (void) 397dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 398dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mtvsrd %x0,%1" : "=ws" (vec_out) : "r" (r14)); 399dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 400dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 401a81925998c22a5af981c6933f56f24437e790447carllstatic void test_mtvsrwz (void) 402a81925998c22a5af981c6933f56f24437e790447carll{ 403a81925998c22a5af981c6933f56f24437e790447carll __asm__ __volatile__ ("mtvsrwz %x0,%1" : "=ws" (vec_out) : "r" (r14)); 404a81925998c22a5af981c6933f56f24437e790447carll}; 405a81925998c22a5af981c6933f56f24437e790447carll 406a81925998c22a5af981c6933f56f24437e790447carll 407dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_mtfprwa (void) 408dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 409dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("mtfprwa %x0,%1" : "=ws" (vec_out) : "r" (r14)); 410dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 411dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 412dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic test_t tests_move_ops_spe[] = { 413dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { &test_mfvsrd , "mfvsrd" }, 414a81925998c22a5af981c6933f56f24437e790447carll { &test_mfvsrwz , "mfvsrwz" }, 415dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { &test_mtvsrd , "mtvsrd" }, 416a81925998c22a5af981c6933f56f24437e790447carll { &test_mtvsrwz , "mtvsrwz" }, 417dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { &test_mtfprwa , "mtfprwa" }, 418dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { NULL, NULL } 419dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 420dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 4216277067119ad816282b8e57727295b3adee14075carll/* NOTE: Since these are "vector" instructions versus VSX, we must use 4226277067119ad816282b8e57727295b3adee14075carll * vector constraints. 4236277067119ad816282b8e57727295b3adee14075carll * 4246277067119ad816282b8e57727295b3adee14075carll * Vector Double Word tests. 4256277067119ad816282b8e57727295b3adee14075carll */ 4266277067119ad816282b8e57727295b3adee14075carllstatic void test_vpkudum (void) 4276277067119ad816282b8e57727295b3adee14075carll{ 4286277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vpkudum %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4296277067119ad816282b8e57727295b3adee14075carll} 4306277067119ad816282b8e57727295b3adee14075carll 431dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_vaddudm (void) 432dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 433dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll __asm__ __volatile__ ("vaddudm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 434dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 435dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 4366277067119ad816282b8e57727295b3adee14075carllstatic void test_vsubudm (void) 437dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 4386277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vsubudm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4396277067119ad816282b8e57727295b3adee14075carll} 4406277067119ad816282b8e57727295b3adee14075carll 4416277067119ad816282b8e57727295b3adee14075carllstatic void test_vmaxud (void) 4426277067119ad816282b8e57727295b3adee14075carll{ 4436277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmaxud %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4446277067119ad816282b8e57727295b3adee14075carll} 4456277067119ad816282b8e57727295b3adee14075carll 4466277067119ad816282b8e57727295b3adee14075carllstatic void test_vmaxsd (void) 4476277067119ad816282b8e57727295b3adee14075carll{ 4486277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmaxsd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4496277067119ad816282b8e57727295b3adee14075carll} 4506277067119ad816282b8e57727295b3adee14075carll 4516277067119ad816282b8e57727295b3adee14075carllstatic void test_vminud (void) 4526277067119ad816282b8e57727295b3adee14075carll{ 4536277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vminud %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4546277067119ad816282b8e57727295b3adee14075carll} 4556277067119ad816282b8e57727295b3adee14075carll 4566277067119ad816282b8e57727295b3adee14075carllstatic void test_vminsd (void) 4576277067119ad816282b8e57727295b3adee14075carll{ 4586277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vminsd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4596277067119ad816282b8e57727295b3adee14075carll} 4606277067119ad816282b8e57727295b3adee14075carll 4616277067119ad816282b8e57727295b3adee14075carllstatic void test_vcmpequd (void) 4626277067119ad816282b8e57727295b3adee14075carll{ 4636277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vcmpequd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4646277067119ad816282b8e57727295b3adee14075carll} 4656277067119ad816282b8e57727295b3adee14075carll 4666277067119ad816282b8e57727295b3adee14075carllstatic void test_vcmpgtud (void) 4676277067119ad816282b8e57727295b3adee14075carll{ 4686277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vcmpgtud %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4696277067119ad816282b8e57727295b3adee14075carll} 4706277067119ad816282b8e57727295b3adee14075carll 4716277067119ad816282b8e57727295b3adee14075carllstatic void test_vcmpgtsd (void) 4726277067119ad816282b8e57727295b3adee14075carll{ 4736277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vcmpgtsd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4746277067119ad816282b8e57727295b3adee14075carll} 4756277067119ad816282b8e57727295b3adee14075carll 4766277067119ad816282b8e57727295b3adee14075carllstatic void test_vrld (void) 4776277067119ad816282b8e57727295b3adee14075carll{ 4786277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vrld %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4796277067119ad816282b8e57727295b3adee14075carll} 4806277067119ad816282b8e57727295b3adee14075carll 4816277067119ad816282b8e57727295b3adee14075carllstatic void test_vsld (void) 4826277067119ad816282b8e57727295b3adee14075carll{ 4836277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vsld %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4846277067119ad816282b8e57727295b3adee14075carll} 4856277067119ad816282b8e57727295b3adee14075carll 4866277067119ad816282b8e57727295b3adee14075carllstatic void test_vsrad (void) 4876277067119ad816282b8e57727295b3adee14075carll{ 4886277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vsrad %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4896277067119ad816282b8e57727295b3adee14075carll} 4906277067119ad816282b8e57727295b3adee14075carll 4916277067119ad816282b8e57727295b3adee14075carllstatic void test_vsrd (void) 4926277067119ad816282b8e57727295b3adee14075carll{ 4936277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vsrd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 4946277067119ad816282b8e57727295b3adee14075carll} 4956277067119ad816282b8e57727295b3adee14075carll 4966277067119ad816282b8e57727295b3adee14075carll/* Vector Double Word saturate tests.*/ 4976277067119ad816282b8e57727295b3adee14075carll 4986277067119ad816282b8e57727295b3adee14075carllstatic void test_vpkudus (void) 4996277067119ad816282b8e57727295b3adee14075carll{ 5006277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vpkudus %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 5016277067119ad816282b8e57727295b3adee14075carll} 5026277067119ad816282b8e57727295b3adee14075carll 5036277067119ad816282b8e57727295b3adee14075carllstatic void test_vpksdus (void) 5046277067119ad816282b8e57727295b3adee14075carll{ 5056277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vpksdus %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 5066277067119ad816282b8e57727295b3adee14075carll} 5076277067119ad816282b8e57727295b3adee14075carll 5086277067119ad816282b8e57727295b3adee14075carllstatic void test_vpksdss (void) 5096277067119ad816282b8e57727295b3adee14075carll{ 5106277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vpksdss %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 5116277067119ad816282b8e57727295b3adee14075carll} 5126277067119ad816282b8e57727295b3adee14075carll 5136277067119ad816282b8e57727295b3adee14075carll 5146277067119ad816282b8e57727295b3adee14075carll/* Vector unpack two words from one vector arg */ 5156277067119ad816282b8e57727295b3adee14075carllstatic void test_vupkhsw (void) 5166277067119ad816282b8e57727295b3adee14075carll{ 5176277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vupkhsw %0, %1" : "=v" (vec_out): "v" (vec_inB_wd)); 5186277067119ad816282b8e57727295b3adee14075carll} 5196277067119ad816282b8e57727295b3adee14075carll 5206277067119ad816282b8e57727295b3adee14075carllstatic void test_vupklsw (void) 5216277067119ad816282b8e57727295b3adee14075carll{ 5226277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vupklsw %0, %1" : "=v" (vec_out): "v" (vec_inB_wd)); 5236277067119ad816282b8e57727295b3adee14075carll} 5246277067119ad816282b8e57727295b3adee14075carll 5256277067119ad816282b8e57727295b3adee14075carll 5266277067119ad816282b8e57727295b3adee14075carll/* Vector Integer Word tests.*/ 5276277067119ad816282b8e57727295b3adee14075carllstatic void test_vmulouw (void) 5286277067119ad816282b8e57727295b3adee14075carll{ 5296277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmulouw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 5306277067119ad816282b8e57727295b3adee14075carll} 5316277067119ad816282b8e57727295b3adee14075carll 5326277067119ad816282b8e57727295b3adee14075carllstatic void test_vmuluwm (void) 5336277067119ad816282b8e57727295b3adee14075carll{ 5346277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmuluwm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 5356277067119ad816282b8e57727295b3adee14075carll} 5366277067119ad816282b8e57727295b3adee14075carll 5376277067119ad816282b8e57727295b3adee14075carllstatic void test_vmulosw (void) 5386277067119ad816282b8e57727295b3adee14075carll{ 5396277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmulosw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 5406277067119ad816282b8e57727295b3adee14075carll} 5416277067119ad816282b8e57727295b3adee14075carll 5426277067119ad816282b8e57727295b3adee14075carllstatic void test_vmuleuw (void) 5436277067119ad816282b8e57727295b3adee14075carll{ 5446277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmuleuw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 5456277067119ad816282b8e57727295b3adee14075carll} 5466277067119ad816282b8e57727295b3adee14075carll 5476277067119ad816282b8e57727295b3adee14075carllstatic void test_vmulesw (void) 5486277067119ad816282b8e57727295b3adee14075carll{ 5496277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmulesw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 5506277067119ad816282b8e57727295b3adee14075carll} 5516277067119ad816282b8e57727295b3adee14075carll 5526277067119ad816282b8e57727295b3adee14075carllstatic void test_vmrgew (void) 5536277067119ad816282b8e57727295b3adee14075carll{ 5546277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmrgew %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 555dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 556dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 5576277067119ad816282b8e57727295b3adee14075carllstatic void test_vmrgow (void) 5586277067119ad816282b8e57727295b3adee14075carll{ 5596277067119ad816282b8e57727295b3adee14075carll __asm__ __volatile__ ("vmrgow %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 5606277067119ad816282b8e57727295b3adee14075carll} 5616277067119ad816282b8e57727295b3adee14075carll 56224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumb (void) 56324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 56424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpmsumb %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 56524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 56624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 56724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumh (void) 56824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 56924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpmsumh %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 57024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 57124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 57224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumw (void) 57324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 57424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpmsumw %0, %1, %2" : "=v" (vec_out): "v" (vec_inA_wd),"v" (vec_inB_wd)); 57524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 57624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 57724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpermxor (void) 57824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 57924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpermxor %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC)); 58024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 58124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 58224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpmsumd (void) 58324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 58424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpmsumd %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 58524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 58624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 58724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vnand (void) 58824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 58924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vnand %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 59024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 59124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 59224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vorc (void) 59324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 59424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vorc %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 59524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 59624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 59724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_veqv (void) 59824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 59924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("veqv %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 60024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 60124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 60224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vcipher (void) 60324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 60424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vcipher %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 60524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 60624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 60724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vcipherlast (void) 60824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 60924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vcipherlast %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 61024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 61124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 61224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vncipher (void) 61324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 61424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vncipher %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 61524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 61624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 61724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vncipherlast (void) 61824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 61924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vncipherlast %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 62024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 62124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 62224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzb (void) 62324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 62424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vclzb %0, %1" : "=v" (vec_out): "v" (vec_inB)); 62524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 62624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 62724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzw (void) 62824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 62924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vclzw %0, %1" : "=v" (vec_out): "v" (vec_inB)); 63024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 63124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 63224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzh (void) 63324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 63424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vclzh %0, %1" : "=v" (vec_out): "v" (vec_inB)); 63524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 63624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 63724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vclzd (void) 63824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 63924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vclzd %0, %1" : "=v" (vec_out): "v" (vec_inB)); 64024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 64124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 64224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcntb (void) 64324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 64424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpopcntb %0, %1" : "=v" (vec_out): "v" (vec_inB)); 64524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 64624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 64724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcnth (void) 64824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 64924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpopcnth %0, %1" : "=v" (vec_out): "v" (vec_inB)); 65024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 65124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 65224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcntw (void) 65324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 65424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpopcntw %0, %1" : "=v" (vec_out): "v" (vec_inB)); 65524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 65624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 65724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vpopcntd (void) 65824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 65924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vpopcntd %0, %1" : "=v" (vec_out): "v" (vec_inB)); 66024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 66124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 66224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vsbox (void) 66324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 66424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vsbox %0, %1" : "=v" (vec_out): "v" (vec_inB)); 66524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 66624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 66724e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic int st_six; 66824e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vshasigmad (void) 66924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 67024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll switch (st_six) { 67124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x00: 67224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmad %0, %1, 0, 0" : "=v" (vec_out): "v" (vec_inA)); 67324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 67424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x0f: 67524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmad %0, %1, 0, 15" : "=v" (vec_out): "v" (vec_inA)); 67624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 67724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x10: 67824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmad %0, %1, 1, 0" : "=v" (vec_out): "v" (vec_inA)); 67924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 68024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x1f: 68124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmad %0, %1, 1, 15" : "=v" (vec_out): "v" (vec_inA)); 68224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 68324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 68424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 68524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 68624e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_vshasigmaw (void) 68724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 68824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll switch (st_six) { 68924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x00: 69024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmaw %0, %1, 0, 0" : "=v" (vec_out): "v" (vec_inA)); 69124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 69224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x0f: 69324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmaw %0, %1, 0, 15" : "=v" (vec_out): "v" (vec_inA)); 69424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 69524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x10: 69624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmaw %0, %1, 1, 0" : "=v" (vec_out): "v" (vec_inA)); 69724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 69824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case 0x1f: 69924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("vshasigmaw %0, %1, 1, 15" : "=v" (vec_out): "v" (vec_inA)); 70024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 70124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 70224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 70324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 70424e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic int PS_bit; 70524e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_bcdadd (void) 70624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 70724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll if (PS_bit) 70824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("bcdadd. %0, %1, %2, 1" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 70924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll else 71024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("bcdadd. %0, %1, %2, 0" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 71124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 71224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 71324e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_bcdsub (void) 71424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 71524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll if (PS_bit) 71624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("bcdsub. %0, %1, %2, 1" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 71724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll else 71824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll __asm__ __volatile__ ("bcdsub. %0, %1, %2, 0" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 71924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 72024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 721e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vaddcuq (void) 722e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 723e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vaddcuq %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 724e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 725e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 726e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vadduqm (void) 727e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 728e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vadduqm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 729e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 730e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 731e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vaddecuq (void) 732e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 733e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vaddecuq %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC)); 734e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 735e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 736e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vaddeuqm (void) 737e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 738e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vaddeuqm %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC)); 739e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 740e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 741e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubcuq (void) 742e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 743e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vsubcuq %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 744e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 745e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 746e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubuqm (void) 747e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 748e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vsubuqm %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 749e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 750e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 751e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubecuq (void) 752e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 753e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vsubecuq %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC)); 754e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 755e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 756e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vsubeuqm (void) 757e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 758e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vsubeuqm %0, %1, %2, %3" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB),"v" (vec_inC)); 759e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 760e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 761e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vbpermq (void) 762e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 763e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vbpermq %0, %1, %2" : "=v" (vec_out): "v" (vec_inA),"v" (vec_inB)); 764e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 765e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 766e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_vgbbd (void) 767e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll{ 768e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll __asm__ __volatile__ ("vgbbd %0, %1" : "=v" (vec_out): "v" (vec_inB)); 769e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll} 770e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 771e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 772e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic test_t tests_aa_quadword_two_args[] = { 773e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vaddcuq , "vaddcuq" }, 774e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vadduqm , "vadduqm" }, 775e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vsubcuq , "vsubcuq" }, 776e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vsubuqm , "vsubuqm" }, 777e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vbpermq , "vbpermq" }, 778e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { NULL , NULL }, 779e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}; 780e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 781e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic test_t tests_aa_quadword_three_args[] = { 782e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vaddecuq , "vaddecuq" }, 783e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vaddeuqm , "vaddeuqm" }, 784e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vsubecuq , "vsubecuq" }, 785e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vsubeuqm , "vsubeuqm" }, 786e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { NULL , NULL }, 787e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll}; 788e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 78924e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_bcd_ops[] = { 79024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_bcdadd , "bcdadd." }, 79124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_bcdsub , "bcdsub." }, 79224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { NULL , NULL }, 79324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}; 79424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 79524e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_SHA_ops[] = { 79624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vshasigmad , "vshasigmad" }, 79724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vshasigmaw , "vshasigmaw" }, 79824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { NULL , NULL }, 79924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}; 80024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 80124e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_ops_three[] = { 80224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpermxor , "vpermxor" }, 80324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { NULL , NULL }, 80424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}; 80524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 8066277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_word_ops_one_arg_dres[] = { 8076277067119ad816282b8e57727295b3adee14075carll { &test_vupkhsw , "vupkhsw" }, 8086277067119ad816282b8e57727295b3adee14075carll { &test_vupklsw , "vupklsw" }, 8096277067119ad816282b8e57727295b3adee14075carll { NULL , NULL } 8106277067119ad816282b8e57727295b3adee14075carll}; 81124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 8126277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_word_ops_two_args_dres[] = { 8136277067119ad816282b8e57727295b3adee14075carll { &test_vmulouw , "vmulouw" }, 8146277067119ad816282b8e57727295b3adee14075carll { &test_vmuluwm , "vmuluwm" }, 8156277067119ad816282b8e57727295b3adee14075carll { &test_vmulosw , "vmulosw" }, 8166277067119ad816282b8e57727295b3adee14075carll { &test_vmuleuw , "vmuleuw" }, 8176277067119ad816282b8e57727295b3adee14075carll { &test_vmulesw , "vmulesw" }, 8186277067119ad816282b8e57727295b3adee14075carll { &test_vmrgew , "vmrgew" }, 8196277067119ad816282b8e57727295b3adee14075carll { &test_vmrgow , "vmrgow" }, 82024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpmsumb , "vpmsumb" }, 82124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpmsumh , "vpmsumh" }, 82224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpmsumw , "vpmsumw" }, 8236277067119ad816282b8e57727295b3adee14075carll { NULL , NULL } 8246277067119ad816282b8e57727295b3adee14075carll}; 8256277067119ad816282b8e57727295b3adee14075carll 8266277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_dbl_ops_two_args[] = { 827dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { &test_vaddudm , "vaddudm", }, 8286277067119ad816282b8e57727295b3adee14075carll { &test_vsubudm , "vsubudm", }, 8296277067119ad816282b8e57727295b3adee14075carll { &test_vmaxud , "vmaxud", }, 8306277067119ad816282b8e57727295b3adee14075carll { &test_vmaxsd , "vmaxsd", }, 8316277067119ad816282b8e57727295b3adee14075carll { &test_vminud , "vminud", }, 8326277067119ad816282b8e57727295b3adee14075carll { &test_vminsd , "vminsd", }, 8336277067119ad816282b8e57727295b3adee14075carll { &test_vcmpequd , "vcmpequd", }, 8346277067119ad816282b8e57727295b3adee14075carll { &test_vcmpgtud , "vcmpgtud", }, 8356277067119ad816282b8e57727295b3adee14075carll { &test_vcmpgtsd , "vcmpgtsd", }, 8366277067119ad816282b8e57727295b3adee14075carll { &test_vrld , "vrld", }, 8376277067119ad816282b8e57727295b3adee14075carll { &test_vsld , "vsld", }, 8386277067119ad816282b8e57727295b3adee14075carll { &test_vsrad , "vsrad", }, 8396277067119ad816282b8e57727295b3adee14075carll { &test_vsrd , "vsrd", }, 8406277067119ad816282b8e57727295b3adee14075carll { &test_vpkudum , "vpkudum", }, 84124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpmsumd , "vpmsumd", }, 84224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vnand , "vnand", }, 84324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vorc , "vorc", }, 84424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_veqv , "veqv", }, 84524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vcipher , "vcipher" }, 84624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vcipherlast , "vcipherlast" }, 84724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vncipher , "vncipher" }, 84824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vncipherlast , "vncipherlast" }, 8496277067119ad816282b8e57727295b3adee14075carll { NULL , NULL, }, 8506277067119ad816282b8e57727295b3adee14075carll}; 8516277067119ad816282b8e57727295b3adee14075carll 85224e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic test_t tests_aa_dbl_ops_one_arg[] = { 85324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vclzb , "vclzb" }, 85424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vclzw , "vclzw" }, 85524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vclzh , "vclzh" }, 85624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vclzd , "vclzd" }, 85724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpopcntb , "vpopcntb" }, 85824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpopcnth , "vpopcnth" }, 85924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpopcntw , "vpopcntw" }, 86024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vpopcntd , "vpopcntd" }, 86124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { &test_vsbox , "vsbox" }, 862e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { &test_vgbbd , "vgbbd" }, 86324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { NULL , NULL, } 86424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}; 86524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 8666277067119ad816282b8e57727295b3adee14075carllstatic test_t tests_aa_dbl_to_int_two_args[] = { 8676277067119ad816282b8e57727295b3adee14075carll { &test_vpkudus , "vpkudus", }, 8686277067119ad816282b8e57727295b3adee14075carll { &test_vpksdus , "vpksdus", }, 8696277067119ad816282b8e57727295b3adee14075carll { &test_vpksdss , "vpksdss", }, 8706277067119ad816282b8e57727295b3adee14075carll { NULL , NULL, }, 871dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 872dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 873dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int verbose = 0; 874dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int arg_list_size = 0; 875dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic unsigned long long * vdargs = NULL; 8766277067119ad816282b8e57727295b3adee14075carllstatic unsigned long long * vdargs_x = NULL; 877a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NB_VDARGS 9 878a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NB_VDARGS_X 4 879dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 880dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void build_vdargs_table (void) 881dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 882dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Each VSX register holds two doubleword integer values 883dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs = memalign16(NB_VDARGS * sizeof(unsigned long long)); 884dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs[0] = 0x0102030405060708ULL; 885dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs[1] = 0x090A0B0C0E0D0E0FULL; 886dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs[2] = 0xF1F2F3F4F5F6F7F8ULL; 887dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs[3] = 0xF9FAFBFCFEFDFEFFULL; 888a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vdargs[4] = 0x00007FFFFFFFFFFFULL; 889a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vdargs[5] = 0xFFFF000000000000ULL; 890a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vdargs[6] = 0x0000800000000000ULL; 891a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vdargs[7] = 0x0000000000000000ULL; 892a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vdargs[8] = 0xFFFFFFFFFFFFFFFFULL; 8936277067119ad816282b8e57727295b3adee14075carll 894a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vdargs_x = memalign16(NB_VDARGS_X * sizeof(unsigned long long)); 8956277067119ad816282b8e57727295b3adee14075carll vdargs_x[0] = 0x000000007c118a2bULL; 8966277067119ad816282b8e57727295b3adee14075carll vdargs_x[1] = 0x00000000f1112345ULL; 8976277067119ad816282b8e57727295b3adee14075carll vdargs_x[2] = 0x01F2F3F4F5F6F7F8ULL; 8986277067119ad816282b8e57727295b3adee14075carll vdargs_x[3] = 0xF9FAFBFCFEFDFEFFULL; 8996277067119ad816282b8e57727295b3adee14075carll} 9006277067119ad816282b8e57727295b3adee14075carll 9016277067119ad816282b8e57727295b3adee14075carllstatic unsigned int * vwargs = NULL; 9026277067119ad816282b8e57727295b3adee14075carll#define NB_VWARGS 8 9036277067119ad816282b8e57727295b3adee14075carll 9046277067119ad816282b8e57727295b3adee14075carllstatic void build_vwargs_table (void) 9056277067119ad816282b8e57727295b3adee14075carll{ 9066277067119ad816282b8e57727295b3adee14075carll // Each VSX register holds 4 integer word values 9076277067119ad816282b8e57727295b3adee14075carll size_t i = 0; 9086277067119ad816282b8e57727295b3adee14075carll vwargs = memalign(8, 8 * sizeof(int)); 9096277067119ad816282b8e57727295b3adee14075carll assert(vwargs); 9106277067119ad816282b8e57727295b3adee14075carll assert(0 == ((8-1) & (unsigned long)vwargs)); 9116277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0x01020304; 9126277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0x05060708; 9136277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0x090A0B0C; 9146277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0x0E0D0E0F; 9156277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0xF1F2F3F4; 9166277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0xF5F6F7F8; 9176277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0xF9FAFBFC; 9186277067119ad816282b8e57727295b3adee14075carll vwargs[i++] = 0xFEFDFEFF; 9196277067119ad816282b8e57727295b3adee14075carll} 9206277067119ad816282b8e57727295b3adee14075carll 92124e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic unsigned long long vbcd_args[] __attribute__ ((aligned (16))) = { 92224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x8045090189321003ULL, // Negative BCD value 92324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x001122334556677dULL, 92424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x0000107600000001ULL, // Positive BCD value 92524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x319293945142031aULL, 92624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x0ULL, // Valid BCD zero 92724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0xaULL, 92824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x0ULL, // Invalid BCD zero (no sign code) 92924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x0ULL 93024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll}; 931a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes//#define NUM_VBCD_VALS (sizeof vbcd_args/sizeof vbcd_args[0]) 932a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define NUM_VBCD_VALS 8 93324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 9346277067119ad816282b8e57727295b3adee14075carllstatic void build_vargs_table (void) 9356277067119ad816282b8e57727295b3adee14075carll{ 9366277067119ad816282b8e57727295b3adee14075carll build_vdargs_table(); 9376277067119ad816282b8e57727295b3adee14075carll build_vwargs_table(); 938dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 939dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 940a81925998c22a5af981c6933f56f24437e790447carllstatic double *fargs = NULL; 941a81925998c22a5af981c6933f56f24437e790447carllstatic int nb_fargs = 0; 942a81925998c22a5af981c6933f56f24437e790447carll 943a81925998c22a5af981c6933f56f24437e790447carllstatic inline void register_farg (void *farg, 944a81925998c22a5af981c6933f56f24437e790447carll int s, uint16_t _exp, uint64_t mant) 945a81925998c22a5af981c6933f56f24437e790447carll{ 946a81925998c22a5af981c6933f56f24437e790447carll uint64_t tmp; 947a81925998c22a5af981c6933f56f24437e790447carll 948a81925998c22a5af981c6933f56f24437e790447carll tmp = ((uint64_t)s << 63) | ((uint64_t)_exp << 52) | mant; 949a81925998c22a5af981c6933f56f24437e790447carll *(uint64_t *)farg = tmp; 950a81925998c22a5af981c6933f56f24437e790447carll AB_DPRINTF("%d %03x %013llx => %016llx %0e\n", 951a81925998c22a5af981c6933f56f24437e790447carll s, _exp, mant, *(uint64_t *)farg, *(double *)farg); 952a81925998c22a5af981c6933f56f24437e790447carll} 953a81925998c22a5af981c6933f56f24437e790447carll 954a81925998c22a5af981c6933f56f24437e790447carllstatic void build_fargs_table (void) 955a81925998c22a5af981c6933f56f24437e790447carll{ 956a81925998c22a5af981c6933f56f24437e790447carll /* Double precision: 957a81925998c22a5af981c6933f56f24437e790447carll * Sign goes from zero to one (1 bit) 958a81925998c22a5af981c6933f56f24437e790447carll * Exponent goes from 0 to ((1 << 12) - 1) (11 bits) 959a81925998c22a5af981c6933f56f24437e790447carll * Mantissa goes from 1 to ((1 << 52) - 1) (52 bits) 960a81925998c22a5af981c6933f56f24437e790447carll * + special values: 961a81925998c22a5af981c6933f56f24437e790447carll * +0.0 : 0 0x000 0x0000000000000 => 0x0000000000000000 962a81925998c22a5af981c6933f56f24437e790447carll * -0.0 : 1 0x000 0x0000000000000 => 0x8000000000000000 963a81925998c22a5af981c6933f56f24437e790447carll * +infinity : 0 0x7FF 0x0000000000000 => 0x7FF0000000000000 964a81925998c22a5af981c6933f56f24437e790447carll * -infinity : 1 0x7FF 0x0000000000000 => 0xFFF0000000000000 9658efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +QNaN : 0 0x7FF 0x8000000000000 => 0x7FF8000000000000 9668efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -QNaN : 1 0x7FF 0x8000000000000 => 0xFFF8000000000000 9678efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +SNaN : 0 0x7FF 0x7FFFFFFFFFFFF => 0x7FF7FFFFFFFFFFFF 9688efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -SNaN : 1 0x7FF 0x7FFFFFFFFFFFF => 0xFFF7FFFFFFFFFFFF 969a81925998c22a5af981c6933f56f24437e790447carll * (8 values) 970a81925998c22a5af981c6933f56f24437e790447carll 971a81925998c22a5af981c6933f56f24437e790447carll * Ref only: 972a81925998c22a5af981c6933f56f24437e790447carll * Single precision 973a81925998c22a5af981c6933f56f24437e790447carll * Sign: 1 bit 974a81925998c22a5af981c6933f56f24437e790447carll * Exponent: 8 bits 975a81925998c22a5af981c6933f56f24437e790447carll * Mantissa: 23 bits 976a81925998c22a5af981c6933f56f24437e790447carll * +0.0 : 0 0x00 0x000000 => 0x00000000 977a81925998c22a5af981c6933f56f24437e790447carll * -0.0 : 1 0x00 0x000000 => 0x80000000 978a81925998c22a5af981c6933f56f24437e790447carll * +infinity : 0 0xFF 0x000000 => 0x7F800000 979a81925998c22a5af981c6933f56f24437e790447carll * -infinity : 1 0xFF 0x000000 => 0xFF800000 9808efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +QNaN : 0 0xFF 0x400000 => 0x7FC00000 9818efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -QNaN : 1 0xFF 0x400000 => 0xFFC00000 9828efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * +SNaN : 0 0xFF 0x3FFFFF => 0x7FBFFFFF 9838efe4e40e702e4a1eafac37076e1df2ccd9b047bcarll * -SNaN : 1 0xFF 0x3FFFFF => 0xFFBFFFFF 984a81925998c22a5af981c6933f56f24437e790447carll */ 985a81925998c22a5af981c6933f56f24437e790447carll uint64_t mant; 986a81925998c22a5af981c6933f56f24437e790447carll uint16_t _exp, e0, e1; 987a81925998c22a5af981c6933f56f24437e790447carll int s; 988a81925998c22a5af981c6933f56f24437e790447carll int i=0; 989a81925998c22a5af981c6933f56f24437e790447carll 990a81925998c22a5af981c6933f56f24437e790447carll /* Note: VEX isn't so hot with denormals, so don't bother 991a81925998c22a5af981c6933f56f24437e790447carll testing them: set _exp > 0 992a81925998c22a5af981c6933f56f24437e790447carll */ 993a81925998c22a5af981c6933f56f24437e790447carll 994a81925998c22a5af981c6933f56f24437e790447carll if ( arg_list_size == 1 ) { // Large 995a81925998c22a5af981c6933f56f24437e790447carll fargs = malloc(200 * sizeof(double)); 996a81925998c22a5af981c6933f56f24437e790447carll for (s=0; s<2; s++) { 997a81925998c22a5af981c6933f56f24437e790447carll for (e0=0; e0<2; e0++) { 998a81925998c22a5af981c6933f56f24437e790447carll for (e1=0x001; ; e1 = ((e1 + 1) << 2) + 6) { 999a81925998c22a5af981c6933f56f24437e790447carll if (e1 >= 0x400) 1000a81925998c22a5af981c6933f56f24437e790447carll e1 = 0x3fe; 1001a81925998c22a5af981c6933f56f24437e790447carll _exp = (e0 << 10) | e1; 1002a81925998c22a5af981c6933f56f24437e790447carll for (mant = 0x0000000000001ULL; mant < (1ULL << 52); 1003a81925998c22a5af981c6933f56f24437e790447carll /* Add 'random' bits */ 1004a81925998c22a5af981c6933f56f24437e790447carll mant = ((mant + 0x4A6) << 13) + 0x359) { 1005a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1006a81925998c22a5af981c6933f56f24437e790447carll } 1007a81925998c22a5af981c6933f56f24437e790447carll if (e1 == 0x3fe) 1008a81925998c22a5af981c6933f56f24437e790447carll break; 1009a81925998c22a5af981c6933f56f24437e790447carll } 1010a81925998c22a5af981c6933f56f24437e790447carll } 1011a81925998c22a5af981c6933f56f24437e790447carll } 1012a81925998c22a5af981c6933f56f24437e790447carll } else { // Default 1013a81925998c22a5af981c6933f56f24437e790447carll fargs = malloc(16 * sizeof(double)); 1014a81925998c22a5af981c6933f56f24437e790447carll for (s=0; s<2; s++) { // x2 1015a81925998c22a5af981c6933f56f24437e790447carll for (e1=0x001; ; e1 = ((e1 + 1) << 13) + 7) { // x2 1016a81925998c22a5af981c6933f56f24437e790447carll if (e1 >= 0x400) 1017a81925998c22a5af981c6933f56f24437e790447carll e1 = 0x3fe; 1018a81925998c22a5af981c6933f56f24437e790447carll _exp = e1; 1019a81925998c22a5af981c6933f56f24437e790447carll for (mant = 0x0000000000001ULL; mant < (1ULL << 52); 1020a81925998c22a5af981c6933f56f24437e790447carll /* Add 'random' bits */ 1021a81925998c22a5af981c6933f56f24437e790447carll mant = ((mant + 0x4A6) << 29) + 0x359) { // x2 1022a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1023a81925998c22a5af981c6933f56f24437e790447carll } 1024a81925998c22a5af981c6933f56f24437e790447carll if (e1 == 0x3fe) 1025a81925998c22a5af981c6933f56f24437e790447carll break; 1026a81925998c22a5af981c6933f56f24437e790447carll } 1027a81925998c22a5af981c6933f56f24437e790447carll } 1028a81925998c22a5af981c6933f56f24437e790447carll } 1029a81925998c22a5af981c6933f56f24437e790447carll 1030a81925998c22a5af981c6933f56f24437e790447carll /* Special values */ 1031a81925998c22a5af981c6933f56f24437e790447carll /* +0.0 : 0 0x000 0x0000000000000 */ 1032a81925998c22a5af981c6933f56f24437e790447carll s = 0; 1033a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x000; 1034a81925998c22a5af981c6933f56f24437e790447carll mant = 0x0000000000000ULL; 1035a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1036a81925998c22a5af981c6933f56f24437e790447carll /* -0.0 : 1 0x000 0x0000000000000 */ 1037a81925998c22a5af981c6933f56f24437e790447carll s = 1; 1038a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x000; 1039a81925998c22a5af981c6933f56f24437e790447carll mant = 0x0000000000000ULL; 1040a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1041a81925998c22a5af981c6933f56f24437e790447carll /* +infinity : 0 0x7FF 0x0000000000000 */ 1042a81925998c22a5af981c6933f56f24437e790447carll s = 0; 1043a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x7FF; 1044a81925998c22a5af981c6933f56f24437e790447carll mant = 0x0000000000000ULL; 1045a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1046a81925998c22a5af981c6933f56f24437e790447carll /* -infinity : 1 0x7FF 0x0000000000000 */ 1047a81925998c22a5af981c6933f56f24437e790447carll s = 1; 1048a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x7FF; 1049a81925998c22a5af981c6933f56f24437e790447carll mant = 0x0000000000000ULL; 1050a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1051a81925998c22a5af981c6933f56f24437e790447carll /* +QNaN : 0 0x7FF 0x7FFFFFFFFFFFF */ 1052a81925998c22a5af981c6933f56f24437e790447carll s = 0; 1053a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x7FF; 1054a81925998c22a5af981c6933f56f24437e790447carll mant = 0x7FFFFFFFFFFFFULL; 1055a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1056a81925998c22a5af981c6933f56f24437e790447carll /* -QNaN : 1 0x7FF 0x7FFFFFFFFFFFF */ 1057a81925998c22a5af981c6933f56f24437e790447carll s = 1; 1058a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x7FF; 1059a81925998c22a5af981c6933f56f24437e790447carll mant = 0x7FFFFFFFFFFFFULL; 1060a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1061a81925998c22a5af981c6933f56f24437e790447carll /* +SNaN : 0 0x7FF 0x8000000000000 */ 1062a81925998c22a5af981c6933f56f24437e790447carll s = 0; 1063a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x7FF; 1064a81925998c22a5af981c6933f56f24437e790447carll mant = 0x8000000000000ULL; 1065a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1066a81925998c22a5af981c6933f56f24437e790447carll /* -SNaN : 1 0x7FF 0x8000000000000 */ 1067a81925998c22a5af981c6933f56f24437e790447carll s = 1; 1068a81925998c22a5af981c6933f56f24437e790447carll _exp = 0x7FF; 1069a81925998c22a5af981c6933f56f24437e790447carll mant = 0x8000000000000ULL; 1070a81925998c22a5af981c6933f56f24437e790447carll register_farg(&fargs[i++], s, _exp, mant); 1071a81925998c22a5af981c6933f56f24437e790447carll AB_DPRINTF("Registered %d fargs values\n", i); 1072a81925998c22a5af981c6933f56f24437e790447carll 1073a81925998c22a5af981c6933f56f24437e790447carll nb_fargs = i; 1074a81925998c22a5af981c6933f56f24437e790447carll} 1075a81925998c22a5af981c6933f56f24437e790447carll 1076a81925998c22a5af981c6933f56f24437e790447carll 1077a81925998c22a5af981c6933f56f24437e790447carll 1078dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int check_filter (char *filter) 1079dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1080dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll char *c; 1081dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int ret = 1; 1082dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1083dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (filter != NULL) { 1084dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll c = strchr(filter, '*'); 1085dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (c != NULL) { 1086dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll *c = '\0'; 1087dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ret = 0; 1088dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1089dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1090dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll return ret; 1091dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1092dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1093dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic int check_name (const char* name, const char *filter, 1094dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int exact) 1095dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1096dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int nlen, flen; 1097dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int ret = 0; 1098dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1099dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (filter != NULL) { 1100dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (; isspace(*name); name++) 1101dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 1102dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll FDPRINTF("Check '%s' againt '%s' (%s match)\n", 1103dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll name, filter, exact ? "exact" : "starting"); 1104dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll nlen = strlen(name); 1105dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flen = strlen(filter); 1106dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (exact) { 1107dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (nlen == flen && memcmp(name, filter, flen) == 0) 1108dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ret = 1; 1109dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } else { 1110dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (flen <= nlen && memcmp(name, filter, flen) == 0) 1111dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ret = 1; 1112dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1113dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } else { 1114dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ret = 1; 1115dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1116dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll return ret; 1117dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1118dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1119dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1120dfbf294f08ac004a60cb3b528d544cb7d0404eb0carlltypedef struct insn_sel_flags_t_struct { 1121dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int one_arg, two_args, three_args; 1122dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int arith, logical, compare, ldst; 1123dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int integer, floats, altivec, faltivec; 1124dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int cr; 1125dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} insn_sel_flags_t; 1126dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1127a81925998c22a5af981c6933f56f24437e790447carllstatic void test_float_two_args (const char* name, test_func_t func, 1128a81925998c22a5af981c6933f56f24437e790447carll unused uint32_t test_flags) 1129a81925998c22a5af981c6933f56f24437e790447carll{ 1130a81925998c22a5af981c6933f56f24437e790447carll double res; 1131a81925998c22a5af981c6933f56f24437e790447carll Word_t u0, u1, ur; 1132a81925998c22a5af981c6933f56f24437e790447carll volatile uint32_t flags; 1133a81925998c22a5af981c6933f56f24437e790447carll int i, j; 1134a81925998c22a5af981c6933f56f24437e790447carll 1135a81925998c22a5af981c6933f56f24437e790447carll for (i=0; i<nb_fargs; i+=3) { 1136a81925998c22a5af981c6933f56f24437e790447carll for (j=0; j<nb_fargs; j+=5) { 1137a81925998c22a5af981c6933f56f24437e790447carll u0 = *(Word_t *)(&fargs[i]); 1138a81925998c22a5af981c6933f56f24437e790447carll u1 = *(Word_t *)(&fargs[j]); 1139a81925998c22a5af981c6933f56f24437e790447carll f14 = fargs[i]; 1140a81925998c22a5af981c6933f56f24437e790447carll f15 = fargs[j]; 1141a81925998c22a5af981c6933f56f24437e790447carll 1142a81925998c22a5af981c6933f56f24437e790447carll SET_FPSCR_ZERO; 1143a81925998c22a5af981c6933f56f24437e790447carll SET_CR_XER_ZERO; 1144a81925998c22a5af981c6933f56f24437e790447carll (*func)(); 1145a81925998c22a5af981c6933f56f24437e790447carll GET_CR(flags); 1146a81925998c22a5af981c6933f56f24437e790447carll res = f17; 1147a81925998c22a5af981c6933f56f24437e790447carll ur = *(uint64_t *)(&res); 1148a81925998c22a5af981c6933f56f24437e790447carll 1149a81925998c22a5af981c6933f56f24437e790447carll printf("%s %016llx, %016llx => %016llx", 1150a81925998c22a5af981c6933f56f24437e790447carll name, u0, u1, ur); 1151a81925998c22a5af981c6933f56f24437e790447carll#if defined TEST_FLOAT_FLAGS 1152a81925998c22a5af981c6933f56f24437e790447carll printf(" (%08x)", flags); 1153a81925998c22a5af981c6933f56f24437e790447carll#endif 1154a81925998c22a5af981c6933f56f24437e790447carll printf("\n"); 1155a81925998c22a5af981c6933f56f24437e790447carll } 1156a81925998c22a5af981c6933f56f24437e790447carll if (verbose) printf("\n"); 1157a81925998c22a5af981c6933f56f24437e790447carll } 1158a81925998c22a5af981c6933f56f24437e790447carll} 1159a81925998c22a5af981c6933f56f24437e790447carll 1160dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1161dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void mfvs(const char* name, test_func_t func, 1162dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unused uint32_t test_flags) 1163dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1164dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* This test is for move instructions where the input is a scalar register 1165dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * and the destination is a vector register. 1166dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 1167dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int i; 1168dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll volatile Word_t result; 1169a81925998c22a5af981c6933f56f24437e790447carll result = 0ULL; 1170dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1171dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (i=0; i < NB_VDARGS; i++) { 1172a81925998c22a5af981c6933f56f24437e790447carll r14 = ZERO; 1173dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1174dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ 0ULL, vdargs[i] }; 1175dd690bf8d81c9119a7228446be12e3366e202176carll else 1176dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ vdargs[i], 0ULL }; 1177dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1178dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (*func)(); 1179dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll result = r14; 1180dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("%s: %016llx => %016llx\n", name, vdargs[i], result); 1181dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1182dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1183dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1184dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void mtvs(const char* name, test_func_t func, 1185dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unused uint32_t test_flags) 1186dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1187dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* This test is for move instructions where the input is a scalar register 1188dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll * and the destination is a vector register. 1189dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 1190dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unsigned long long *dst; 1191dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int i; 1192dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1193dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (i=0; i < NB_VDARGS; i++) { 1194dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll r14 = vdargs[i]; 1195dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vec_out = (vector unsigned long long){ 0ULL, 0ULL }; 1196dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1197dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (*func)(); 1198dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll dst = (unsigned long long *) &vec_out; 1199dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1200dd690bf8d81c9119a7228446be12e3366e202176carll dst++; 1201dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("%s: %016llx => %016llx\n", name, vdargs[i], *dst); 1202dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1203dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1204dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1205dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void mtvs2s(const char* name, test_func_t func, 1206dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unused uint32_t test_flags) 1207dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1208dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* This test is the mtvsrwa instruction. 1209dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 1210dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unsigned long long *dst; 1211dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int i; 1212dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1213dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (i=0; i < NB_VDARGS; i++) { 1214dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Only the lower half of the vdarg doubleword arg will be used as input by mtvsrwa 1215dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unsigned int * src = (unsigned int *)&vdargs[i]; 1216dd690bf8d81c9119a7228446be12e3366e202176carll if (!isLE) 1217dd690bf8d81c9119a7228446be12e3366e202176carll src++; 1218dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll r14 = vdargs[i]; 1219dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vec_out = (vector unsigned long long){ 0ULL, 0ULL }; 1220dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1221dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (*func)(); 1222dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Only doubleword 0 is used in output 1223dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll dst = (unsigned long long *) &vec_out; 1224dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1225dd690bf8d81c9119a7228446be12e3366e202176carll dst++; 1226dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("%s: %08x => %016llx\n", name, *src, *dst); 1227dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1228dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1229dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1230dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_special (special_t *table, 1231dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll const char* name, test_func_t func, 1232dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unused uint32_t test_flags) 1233dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1234dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll const char *tmp; 1235dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int i; 1236dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1237dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (tmp = name; isspace(*tmp); tmp++) 1238dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 1239dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (i=0; table[i].name != NULL; i++) { 1240dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (strcmp(table[i].name, tmp) == 0) { 1241dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (*table[i].test_cb)(name, func, test_flags); 1242dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll return; 1243dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1244dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1245dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll fprintf(stderr, "ERROR: no test found for op '%s'\n", name); 1246dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1247dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1248dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic special_t special_move_ops[] = { 1249dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { 1250a81925998c22a5af981c6933f56f24437e790447carll "mfvsrd", /* move from vector to scalar reg doubleword */ 1251dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll &mfvs, 1252dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll }, 1253dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { 1254a81925998c22a5af981c6933f56f24437e790447carll "mtvsrd", /* move from scalar to vector reg doubleword */ 1255dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll &mtvs, 1256dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll }, 1257dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { 1258dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "mtfprwa", /* (extended mnemonic for mtvsrwa) move from scalar to vector reg with two’s-complement */ 1259dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll &mtvs2s, 1260dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll }, 1261a81925998c22a5af981c6933f56f24437e790447carll { 1262a81925998c22a5af981c6933f56f24437e790447carll "mfvsrwz", /* move from vector to scalar reg word */ 1263a81925998c22a5af981c6933f56f24437e790447carll &mfvs, 1264a81925998c22a5af981c6933f56f24437e790447carll }, 1265a81925998c22a5af981c6933f56f24437e790447carll { 1266a81925998c22a5af981c6933f56f24437e790447carll "mtvsrwz", /* move from scalar to vector reg word */ 1267a81925998c22a5af981c6933f56f24437e790447carll &mtvs2s, 1268a81925998c22a5af981c6933f56f24437e790447carll } 1269dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 1270dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1271dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_move_special(const char* name, test_func_t func, 1272dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll uint32_t test_flags) 1273dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1274dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll test_special(special_move_ops, name, func, test_flags); 1275dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1276dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1277dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Vector Double Word tests */ 1278dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1279dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void test_av_dint_two_args (const char* name, test_func_t func, 1280dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unused uint32_t test_flags) 1281dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1282dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1283dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unsigned long long * dst; 1284dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll unsigned int * dst_int; 1285dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int i,j; 1286e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll int family = test_flags & PPC_FAMILY; 1287dd690bf8d81c9119a7228446be12e3366e202176carll int is_vpkudum, is_vpmsumd; 1288dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (strcmp(name, "vpkudum") == 0) 1289dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll is_vpkudum = 1; 1290dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll else 1291dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll is_vpkudum = 0; 1292dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1293dd690bf8d81c9119a7228446be12e3366e202176carll if (strcmp(name, "vpmsumd") == 0) 1294dd690bf8d81c9119a7228446be12e3366e202176carll is_vpmsumd = 1; 1295dd690bf8d81c9119a7228446be12e3366e202176carll else 1296dd690bf8d81c9119a7228446be12e3366e202176carll is_vpmsumd = 0; 1297dd690bf8d81c9119a7228446be12e3366e202176carll 1298a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NB_VDARGS - 1; i+=2) { 1299dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && family == PPC_ALTIVECQ) 1300dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ vdargs[i+1], vdargs[i] }; 1301dd690bf8d81c9119a7228446be12e3366e202176carll else 1302dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ vdargs[i], vdargs[i+1] }; 1303a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (j = 0; j < NB_VDARGS - 1; j+=2) { 1304dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE && family == PPC_ALTIVECQ) 1305dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB = (vector unsigned long long){ vdargs[j+1], vdargs[j] }; 1306dd690bf8d81c9119a7228446be12e3366e202176carll else 1307dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB = (vector unsigned long long){ vdargs[j], vdargs[j+1] }; 1308dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vec_out = (vector unsigned long long){ 0,0 }; 1309dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1310dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (*func)(); 1311dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll dst_int = (unsigned int *)&vec_out; 1312dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll dst = (unsigned long long*)&vec_out; 1313dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1314dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("%s: ", name); 1315dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1316dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (is_vpkudum) { 1317dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("Inputs: %08llx %08llx %08llx %08llx\n", vdargs[i] & 0x00000000ffffffffULL, 1318dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs[i+1] & 0x00000000ffffffffULL, vdargs[j] & 0x00000000ffffffffULL, 1319dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll vdargs[j+1] & 0x00000000ffffffffULL); 1320dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1321dd690bf8d81c9119a7228446be12e3366e202176carll printf(" Output: %08x %08x %08x %08x\n", dst_int[2], dst_int[3], 1322dd690bf8d81c9119a7228446be12e3366e202176carll dst_int[0], dst_int[1]); 1323dd690bf8d81c9119a7228446be12e3366e202176carll else 1324dd690bf8d81c9119a7228446be12e3366e202176carll printf(" Output: %08x %08x %08x %08x\n", dst_int[0], dst_int[1], 1325dd690bf8d81c9119a7228446be12e3366e202176carll dst_int[2], dst_int[3]); 1326dd690bf8d81c9119a7228446be12e3366e202176carll } else if (is_vpmsumd) { 1327dd690bf8d81c9119a7228446be12e3366e202176carll printf("%016llx @@ %016llx ", vdargs[i], vdargs[j]); 1328dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1329dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[1]); 1330dd690bf8d81c9119a7228446be12e3366e202176carll else 1331dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[0]); 1332dd690bf8d81c9119a7228446be12e3366e202176carll printf("\t%016llx @@ %016llx ", vdargs[i+1], vdargs[j+1]); 1333dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1334dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[0]); 1335dd690bf8d81c9119a7228446be12e3366e202176carll else 1336dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[1]); 1337e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll } else if (family == PPC_ALTIVECQ) { 1338dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1339dd690bf8d81c9119a7228446be12e3366e202176carll printf("%016llx%016llx @@ %016llx%016llx ==> %016llx%016llx\n", 1340dd690bf8d81c9119a7228446be12e3366e202176carll vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1], 1341dd690bf8d81c9119a7228446be12e3366e202176carll dst[1], dst[0]); 1342dd690bf8d81c9119a7228446be12e3366e202176carll else 1343dd690bf8d81c9119a7228446be12e3366e202176carll printf("%016llx%016llx @@ %016llx%016llx ==> %016llx%016llx\n", 1344dd690bf8d81c9119a7228446be12e3366e202176carll vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1], 1345dd690bf8d81c9119a7228446be12e3366e202176carll dst[0], dst[1]); 1346dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } else { 134724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%016llx @@ %016llx ", vdargs[i], vdargs[j]); 1348dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" ==> %016llx\n", dst[0]); 134924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("\t%016llx @@ %016llx ", vdargs[i+1], vdargs[j+1]); 1350dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" ==> %016llx\n", dst[1]); 1351dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1352dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1353dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1354dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 1355dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 135624e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_av_dint_one_arg (const char* name, test_func_t func, 135724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unused uint32_t test_flags) 135824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 135924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 136024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unsigned long long * dst; 136124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll int i; 136224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 1363a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NB_VDARGS - 1; i+=2) { 136424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vec_inB = (vector unsigned long long){ vdargs[i], vdargs[i+1] }; 136524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vec_out = (vector unsigned long long){ 0,0 }; 136624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 136724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll (*func)(); 136824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll dst = (unsigned long long*)&vec_out; 136924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 137024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%s: ", name); 137124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%016llx @@ %016llx ", vdargs[i], vdargs[i + 1]); 137224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf(" ==> %016llx%016llx\n", dst[0], dst[1]); 137324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 137424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 137524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 137624e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_av_dint_one_arg_SHA (const char* name, test_func_t func, 137724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unused uint32_t test_flags) 137824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 137924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unsigned long long * dst; 138024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll int i, st, six; 138124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 1382a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NB_VDARGS - 1; i+=2) { 138324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vec_inA = (vector unsigned long long){ vdargs[i], vdargs[i+1] }; 138424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vec_out = (vector unsigned long long){ 0,0 }; 138524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 138624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll for (st = 0; st < 2; st++) { 138724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll for (six = 0; six < 16; six+=15) { 138824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll st_six = (st << 4) | six; 138924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll (*func)(); 139024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll dst = (unsigned long long*)&vec_out; 139124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 139224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%s: ", name); 139324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%016llx @@ %016llx ", vdargs[i], vdargs[i + 1]); 139424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf(" ==> %016llx || %016llx\n", dst[0], dst[1]); 139524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 139624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 139724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 139824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 139924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 140024e40de8f2127d70117ed9af3bc4474cbc29cb8acarllstatic void test_av_bcd (const char* name, test_func_t func, 140124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unused uint32_t test_flags) 140224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 140324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unsigned long long * dst; 140424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll int i, j; 140524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 1406a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NUM_VBCD_VALS - 1; i+=2) { 1407dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1408a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vec_inA = (vector unsigned long long){ vbcd_args[i+1], vbcd_args[i]}; 1409dd690bf8d81c9119a7228446be12e3366e202176carll else 1410dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ vbcd_args[i], vbcd_args[i+1] }; 1411a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (j = 0; j < NUM_VBCD_VALS - 1; j+=2) { 1412dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1413a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes vec_inB = (vector unsigned long long){ vbcd_args[j+1] , vbcd_args[j] }; 1414dd690bf8d81c9119a7228446be12e3366e202176carll else 1415dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB = (vector unsigned long long){ vbcd_args[j], vbcd_args[j+1] }; 141624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vec_out = (vector unsigned long long){ 0, 0 }; 141724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 141824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll for (PS_bit = 0; PS_bit < 2; PS_bit++) { 141924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll (*func)(); 142024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll dst = (unsigned long long*)&vec_out; 142124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%s: ", name); 142224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%016llx || %016llx @@ %016llx || %016llx", 142324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vbcd_args[i], vbcd_args[i + 1], 142424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vbcd_args[j], vbcd_args[j + 1]); 1425dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1426dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx || %016llx\n", dst[1], dst[0]); 1427dd690bf8d81c9119a7228446be12e3366e202176carll else 1428dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx || %016llx\n", dst[0], dst[1]); 142924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 143024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 143124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 143224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 143324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 14346277067119ad816282b8e57727295b3adee14075carll/* Vector doubleword-to-int tests, two input args, integer result */ 14356277067119ad816282b8e57727295b3adee14075carllstatic void test_av_dint_to_int_two_args (const char* name, test_func_t func, 14366277067119ad816282b8e57727295b3adee14075carll unused uint32_t test_flags) 14376277067119ad816282b8e57727295b3adee14075carll{ 14386277067119ad816282b8e57727295b3adee14075carll 14396277067119ad816282b8e57727295b3adee14075carll unsigned int * dst_int; 14406277067119ad816282b8e57727295b3adee14075carll int i,j; 1441a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NB_VDARGS_X - 1; i+=2) { 14426277067119ad816282b8e57727295b3adee14075carll vec_inA = (vector unsigned long long){ vdargs_x[i], vdargs_x[i+1] }; 1443a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (j = 0; j < NB_VDARGS_X - 1; j+=2) { 14446277067119ad816282b8e57727295b3adee14075carll vec_inB = (vector unsigned long long){ vdargs_x[j], vdargs_x[j+1] }; 14456277067119ad816282b8e57727295b3adee14075carll vec_out = (vector unsigned long long){ 0,0 }; 14466277067119ad816282b8e57727295b3adee14075carll 14476277067119ad816282b8e57727295b3adee14075carll (*func)(); 14486277067119ad816282b8e57727295b3adee14075carll dst_int = (unsigned int *)&vec_out; 14496277067119ad816282b8e57727295b3adee14075carll 14506277067119ad816282b8e57727295b3adee14075carll printf("%s: ", name); 14516277067119ad816282b8e57727295b3adee14075carll printf("%016llx, %016llx @@ %016llx, %016llx ", 14526277067119ad816282b8e57727295b3adee14075carll vdargs_x[i], vdargs_x[i+1], 14536277067119ad816282b8e57727295b3adee14075carll vdargs_x[j], vdargs_x[j+1]); 1454dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1455dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %08x %08x %08x %08x\n", dst_int[2], dst_int[3], 1456dd690bf8d81c9119a7228446be12e3366e202176carll dst_int[0], dst_int[1]); 1457dd690bf8d81c9119a7228446be12e3366e202176carll else 1458dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %08x %08x %08x %08x\n", dst_int[0], dst_int[1], 1459dd690bf8d81c9119a7228446be12e3366e202176carll dst_int[2], dst_int[3]); 14606277067119ad816282b8e57727295b3adee14075carll } 14616277067119ad816282b8e57727295b3adee14075carll } 14626277067119ad816282b8e57727295b3adee14075carll} 14636277067119ad816282b8e57727295b3adee14075carll 14646277067119ad816282b8e57727295b3adee14075carll/* Vector Word tests; two integer args, with double word result */ 14656277067119ad816282b8e57727295b3adee14075carll 14666277067119ad816282b8e57727295b3adee14075carllstatic void test_av_wint_two_args_dres (const char* name, test_func_t func, 14676277067119ad816282b8e57727295b3adee14075carll unused uint32_t test_flags) 14686277067119ad816282b8e57727295b3adee14075carll{ 14696277067119ad816282b8e57727295b3adee14075carll 14706277067119ad816282b8e57727295b3adee14075carll unsigned long long * dst; 14716277067119ad816282b8e57727295b3adee14075carll int i,j; 14726277067119ad816282b8e57727295b3adee14075carll 14736277067119ad816282b8e57727295b3adee14075carll for (i = 0; i < NB_VWARGS; i+=4) { 1474dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1475dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA_wd = (vector unsigned int){ vwargs[i+3], vwargs[i+2], vwargs[i+1], vwargs[i] }; 1476dd690bf8d81c9119a7228446be12e3366e202176carll else 1477dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA_wd = (vector unsigned int){ vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3] }; 14786277067119ad816282b8e57727295b3adee14075carll for (j = 0; j < NB_VWARGS; j+=4) { 1479dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1480dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB_wd = (vector unsigned int){ vwargs[j+3], vwargs[j+2], vwargs[j+1], vwargs[j] }; 1481dd690bf8d81c9119a7228446be12e3366e202176carll else 1482dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB_wd = (vector unsigned int){ vwargs[j], vwargs[j+1], vwargs[j+2], vwargs[j+3] }; 14836277067119ad816282b8e57727295b3adee14075carll vec_out = (vector unsigned long long){ 0, 0 }; 14846277067119ad816282b8e57727295b3adee14075carll 14856277067119ad816282b8e57727295b3adee14075carll (*func)(); 14866277067119ad816282b8e57727295b3adee14075carll dst = (unsigned long long *)&vec_out; 14876277067119ad816282b8e57727295b3adee14075carll printf("%s: ", name); 1488dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1489dd690bf8d81c9119a7228446be12e3366e202176carll printf("%08x %08x %08x %08x ==> %016llx %016llx\n", 1490dd690bf8d81c9119a7228446be12e3366e202176carll vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[1], dst[0]); 1491dd690bf8d81c9119a7228446be12e3366e202176carll else 1492dd690bf8d81c9119a7228446be12e3366e202176carll printf("%08x %08x %08x %08x ==> %016llx %016llx\n", 1493dd690bf8d81c9119a7228446be12e3366e202176carll vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[0], dst[1]); 14946277067119ad816282b8e57727295b3adee14075carll } 14956277067119ad816282b8e57727295b3adee14075carll } 14966277067119ad816282b8e57727295b3adee14075carll} 14976277067119ad816282b8e57727295b3adee14075carll 14986277067119ad816282b8e57727295b3adee14075carll/* Vector Word tests; one input arg, with double word result */ 14996277067119ad816282b8e57727295b3adee14075carll 15006277067119ad816282b8e57727295b3adee14075carllstatic void test_av_wint_one_arg_dres (const char* name, test_func_t func, 15016277067119ad816282b8e57727295b3adee14075carll unused uint32_t test_flags) 15026277067119ad816282b8e57727295b3adee14075carll{ 15036277067119ad816282b8e57727295b3adee14075carll unsigned long long * dst; 15046277067119ad816282b8e57727295b3adee14075carll int i; 15056277067119ad816282b8e57727295b3adee14075carll for (i = 0; i < NB_VWARGS; i+=4) { 1506dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1507dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB_wd = (vector unsigned int){ vwargs[i+3], vwargs[i+2], vwargs[i+1], vwargs[i] }; 1508dd690bf8d81c9119a7228446be12e3366e202176carll else 1509dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB_wd = (vector unsigned int){ vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3] }; 15106277067119ad816282b8e57727295b3adee14075carll vec_out = (vector unsigned long long){ 0, 0 }; 15116277067119ad816282b8e57727295b3adee14075carll 15126277067119ad816282b8e57727295b3adee14075carll (*func)(); 15136277067119ad816282b8e57727295b3adee14075carll dst = (unsigned long long *)&vec_out; 15146277067119ad816282b8e57727295b3adee14075carll printf("%s: ", name); 1515dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1516dd690bf8d81c9119a7228446be12e3366e202176carll printf("%08x %08x %08x %08x ==> %016llx %016llx\n", 1517dd690bf8d81c9119a7228446be12e3366e202176carll vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[1], dst[0]); 1518dd690bf8d81c9119a7228446be12e3366e202176carll else 1519dd690bf8d81c9119a7228446be12e3366e202176carll printf("%08x %08x %08x %08x ==> %016llx %016llx\n", 1520dd690bf8d81c9119a7228446be12e3366e202176carll vwargs[i], vwargs[i+1], vwargs[i+2], vwargs[i+3], dst[0], dst[1]); 15216277067119ad816282b8e57727295b3adee14075carll } 15226277067119ad816282b8e57727295b3adee14075carll} 15236277067119ad816282b8e57727295b3adee14075carll 15246277067119ad816282b8e57727295b3adee14075carll 1525a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_stq_two_regs_imm16 (const char* name, 1526a81925998c22a5af981c6933f56f24437e790447carll test_func_t func_IN, 1527a81925998c22a5af981c6933f56f24437e790447carll unused uint32_t test_flags) 1528a81925998c22a5af981c6933f56f24437e790447carll{ 1529a81925998c22a5af981c6933f56f24437e790447carll /* Store quad word from register pair */ 1530a81925998c22a5af981c6933f56f24437e790447carll int offs, k; 1531a81925998c22a5af981c6933f56f24437e790447carll HWord_t base; 1532a81925998c22a5af981c6933f56f24437e790447carll Word_t *iargs_priv; 1533a81925998c22a5af981c6933f56f24437e790447carll 1534a81925998c22a5af981c6933f56f24437e790447carll // private iargs table to store to, note storing pair of regs 1535a81925998c22a5af981c6933f56f24437e790447carll iargs_priv = memalign16(2 * sizeof(Word_t)); 1536a81925998c22a5af981c6933f56f24437e790447carll 1537a81925998c22a5af981c6933f56f24437e790447carll base = (HWord_t)&iargs_priv[0]; 1538a81925998c22a5af981c6933f56f24437e790447carll for (k = 0; k < 2; k++) // clear array 1539a81925998c22a5af981c6933f56f24437e790447carll iargs_priv[k] = 0; 1540a81925998c22a5af981c6933f56f24437e790447carll 1541a81925998c22a5af981c6933f56f24437e790447carll offs = 0; 1542a81925998c22a5af981c6933f56f24437e790447carll 1543a81925998c22a5af981c6933f56f24437e790447carll /* setup source register pair */ 1544a81925998c22a5af981c6933f56f24437e790447carll r14 = (HWord_t) 0xABCDEF0123456789ULL; 1545a81925998c22a5af981c6933f56f24437e790447carll r15 = (HWord_t) 0x1133557722446688ULL; 1546a81925998c22a5af981c6933f56f24437e790447carll 1547a81925998c22a5af981c6933f56f24437e790447carll r16 = base; // store to r16 + offs 1548a81925998c22a5af981c6933f56f24437e790447carll 1549a81925998c22a5af981c6933f56f24437e790447carll (*func_IN)(); 1550a81925998c22a5af981c6933f56f24437e790447carll 1551a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__ 1552a81925998c22a5af981c6933f56f24437e790447carll printf("%s %08x,%08x, %2d => " 1553a81925998c22a5af981c6933f56f24437e790447carll#else 1554a81925998c22a5af981c6933f56f24437e790447carll printf("%s %016llx,%016llx, %3d => " 1555a81925998c22a5af981c6933f56f24437e790447carll#endif 1556a81925998c22a5af981c6933f56f24437e790447carll "%016llx,%016llx)\n", 1557a81925998c22a5af981c6933f56f24437e790447carll name, r14, r15, offs, iargs_priv[0], iargs_priv[1]); 1558a81925998c22a5af981c6933f56f24437e790447carll 1559a81925998c22a5af981c6933f56f24437e790447carll if (verbose) printf("\n"); 1560a81925998c22a5af981c6933f56f24437e790447carll free(iargs_priv); 1561a81925998c22a5af981c6933f56f24437e790447carll} 1562a81925998c22a5af981c6933f56f24437e790447carll 1563a81925998c22a5af981c6933f56f24437e790447carll 1564a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_stq_three_regs (const char* name, 1565a81925998c22a5af981c6933f56f24437e790447carll test_func_t func_IN, 1566a81925998c22a5af981c6933f56f24437e790447carll unused uint32_t test_flags) 1567a81925998c22a5af981c6933f56f24437e790447carll{ 1568a81925998c22a5af981c6933f56f24437e790447carll /* Store quad word from register pair */ 1569a81925998c22a5af981c6933f56f24437e790447carll volatile uint32_t flags, xer; 1570a81925998c22a5af981c6933f56f24437e790447carll int k; 1571a81925998c22a5af981c6933f56f24437e790447carll HWord_t base; 1572a81925998c22a5af981c6933f56f24437e790447carll 1573a81925998c22a5af981c6933f56f24437e790447carll base = (HWord_t)&mem_resv[0]; 1574a81925998c22a5af981c6933f56f24437e790447carll for (k = 0; k < 2; k++) // setup array for lqarx inst 1575a81925998c22a5af981c6933f56f24437e790447carll mem_resv[k] = k; 1576a81925998c22a5af981c6933f56f24437e790447carll 1577a81925998c22a5af981c6933f56f24437e790447carll /* setup source register pair for store */ 1578a81925998c22a5af981c6933f56f24437e790447carll r14 = ZERO; 1579a81925998c22a5af981c6933f56f24437e790447carll r15 = ZERO; 1580a81925998c22a5af981c6933f56f24437e790447carll r16 = base; // store to r16 + r17 1581a81925998c22a5af981c6933f56f24437e790447carll r17 = ZERO; 1582a81925998c22a5af981c6933f56f24437e790447carll 1583a81925998c22a5af981c6933f56f24437e790447carll /* In order for the store to occur, the lqarx instruction must first 1584a81925998c22a5af981c6933f56f24437e790447carll * be used to load from the address thus creating a reservation at the 1585a81925998c22a5af981c6933f56f24437e790447carll * memory address. The lqarx instruction is done in the test_stqcx(), 1586a81925998c22a5af981c6933f56f24437e790447carll * then registers 14, r15 are changed to the data to be stored in memory 1587a81925998c22a5af981c6933f56f24437e790447carll * by the stqcx instruction. 1588a81925998c22a5af981c6933f56f24437e790447carll */ 1589a81925998c22a5af981c6933f56f24437e790447carll SET_CR_XER_ZERO; 1590a81925998c22a5af981c6933f56f24437e790447carll (*func_IN)(); 1591a81925998c22a5af981c6933f56f24437e790447carll GET_CR_XER(flags,xer); 1592a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__ 1593a81925998c22a5af981c6933f56f24437e790447carll printf("%s %08x,%08x, => " 1594a81925998c22a5af981c6933f56f24437e790447carll#else 1595a81925998c22a5af981c6933f56f24437e790447carll printf("%s %016llx,%016llx => " 1596a81925998c22a5af981c6933f56f24437e790447carll#endif 1597a81925998c22a5af981c6933f56f24437e790447carll "%016llx,%016llx; CR=%08x\n", 1598a81925998c22a5af981c6933f56f24437e790447carll name, r14, r15, mem_resv[0], mem_resv[1], flags); 1599a81925998c22a5af981c6933f56f24437e790447carll 1600a81925998c22a5af981c6933f56f24437e790447carll if (verbose) printf("\n"); 1601a81925998c22a5af981c6933f56f24437e790447carll} 1602a81925998c22a5af981c6933f56f24437e790447carll 1603a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_ldq_two_regs_imm16 (const char* name, 1604a81925998c22a5af981c6933f56f24437e790447carll test_func_t func_IN, 1605a81925998c22a5af981c6933f56f24437e790447carll unused uint32_t test_flags) 1606a81925998c22a5af981c6933f56f24437e790447carll{ 1607a81925998c22a5af981c6933f56f24437e790447carll /* load quad word from register pair */ 1608a81925998c22a5af981c6933f56f24437e790447carll volatile uint32_t flags, xer; 1609a81925998c22a5af981c6933f56f24437e790447carll Word_t * mem_priv; 1610a81925998c22a5af981c6933f56f24437e790447carll HWord_t base; 1611a81925998c22a5af981c6933f56f24437e790447carll 1612a81925998c22a5af981c6933f56f24437e790447carll // private iargs table to store to, note storing pair of regs 1613a81925998c22a5af981c6933f56f24437e790447carll mem_priv = memalign16(2 * sizeof(Word_t)); // want 128-bits 1614a81925998c22a5af981c6933f56f24437e790447carll 1615a81925998c22a5af981c6933f56f24437e790447carll base = (HWord_t)&mem_priv[0]; 1616a81925998c22a5af981c6933f56f24437e790447carll 1617a81925998c22a5af981c6933f56f24437e790447carll mem_priv[0] = 0xAACCEE0011335577ULL; 1618a81925998c22a5af981c6933f56f24437e790447carll mem_priv[1] = 0xABCDEF0123456789ULL; 1619a81925998c22a5af981c6933f56f24437e790447carll 1620a81925998c22a5af981c6933f56f24437e790447carll r14 = 0; 1621a81925998c22a5af981c6933f56f24437e790447carll r15 = 0; 1622a81925998c22a5af981c6933f56f24437e790447carll r16 = base; // fetch from r16 + offs 1623a81925998c22a5af981c6933f56f24437e790447carll SET_CR_XER_ZERO; 1624a81925998c22a5af981c6933f56f24437e790447carll (*func_IN)(); 1625a81925998c22a5af981c6933f56f24437e790447carll GET_CR_XER(flags,xer); 1626a81925998c22a5af981c6933f56f24437e790447carll 1627a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__ 1628a81925998c22a5af981c6933f56f24437e790447carll printf("%s (0x%016llx, 0x%016llx) => (reg_pair = %08x,%08x)\n", 1629a81925998c22a5af981c6933f56f24437e790447carll#else 1630a81925998c22a5af981c6933f56f24437e790447carll printf("%s (0x%016llx, 0x%016llx) => (reg_pair = 0x%016llx, 0x%016llx)\n", 1631a81925998c22a5af981c6933f56f24437e790447carll#endif 1632a81925998c22a5af981c6933f56f24437e790447carll name, mem_priv[0], mem_priv[1], r14, r15); 1633a81925998c22a5af981c6933f56f24437e790447carll 1634a81925998c22a5af981c6933f56f24437e790447carll if (verbose) printf("\n"); 1635a81925998c22a5af981c6933f56f24437e790447carll 1636a81925998c22a5af981c6933f56f24437e790447carll free(mem_priv); 1637a81925998c22a5af981c6933f56f24437e790447carll} 1638a81925998c22a5af981c6933f56f24437e790447carll 1639a81925998c22a5af981c6933f56f24437e790447carllstatic void test_int_ldq_three_regs (const char* name, 1640a81925998c22a5af981c6933f56f24437e790447carll test_func_t func_IN, 1641a81925998c22a5af981c6933f56f24437e790447carll unused uint32_t test_flags) 1642a81925998c22a5af981c6933f56f24437e790447carll{ 1643a81925998c22a5af981c6933f56f24437e790447carll /* load quad word from register pair */ 1644a81925998c22a5af981c6933f56f24437e790447carll HWord_t base; 1645a81925998c22a5af981c6933f56f24437e790447carll 1646a81925998c22a5af981c6933f56f24437e790447carll base = (HWord_t)&mem_resv[0]; 1647a81925998c22a5af981c6933f56f24437e790447carll 1648a81925998c22a5af981c6933f56f24437e790447carll mem_resv[0] = 0xAACCEE0011335577ULL; 1649a81925998c22a5af981c6933f56f24437e790447carll mem_resv[1] = 0xABCDEF0123456789ULL; 1650a81925998c22a5af981c6933f56f24437e790447carll 1651a81925998c22a5af981c6933f56f24437e790447carll r14 = 0; 1652a81925998c22a5af981c6933f56f24437e790447carll r15 = 0; 1653a81925998c22a5af981c6933f56f24437e790447carll r16 = base; // fetch from r16 + r17 1654a81925998c22a5af981c6933f56f24437e790447carll r17 = 0; 1655a81925998c22a5af981c6933f56f24437e790447carll 1656a81925998c22a5af981c6933f56f24437e790447carll (*func_IN)(); 1657a81925998c22a5af981c6933f56f24437e790447carll 1658a81925998c22a5af981c6933f56f24437e790447carll#ifndef __powerpc64__ 1659a81925998c22a5af981c6933f56f24437e790447carll printf("%s (0x%016llx, 0x%016llx) => (reg_pair = 0x%08x, 0x%08x)\n", 1660a81925998c22a5af981c6933f56f24437e790447carll#else 1661a81925998c22a5af981c6933f56f24437e790447carll printf("%s (0x%016llx, 0x%016llx) => (reg_pair = 0x%016llx, 0x%016llx)\n", 1662a81925998c22a5af981c6933f56f24437e790447carll#endif 1663a81925998c22a5af981c6933f56f24437e790447carll name, mem_resv[0], mem_resv[1], r14, r15); 1664a81925998c22a5af981c6933f56f24437e790447carll if (verbose) printf("\n"); 1665a81925998c22a5af981c6933f56f24437e790447carll 1666a81925998c22a5af981c6933f56f24437e790447carll} 1667a81925998c22a5af981c6933f56f24437e790447carll 1668e6bd3e49c6f37b871974c3b5212476f1eed3fb77carllstatic void test_av_dint_three_args (const char* name, test_func_t func, 1669e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll unused uint32_t test_flags) 167024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll{ 167124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 167224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll unsigned long long * dst; 167324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll int i,j, k; 1674e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll int family = test_flags & PPC_FAMILY; 1675e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll unsigned long long cin_vals[] = { 1676e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll // First pair of ULLs have LSB=0, so cin is '0'. 1677e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll // Second pair of ULLs have LSB=1, so cin is '1'. 1678e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 0xf000000000000000ULL, 0xf000000000000000ULL, 1679e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 0xf000000000000000ULL, 0xf000000000000001ULL 1680e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll }; 1681a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (i = 0; i < NB_VDARGS - 1; i+=2) { 1682dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1683dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ vdargs[i+1], vdargs[i] }; 1684dd690bf8d81c9119a7228446be12e3366e202176carll else 1685dd690bf8d81c9119a7228446be12e3366e202176carll vec_inA = (vector unsigned long long){ vdargs[i], vdargs[i+1] }; 1686a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (j = 0; j < NB_VDARGS - 1; j+=2) { 1687dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1688dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB = (vector unsigned long long){ vdargs[j+1], vdargs[j] }; 1689dd690bf8d81c9119a7228446be12e3366e202176carll else 1690dd690bf8d81c9119a7228446be12e3366e202176carll vec_inB = (vector unsigned long long){ vdargs[j], vdargs[j+1] }; 1691a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes for (k = 0; k < 4 - 1; k+=2) { 1692dd690bf8d81c9119a7228446be12e3366e202176carll if (family == PPC_ALTIVECQ) { 1693dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1694dd690bf8d81c9119a7228446be12e3366e202176carll vec_inC = (vector unsigned long long){ cin_vals[k+1], cin_vals[k] }; 1695dd690bf8d81c9119a7228446be12e3366e202176carll else 1696dd690bf8d81c9119a7228446be12e3366e202176carll vec_inC = (vector unsigned long long){ cin_vals[k], cin_vals[k+1] }; 1697dd690bf8d81c9119a7228446be12e3366e202176carll } else { 1698dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1699dd690bf8d81c9119a7228446be12e3366e202176carll vec_inC = (vector unsigned long long){ vdargs[k+1], vdargs[k] }; 1700dd690bf8d81c9119a7228446be12e3366e202176carll else 1701dd690bf8d81c9119a7228446be12e3366e202176carll vec_inC = (vector unsigned long long){ vdargs[k], vdargs[k+1] }; 1702dd690bf8d81c9119a7228446be12e3366e202176carll } 170324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll vec_out = (vector unsigned long long){ 0,0 }; 170424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 170524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll (*func)(); 170624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll dst = (unsigned long long*)&vec_out; 170724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll printf("%s: ", name); 1708e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll if (family == PPC_ALTIVECQ) { 1709dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1710dd690bf8d81c9119a7228446be12e3366e202176carll printf("%016llx%016llx @@ %016llx%016llx @@ %llx ==> %016llx%016llx\n", 1711dd690bf8d81c9119a7228446be12e3366e202176carll vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1], cin_vals[k+1], 1712dd690bf8d81c9119a7228446be12e3366e202176carll dst[1], dst[0]); 1713dd690bf8d81c9119a7228446be12e3366e202176carll else 1714dd690bf8d81c9119a7228446be12e3366e202176carll printf("%016llx%016llx @@ %016llx%016llx @@ %llx ==> %016llx%016llx\n", 1715dd690bf8d81c9119a7228446be12e3366e202176carll vdargs[i], vdargs[i+1], vdargs[j], vdargs[j+1], cin_vals[k+1], 1716dd690bf8d81c9119a7228446be12e3366e202176carll dst[0], dst[1]); 1717e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll } else { 1718e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll printf("%016llx @@ %016llx @@ %016llx ", vdargs[i], vdargs[j], vdargs[k]); 1719dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1720dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[1]); 1721dd690bf8d81c9119a7228446be12e3366e202176carll else 1722dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[0]); 1723e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll printf("\t%016llx @@ %016llx @@ %016llx ", vdargs[i+1], vdargs[j+1], vdargs[k+1]); 1724dd690bf8d81c9119a7228446be12e3366e202176carll if (isLE) 1725dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[0]); 1726dd690bf8d81c9119a7228446be12e3366e202176carll else 1727dd690bf8d81c9119a7228446be12e3366e202176carll printf(" ==> %016llx\n", dst[1]); 1728e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll } 172924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 173024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 173124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 173224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll} 1733a81925998c22a5af981c6933f56f24437e790447carll 1734a81925998c22a5af981c6933f56f24437e790447carll 17356277067119ad816282b8e57727295b3adee14075carll/* The ALTIVEC_LOOPS and altive_loops defined below are used in do_tests. 17366277067119ad816282b8e57727295b3adee14075carll * Add new values to the end; do not change order, since the altivec_loops 17376277067119ad816282b8e57727295b3adee14075carll * array is indexed using the enumerated values defined by ALTIVEC_LOOPS. 17386277067119ad816282b8e57727295b3adee14075carll */ 1739a81925998c22a5af981c6933f56f24437e790447carllenum ALTIVEC_LOOPS { 1740a81925998c22a5af981c6933f56f24437e790447carll ALTV_MOV, 17416277067119ad816282b8e57727295b3adee14075carll ALTV_DINT, 17426277067119ad816282b8e57727295b3adee14075carll ALTV_INT_DRES, 17436277067119ad816282b8e57727295b3adee14075carll ALTV_DINT_IRES, 174424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll ALTV_ONE_INT_DRES, 174524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll ALTV_DINT_THREE_ARGS, 174624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll ALTV_DINT_ONE_ARG, 174724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll ALTV_SHA, 174824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll ATLV_BCD 1749a81925998c22a5af981c6933f56f24437e790447carll}; 17506277067119ad816282b8e57727295b3adee14075carll 1751a81925998c22a5af981c6933f56f24437e790447carllstatic test_loop_t altivec_loops[] = { 1752a81925998c22a5af981c6933f56f24437e790447carll &test_move_special, 1753a81925998c22a5af981c6933f56f24437e790447carll &test_av_dint_two_args, 17546277067119ad816282b8e57727295b3adee14075carll &test_av_wint_two_args_dres, 17556277067119ad816282b8e57727295b3adee14075carll &test_av_dint_to_int_two_args, 17566277067119ad816282b8e57727295b3adee14075carll &test_av_wint_one_arg_dres, 1757e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll &test_av_dint_three_args, 175824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll &test_av_dint_one_arg, 175924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll &test_av_dint_one_arg_SHA, 176024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll &test_av_bcd, 1761a81925998c22a5af981c6933f56f24437e790447carll NULL 1762a81925998c22a5af981c6933f56f24437e790447carll}; 1763a81925998c22a5af981c6933f56f24437e790447carll 1764dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll/* Used in do_tests, indexed by flags->nb_args 1765dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll Elements correspond to enum test_flags::num args 1766dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll*/ 1767a81925998c22a5af981c6933f56f24437e790447carllstatic test_loop_t int_loops[] = { 1768a81925998c22a5af981c6933f56f24437e790447carll /* The #defines for the family, number registers need the array 1769a81925998c22a5af981c6933f56f24437e790447carll * to be properly indexed. This test is for the new ISA 2.0.7 1770a81925998c22a5af981c6933f56f24437e790447carll * instructions. The infrastructure has been left for the momemnt 1771a81925998c22a5af981c6933f56f24437e790447carll */ 1772a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_one_arg, 1773a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_two_args, 1774a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_three_args, 1775a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_two_args, 1776a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_one_reg_imm16, 1777a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_one_reg_imm16, 1778a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_special, 1779a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_ld_one_reg_imm16, 1780a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_ld_two_regs, 1781a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_st_two_regs_imm16, 1782a81925998c22a5af981c6933f56f24437e790447carll NULL, //&test_int_st_three_regs, 1783a81925998c22a5af981c6933f56f24437e790447carll &test_int_stq_two_regs_imm16, 1784a81925998c22a5af981c6933f56f24437e790447carll &test_int_ldq_two_regs_imm16, 1785a81925998c22a5af981c6933f56f24437e790447carll &test_int_stq_three_regs, 1786a81925998c22a5af981c6933f56f24437e790447carll &test_int_ldq_three_regs, 1787dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 1788dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1789a81925998c22a5af981c6933f56f24437e790447carll/* Used in do_tests, indexed by flags->nb_args 1790a81925998c22a5af981c6933f56f24437e790447carll Elements correspond to enum test_flags::num args 1791a81925998c22a5af981c6933f56f24437e790447carll Must have NULL for last entry. 1792a81925998c22a5af981c6933f56f24437e790447carll */ 1793a81925998c22a5af981c6933f56f24437e790447carllstatic test_loop_t float_loops[] = { 1794a81925998c22a5af981c6933f56f24437e790447carll NULL, 1795a81925998c22a5af981c6933f56f24437e790447carll &test_float_two_args, 1796a81925998c22a5af981c6933f56f24437e790447carll}; 1797a81925998c22a5af981c6933f56f24437e790447carll 1798a81925998c22a5af981c6933f56f24437e790447carll 1799a81925998c22a5af981c6933f56f24437e790447carllstatic test_t tests_fa_ops_two[] = { 1800a81925998c22a5af981c6933f56f24437e790447carll { &test_fmrgew , "fmrgew", }, 1801a81925998c22a5af981c6933f56f24437e790447carll { &test_fmrgow , "fmrgow", }, 1802a81925998c22a5af981c6933f56f24437e790447carll { NULL, NULL, }, 1803dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 1804dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1805dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic test_table_t all_tests[] = { 1806dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { 1807dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll tests_move_ops_spe, 1808dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "PPC VSR special move insns", 18096277067119ad816282b8e57727295b3adee14075carll PPC_ALTIVECD | PPC_MOV | PPC_ONE_ARG, 1810dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll }, 1811dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { 18126277067119ad816282b8e57727295b3adee14075carll tests_aa_dbl_ops_two_args, 18136277067119ad816282b8e57727295b3adee14075carll "PPC altivec double word integer insns (arith, compare) with two args", 18146277067119ad816282b8e57727295b3adee14075carll PPC_ALTIVECD | PPC_ARITH | PPC_TWO_ARGS, 18156277067119ad816282b8e57727295b3adee14075carll }, 18166277067119ad816282b8e57727295b3adee14075carll { 18176277067119ad816282b8e57727295b3adee14075carll tests_aa_word_ops_two_args_dres, 18186277067119ad816282b8e57727295b3adee14075carll "PPC altivec integer word instructions with two input args, double word result", 18196277067119ad816282b8e57727295b3adee14075carll PPC_ALTIVEC | PPC_ARITH_DRES | PPC_TWO_ARGS, 18206277067119ad816282b8e57727295b3adee14075carll }, 18216277067119ad816282b8e57727295b3adee14075carll { 18226277067119ad816282b8e57727295b3adee14075carll tests_aa_dbl_to_int_two_args, 18236277067119ad816282b8e57727295b3adee14075carll "PPC altivec doubleword-to-integer instructions with two input args, saturated integer result", 18246277067119ad816282b8e57727295b3adee14075carll PPC_ALTIVECD | PPC_DOUBLE_IN_IRES | PPC_TWO_ARGS, 18256277067119ad816282b8e57727295b3adee14075carll }, 18266277067119ad816282b8e57727295b3adee14075carll { 18276277067119ad816282b8e57727295b3adee14075carll tests_aa_word_ops_one_arg_dres, 18286277067119ad816282b8e57727295b3adee14075carll "PPC altivec integer word instructions with one input arg, double word result", 18296277067119ad816282b8e57727295b3adee14075carll PPC_ALTIVEC | PPC_ARITH_DRES | PPC_ONE_ARG, 1830dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll }, 1831a81925998c22a5af981c6933f56f24437e790447carll { 1832a81925998c22a5af981c6933f56f24437e790447carll tests_istq_ops_two_i16, 1833a81925998c22a5af981c6933f56f24437e790447carll "PPC store quadword insns\n with one register + one 16 bits immediate args with flags update", 1834a81925998c22a5af981c6933f56f24437e790447carll 0x0001050c, 1835a81925998c22a5af981c6933f56f24437e790447carll }, 1836a81925998c22a5af981c6933f56f24437e790447carll { 1837a81925998c22a5af981c6933f56f24437e790447carll tests_ildq_ops_two_i16, 1838a81925998c22a5af981c6933f56f24437e790447carll "PPC load quadword insns\n with one register + one 16 bits immediate args with flags update", 1839a81925998c22a5af981c6933f56f24437e790447carll 0x0001050d, 1840a81925998c22a5af981c6933f56f24437e790447carll }, 1841a81925998c22a5af981c6933f56f24437e790447carll { 1842a81925998c22a5af981c6933f56f24437e790447carll tests_ldq_ops_three, 1843a81925998c22a5af981c6933f56f24437e790447carll "PPC load quadword insns\n with three register args", 1844a81925998c22a5af981c6933f56f24437e790447carll 0x0001050f, 1845a81925998c22a5af981c6933f56f24437e790447carll }, 1846a81925998c22a5af981c6933f56f24437e790447carll { 1847a81925998c22a5af981c6933f56f24437e790447carll tests_stq_ops_three, 1848a81925998c22a5af981c6933f56f24437e790447carll "PPC store quadword insns\n with three register args", 1849a81925998c22a5af981c6933f56f24437e790447carll 0x0001050e, 1850a81925998c22a5af981c6933f56f24437e790447carll }, 1851a81925998c22a5af981c6933f56f24437e790447carll { 1852a81925998c22a5af981c6933f56f24437e790447carll tests_fa_ops_two, 1853a81925998c22a5af981c6933f56f24437e790447carll "PPC floating point arith insns with two args", 1854a81925998c22a5af981c6933f56f24437e790447carll 0x00020102, 1855a81925998c22a5af981c6933f56f24437e790447carll }, 185624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { 185724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll tests_aa_ops_three , 185824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll "PPC altivec integer logical insns with three args", 185924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x00060203, 186024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll }, 186124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { 186224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll tests_aa_dbl_ops_one_arg, 186324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll "PPC altivec one vector input arg, hex result", 186424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x00060201, 186524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll }, 186624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { 186724e40de8f2127d70117ed9af3bc4474cbc29cb8acarll tests_aa_SHA_ops, 186824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll "PPC altivec SSH insns", 186924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x00040B01, 187024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll }, 187124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { 187224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll tests_aa_bcd_ops, 187324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll "PPC altivec BCD insns", 187424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll 0x00040B02, 187524e40de8f2127d70117ed9af3bc4474cbc29cb8acarll }, 1876e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { 1877e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll tests_aa_quadword_two_args, 1878e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll "PPC altivec quadword insns, two input args", 1879e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 0x00070102, 1880e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll }, 1881e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll { 1882e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll tests_aa_quadword_three_args, 1883e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll "PPC altivec quadword insns, three input args", 1884e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll 0x00070103 1885e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll }, 1886dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll { NULL, NULL, 0x00000000, }, 1887dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll}; 1888dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1889dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void do_tests ( insn_sel_flags_t seln_flags, 1890dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll char *filter) 1891dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 1892dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll test_loop_t *loop; 1893dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll test_t *tests; 1894dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int nb_args, type, family; 1895dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int i, j, n; 1896dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int exact; 1897dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1898dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll exact = check_filter(filter); 1899dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll n = 0; 1900dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (i=0; all_tests[i].name != NULL; i++) { 1901dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll nb_args = all_tests[i].flags & PPC_NB_ARGS; 1902dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1903dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Check number of arguments */ 1904dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if ((nb_args == 1 && !seln_flags.one_arg) || 1905dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (nb_args == 2 && !seln_flags.two_args) || 1906dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (nb_args == 3 && !seln_flags.three_args)){ 1907dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 1908dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1909dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Check instruction type */ 1910dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll type = all_tests[i].flags & PPC_TYPE; 1911dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if ((type == PPC_ARITH && !seln_flags.arith) || 1912dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (type == PPC_LOGICAL && !seln_flags.logical) || 1913dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (type == PPC_COMPARE && !seln_flags.compare) || 1914dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (type == PPC_LDST && !seln_flags.ldst) || 1915dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (type == PPC_MOV && !seln_flags.ldst) || 1916dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (type == PPC_POPCNT && !seln_flags.arith)) { 1917dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 1918dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1919dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1920dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Check instruction family */ 1921dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll family = all_tests[i].flags & PPC_FAMILY; 1922dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if ((family == PPC_INTEGER && !seln_flags.integer) || 1923dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (family == PPC_FLOAT && !seln_flags.floats) || 1924dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (family == PPC_ALTIVEC && !seln_flags.altivec) || 19256277067119ad816282b8e57727295b3adee14075carll (family == PPC_ALTIVECD && !seln_flags.altivec) || 1926e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll (family == PPC_ALTIVECQ && !seln_flags.altivec) || 1927dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (family == PPC_FALTIVEC && !seln_flags.faltivec)) { 1928dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 1929dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1930dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Check flags update */ 1931dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (((all_tests[i].flags & PPC_CR) && seln_flags.cr == 0) || 1932dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (!(all_tests[i].flags & PPC_CR) && seln_flags.cr == 1)) 1933dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 1934dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1935dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* All passed, do the tests */ 1936dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll tests = all_tests[i].tests; 1937dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1938dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll loop = NULL; 1939dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1940dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Select the test loop */ 1941dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll switch (family) { 1942dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case PPC_INTEGER: 1943a81925998c22a5af981c6933f56f24437e790447carll mem_resv = memalign16(2 * sizeof(HWord_t)); // want 128-bits 1944a81925998c22a5af981c6933f56f24437e790447carll loop = &int_loops[nb_args - 1]; 1945dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 1946dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1947dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case PPC_FLOAT: 1948a81925998c22a5af981c6933f56f24437e790447carll loop = &float_loops[nb_args - 1]; 1949dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 1950dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1951e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll case PPC_ALTIVECQ: 1952e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll if (nb_args == 2) 1953e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll loop = &altivec_loops[ALTV_DINT]; 1954e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll else if (nb_args == 3) 1955e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll loop = &altivec_loops[ALTV_DINT_THREE_ARGS]; 1956e6bd3e49c6f37b871974c3b5212476f1eed3fb77carll break; 19576277067119ad816282b8e57727295b3adee14075carll case PPC_ALTIVECD: 1958dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll switch (type) { 19596277067119ad816282b8e57727295b3adee14075carll case PPC_MOV: 19606277067119ad816282b8e57727295b3adee14075carll loop = &altivec_loops[ALTV_MOV]; 19616277067119ad816282b8e57727295b3adee14075carll break; 19626277067119ad816282b8e57727295b3adee14075carll case PPC_ARITH: 19636277067119ad816282b8e57727295b3adee14075carll loop = &altivec_loops[ALTV_DINT]; 19646277067119ad816282b8e57727295b3adee14075carll break; 19656277067119ad816282b8e57727295b3adee14075carll case PPC_DOUBLE_IN_IRES: 19666277067119ad816282b8e57727295b3adee14075carll loop = &altivec_loops[ALTV_DINT_IRES]; 19676277067119ad816282b8e57727295b3adee14075carll break; 196824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case PPC_LOGICAL: 196924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll if (nb_args == 3) 197024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll loop = &altivec_loops[ALTV_DINT_THREE_ARGS]; 197124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll else if (nb_args ==1) 197224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll loop = &altivec_loops[ALTV_DINT_ONE_ARG]; 197324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 19746277067119ad816282b8e57727295b3adee14075carll default: 19756277067119ad816282b8e57727295b3adee14075carll printf("No altivec test defined for type %x\n", type); 1976dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 1977dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 1978dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 1979dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case PPC_FALTIVEC: 1980dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("Currently there are no floating altivec tests in this testsuite.\n"); 1981dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 1982dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 19836277067119ad816282b8e57727295b3adee14075carll case PPC_ALTIVEC: 19846277067119ad816282b8e57727295b3adee14075carll switch (type) { 19856277067119ad816282b8e57727295b3adee14075carll case PPC_ARITH_DRES: 198624e40de8f2127d70117ed9af3bc4474cbc29cb8acarll { 19876277067119ad816282b8e57727295b3adee14075carll switch (nb_args) { 19886277067119ad816282b8e57727295b3adee14075carll case 1: 19896277067119ad816282b8e57727295b3adee14075carll loop = &altivec_loops[ALTV_ONE_INT_DRES]; 19906277067119ad816282b8e57727295b3adee14075carll break; 19916277067119ad816282b8e57727295b3adee14075carll case 2: 19926277067119ad816282b8e57727295b3adee14075carll loop = &altivec_loops[ALTV_INT_DRES]; 19936277067119ad816282b8e57727295b3adee14075carll break; 19946277067119ad816282b8e57727295b3adee14075carll default: 19956277067119ad816282b8e57727295b3adee14075carll printf("No altivec test defined for number args %d\n", nb_args); 19966277067119ad816282b8e57727295b3adee14075carll } 19976277067119ad816282b8e57727295b3adee14075carll break; 199824e40de8f2127d70117ed9af3bc4474cbc29cb8acarll } 199924e40de8f2127d70117ed9af3bc4474cbc29cb8acarll case PPC_SHA_OR_BCD: 200024e40de8f2127d70117ed9af3bc4474cbc29cb8acarll if (nb_args == 1) 200124e40de8f2127d70117ed9af3bc4474cbc29cb8acarll loop = &altivec_loops[ALTV_SHA]; 200224e40de8f2127d70117ed9af3bc4474cbc29cb8acarll else 200324e40de8f2127d70117ed9af3bc4474cbc29cb8acarll loop = &altivec_loops[ATLV_BCD]; 200424e40de8f2127d70117ed9af3bc4474cbc29cb8acarll break; 20056277067119ad816282b8e57727295b3adee14075carll default: 20066277067119ad816282b8e57727295b3adee14075carll printf("No altivec test defined for type %x\n", type); 20076277067119ad816282b8e57727295b3adee14075carll } 20086277067119ad816282b8e57727295b3adee14075carll break; 20096277067119ad816282b8e57727295b3adee14075carll 2010dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll default: 2011dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("ERROR: unknown insn family %08x\n", family); 2012dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll continue; 2013dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2014dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (1 || verbose > 0) 2015dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll for (j=0; tests[j].name != NULL; j++) { 2016dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (check_name(tests[j].name, filter, exact)) { 2017dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (verbose > 1) 2018dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("Test instruction %s\n", tests[j].name); 2019dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (loop != NULL) 2020dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll (*loop)(tests[j].name, tests[j].func, all_tests[i].flags); 2021dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("\n"); 2022dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll n++; 2023dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2024dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2025dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (verbose) printf("\n"); 2026dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2027dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("All done. Tested %d different instructions\n", n); 2028dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 2029dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2030dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2031dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllstatic void usage (void) 2032dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 2033dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll fprintf(stderr, 2034dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "Usage: jm-insns [OPTION]\n" 2035dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "\t-i: test integer instructions (default)\n" 2036dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "\t-f: test floating point instructions\n" 2037dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "\t-a: test altivec instructions\n" 2038dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "\t-A: test all (int, fp, altivec) instructions\n" 2039dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "\t-v: be verbose\n" 2040dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll "\t-h: display this help and exit\n" 2041dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ); 2042dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 2043dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2044dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif 2045dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2046dfbf294f08ac004a60cb3b528d544cb7d0404eb0carllint main (int argc, char **argv) 2047dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll{ 2048dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#ifdef HAS_ISA_2_07 2049dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll /* Simple usage: 2050dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ./jm-insns -i => int insns 2051dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ./jm-insns -f => fp insns 2052dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ./jm-insns -a => av insns 2053dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll ./jm-insns -A => int, fp and avinsns 2054dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll */ 2055dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll char *filter = NULL; 2056dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll insn_sel_flags_t flags; 2057dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll int c; 2058dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2059dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Args 2060dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.one_arg = 1; 2061dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.two_args = 1; 2062dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.three_args = 1; 2063dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Type 2064dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.arith = 1; 2065dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.logical = 1; 2066dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.compare = 1; 2067dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.ldst = 1; 2068dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Family 2069dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.integer = 0; 2070dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.floats = 0; 2071dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.altivec = 0; 2072dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.faltivec = 0; 2073dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll // Flags 2074dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.cr = 2; 2075dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2076dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll while ((c = getopt(argc, argv, "ifahvA")) != -1) { 2077dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll switch (c) { 2078dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case 'i': 2079dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.integer = 1; 2080dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 2081dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case 'f': 2082a81925998c22a5af981c6933f56f24437e790447carll build_fargs_table(); 2083dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.floats = 1; 2084dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 2085dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case 'a': 2086dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.altivec = 1; 2087dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.faltivec = 1; 2088dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 2089dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case 'A': 2090dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.integer = 1; 2091dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.floats = 1; 2092dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.altivec = 1; 2093dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll flags.faltivec = 1; 2094dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 2095dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case 'h': 2096dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll usage(); 2097dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll return 0; 2098dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll case 'v': 2099dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll verbose++; 2100dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll break; 2101dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll default: 2102dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll usage(); 2103dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll fprintf(stderr, "Unknown argument: '%c'\n", c); 2104dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll return 1; 2105dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2106dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2107dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2108dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll arg_list_size = 0; 2109dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 21106277067119ad816282b8e57727295b3adee14075carll build_vargs_table(); 2111dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll if (verbose > 1) { 2112dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("\nInstruction Selection:\n"); 2113dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" n_args: \n"); 2114dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" one_arg = %d\n", flags.one_arg); 2115dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" two_args = %d\n", flags.two_args); 2116dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" three_args = %d\n", flags.three_args); 2117dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" type: \n"); 2118dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" arith = %d\n", flags.arith); 2119dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" logical = %d\n", flags.logical); 2120dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" compare = %d\n", flags.compare); 2121dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" ldst = %d\n", flags.ldst); 2122dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" family: \n"); 2123dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" integer = %d\n", flags.integer); 2124dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" floats = %d\n", flags.floats); 2125dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" altivec = %d\n", flags.altivec); 2126dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" faltivec = %d\n", flags.faltivec); 2127dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" cr update: \n"); 2128dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf(" cr = %d\n", flags.cr); 2129dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("\n"); 2130dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll } 2131dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll 2132dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll do_tests( flags, filter ); 2133dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#else 2134dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll printf("NO ISA 2.07 SUPPORT\n"); 2135dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll#endif 2136dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll return 0; 2137dfbf294f08ac004a60cb3b528d544cb7d0404eb0carll} 2138