From: Julian Seward Date: Sun, 12 Feb 2006 18:56:16 +0000 (+0000) Subject: Yet another ppc test program, which duplicates jm-insns so isn't too useful. X-Git-Tag: svn/VALGRIND_3_2_0~272 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=389aea4ce6be822af214ffd015ed9e9190b2f292;p=thirdparty%2Fvalgrind.git Yet another ppc test program, which duplicates jm-insns so isn't too useful. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5642 --- diff --git a/auxprogs/Makefile.am b/auxprogs/Makefile.am index 4f78fc05cb..43a7d07572 100644 --- a/auxprogs/Makefile.am +++ b/auxprogs/Makefile.am @@ -5,7 +5,7 @@ bin_PROGRAMS = valgrind-listener noinst_SCRIPTS = gen-mdg DotToScc.hs primes.c \ gsl16test gsl16-badfree.patch gsl16-wavelet.patch \ - ppcfround.c + ppcfround.c ppc64shifts.c EXTRA_DIST = $(noinst_SCRIPTS) diff --git a/auxprogs/ppc64shifts.c b/auxprogs/ppc64shifts.c new file mode 100644 index 0000000000..cf8d571c3d --- /dev/null +++ b/auxprogs/ppc64shifts.c @@ -0,0 +1,543 @@ + +#include + +typedef unsigned long long int ULong; + +/* ------------------------ SRADI ------------------------ */ + +#define INSN_SRADI(nnn) \ + void do_sradi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \ + { \ + ULong argW = arg; \ + ULong resW = 0; \ + ULong xerW = 0; \ + __asm__ __volatile__( \ + "sradi %0,%2, " #nnn "\n\t" \ + "mfxer %1" \ + : /*out*/ "=b"(resW), "=b"(xerW) \ + : /*in*/ "b"(argW) \ + : /*trash*/ "cc" \ + ); \ + *res = resW; \ + *xer = xerW; \ + } + +INSN_SRADI(0) +INSN_SRADI(1) +INSN_SRADI(2) +INSN_SRADI(3) +INSN_SRADI(4) +INSN_SRADI(5) +INSN_SRADI(6) +INSN_SRADI(7) +INSN_SRADI(8) +INSN_SRADI(9) +INSN_SRADI(10) +INSN_SRADI(11) +INSN_SRADI(12) +INSN_SRADI(13) +INSN_SRADI(14) +INSN_SRADI(15) +INSN_SRADI(16) +INSN_SRADI(17) +INSN_SRADI(18) +INSN_SRADI(19) +INSN_SRADI(20) +INSN_SRADI(21) +INSN_SRADI(22) +INSN_SRADI(23) +INSN_SRADI(24) +INSN_SRADI(25) +INSN_SRADI(26) +INSN_SRADI(27) +INSN_SRADI(28) +INSN_SRADI(29) +INSN_SRADI(30) +INSN_SRADI(31) +INSN_SRADI(32) +INSN_SRADI(33) +INSN_SRADI(34) +INSN_SRADI(35) +INSN_SRADI(36) +INSN_SRADI(37) +INSN_SRADI(38) +INSN_SRADI(39) +INSN_SRADI(40) +INSN_SRADI(41) +INSN_SRADI(42) +INSN_SRADI(43) +INSN_SRADI(44) +INSN_SRADI(45) +INSN_SRADI(46) +INSN_SRADI(47) +INSN_SRADI(48) +INSN_SRADI(49) +INSN_SRADI(50) +INSN_SRADI(51) +INSN_SRADI(52) +INSN_SRADI(53) +INSN_SRADI(54) +INSN_SRADI(55) +INSN_SRADI(56) +INSN_SRADI(57) +INSN_SRADI(58) +INSN_SRADI(59) +INSN_SRADI(60) +INSN_SRADI(61) +INSN_SRADI(62) +INSN_SRADI(63) + +static void* all_sradi[64] + = { + (void*)&do_sradi_0, + (void*)&do_sradi_1, + (void*)&do_sradi_2, + (void*)&do_sradi_3, + (void*)&do_sradi_4, + (void*)&do_sradi_5, + (void*)&do_sradi_6, + (void*)&do_sradi_7, + (void*)&do_sradi_8, + (void*)&do_sradi_9, + (void*)&do_sradi_10, + (void*)&do_sradi_11, + (void*)&do_sradi_12, + (void*)&do_sradi_13, + (void*)&do_sradi_14, + (void*)&do_sradi_15, + (void*)&do_sradi_16, + (void*)&do_sradi_17, + (void*)&do_sradi_18, + (void*)&do_sradi_19, + (void*)&do_sradi_20, + (void*)&do_sradi_21, + (void*)&do_sradi_22, + (void*)&do_sradi_23, + (void*)&do_sradi_24, + (void*)&do_sradi_25, + (void*)&do_sradi_26, + (void*)&do_sradi_27, + (void*)&do_sradi_28, + (void*)&do_sradi_29, + (void*)&do_sradi_30, + (void*)&do_sradi_31, + (void*)&do_sradi_32, + (void*)&do_sradi_33, + (void*)&do_sradi_34, + (void*)&do_sradi_35, + (void*)&do_sradi_36, + (void*)&do_sradi_37, + (void*)&do_sradi_38, + (void*)&do_sradi_39, + (void*)&do_sradi_40, + (void*)&do_sradi_41, + (void*)&do_sradi_42, + (void*)&do_sradi_43, + (void*)&do_sradi_44, + (void*)&do_sradi_45, + (void*)&do_sradi_46, + (void*)&do_sradi_47, + (void*)&do_sradi_48, + (void*)&do_sradi_49, + (void*)&do_sradi_50, + (void*)&do_sradi_51, + (void*)&do_sradi_52, + (void*)&do_sradi_53, + (void*)&do_sradi_54, + (void*)&do_sradi_55, + (void*)&do_sradi_56, + (void*)&do_sradi_57, + (void*)&do_sradi_58, + (void*)&do_sradi_59, + (void*)&do_sradi_60, + (void*)&do_sradi_61, + (void*)&do_sradi_62, + (void*)&do_sradi_63 + }; + +/* ------------------------ SRAWI ------------------------ */ + +#define INSN_SRAWI(nnn) \ + void do_srawi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \ + { \ + ULong argW = arg; \ + ULong resW = 0; \ + ULong xerW = 0; \ + __asm__ __volatile__( \ + "srawi %0,%2, " #nnn "\n\t" \ + "mfxer %1" \ + : /*out*/ "=b"(resW), "=b"(xerW) \ + : /*in*/ "b"(argW) \ + : /*trash*/ "cc" \ + ); \ + *res = resW; \ + *xer = xerW; \ + } + +INSN_SRAWI(0) +INSN_SRAWI(1) +INSN_SRAWI(2) +INSN_SRAWI(3) +INSN_SRAWI(4) +INSN_SRAWI(5) +INSN_SRAWI(6) +INSN_SRAWI(7) +INSN_SRAWI(8) +INSN_SRAWI(9) +INSN_SRAWI(10) +INSN_SRAWI(11) +INSN_SRAWI(12) +INSN_SRAWI(13) +INSN_SRAWI(14) +INSN_SRAWI(15) +INSN_SRAWI(16) +INSN_SRAWI(17) +INSN_SRAWI(18) +INSN_SRAWI(19) +INSN_SRAWI(20) +INSN_SRAWI(21) +INSN_SRAWI(22) +INSN_SRAWI(23) +INSN_SRAWI(24) +INSN_SRAWI(25) +INSN_SRAWI(26) +INSN_SRAWI(27) +INSN_SRAWI(28) +INSN_SRAWI(29) +INSN_SRAWI(30) +INSN_SRAWI(31) + +static void* all_srawi[32] + = { + (void*)&do_srawi_0, + (void*)&do_srawi_1, + (void*)&do_srawi_2, + (void*)&do_srawi_3, + (void*)&do_srawi_4, + (void*)&do_srawi_5, + (void*)&do_srawi_6, + (void*)&do_srawi_7, + (void*)&do_srawi_8, + (void*)&do_srawi_9, + (void*)&do_srawi_10, + (void*)&do_srawi_11, + (void*)&do_srawi_12, + (void*)&do_srawi_13, + (void*)&do_srawi_14, + (void*)&do_srawi_15, + (void*)&do_srawi_16, + (void*)&do_srawi_17, + (void*)&do_srawi_18, + (void*)&do_srawi_19, + (void*)&do_srawi_20, + (void*)&do_srawi_21, + (void*)&do_srawi_22, + (void*)&do_srawi_23, + (void*)&do_srawi_24, + (void*)&do_srawi_25, + (void*)&do_srawi_26, + (void*)&do_srawi_27, + (void*)&do_srawi_28, + (void*)&do_srawi_29, + (void*)&do_srawi_30, + (void*)&do_srawi_31 + }; + +/* ------------------------ SRAD ------------------------ */ + +void do_srad ( ULong arg1, ULong arg2, + /*OUT*/ULong* res, /*OUT*/ULong* xer ) +{ + ULong arg1W = arg1; + ULong arg2W = arg2; + ULong resW = 0; + ULong xerW = 0; + __asm__ __volatile__( + "srad %0,%2,%3\n\t" + "mfxer %1" + : /*out*/ "=b"(resW), "=b"(xerW) + : /*in*/ "b"(arg1W), "b"(arg2W) + : /*trash*/ "cc" + ); + *res = resW; + *xer = xerW; +} + + +/* ------------------------ SRAW ------------------------ */ + +void do_sraw ( ULong arg1, ULong arg2, + /*OUT*/ULong* res, /*OUT*/ULong* xer ) +{ + ULong arg1W = arg1; + ULong arg2W = arg2; + ULong resW = 0; + ULong xerW = 0; + __asm__ __volatile__( + "sraw %0,%2,%3\n\t" + "mfxer %1" + : /*out*/ "=b"(resW), "=b"(xerW) + : /*in*/ "b"(arg1W), "b"(arg2W) + : /*trash*/ "cc" + ); + *res = resW; + *xer = xerW; +} + +/* ------------------------ SRD ------------------------ */ + +void do_srd ( ULong arg1, ULong arg2, + /*OUT*/ULong* res, /*OUT*/ULong* xer ) +{ + ULong arg1W = arg1; + ULong arg2W = arg2; + ULong resW = 0; + ULong xerW = 0; + __asm__ __volatile__( + "srd %0,%2,%3\n\t" + "mfxer %1" + : /*out*/ "=b"(resW), "=b"(xerW) + : /*in*/ "b"(arg1W), "b"(arg2W) + : /*trash*/ "cc" + ); + *res = resW; + *xer = xerW; +} + + +/* ------------------------ SRW ------------------------ */ + +void do_srw ( ULong arg1, ULong arg2, + /*OUT*/ULong* res, /*OUT*/ULong* xer ) +{ + ULong arg1W = arg1; + ULong arg2W = arg2; + ULong resW = 0; + ULong xerW = 0; + __asm__ __volatile__( + "srw %0,%2,%3\n\t" + "mfxer %1" + : /*out*/ "=b"(resW), "=b"(xerW) + : /*in*/ "b"(arg1W), "b"(arg2W) + : /*trash*/ "cc" + ); + *res = resW; + *xer = xerW; +} + + +/* ------------------------ SLD ------------------------ */ + +void do_sld ( ULong arg1, ULong arg2, + /*OUT*/ULong* res, /*OUT*/ULong* xer ) +{ + ULong arg1W = arg1; + ULong arg2W = arg2; + ULong resW = 0; + ULong xerW = 0; + __asm__ __volatile__( + "sld %0,%2,%3\n\t" + "mfxer %1" + : /*out*/ "=b"(resW), "=b"(xerW) + : /*in*/ "b"(arg1W), "b"(arg2W) + : /*trash*/ "cc" + ); + *res = resW; + *xer = xerW; +} + + +/* ------------------------ SLW ------------------------ */ + +void do_slw ( ULong arg1, ULong arg2, + /*OUT*/ULong* res, /*OUT*/ULong* xer ) +{ + ULong arg1W = arg1; + ULong arg2W = arg2; + ULong resW = 0; + ULong xerW = 0; + __asm__ __volatile__( + "slw %0,%2,%3\n\t" + "mfxer %1" + : /*out*/ "=b"(resW), "=b"(xerW) + : /*in*/ "b"(arg1W), "b"(arg2W) + : /*trash*/ "cc" + ); + *res = resW; + *xer = xerW; +} + + +/* ------------------------ ------------------------ */ +/* ------------------------ ------------------------ */ +/* ------------------------ ------------------------ */ + +#define N_ARGS64 41 + +ULong args64[N_ARGS64] = { + 0x0000000000000000ULL, + + 0x0000000000000001ULL, + 0x0000000031415927ULL, + 0x000000007FFFFFFFULL, + 0x0000000080000000ULL, + 0x00000000FFFFFFFFULL, + + 0x0000000100000000ULL, + 0x3141592700000000ULL, + 0x7FFFFFFF00000000ULL, + 0x8000000000000000ULL, + 0xFFFFFFFF00000000ULL, + + 0x7FFFFFFF00000001ULL, + 0x7FFFFFFF31415927ULL, + 0x7FFFFFFF7FFFFFFFULL, + 0x7FFFFFFF80000000ULL, + 0x7FFFFFFFFFFFFFFFULL, + + 0x000000017FFFFFFFULL, + 0x314159277FFFFFFFULL, + 0x7FFFFFFF7FFFFFFFULL, + 0x800000007FFFFFFFULL, + 0xFFFFFFFF7FFFFFFFULL, + + 0x8000000000000001ULL, + 0x8000000031415927ULL, + 0x800000007FFFFFFFULL, + 0x8000000080000000ULL, + 0x80000000FFFFFFFFULL, + + 0x0000000180000000ULL, + 0x3141592780000000ULL, + 0x7FFFFFFF80000000ULL, + 0x8000000080000000ULL, + 0xFFFFFFFF80000000ULL, + + 0xFFFFFFFF00000001ULL, + 0xFFFFFFFF31415927ULL, + 0xFFFFFFFF7FFFFFFFULL, + 0xFFFFFFFF80000000ULL, + 0xFFFFFFFFFFFFFFFFULL, + + 0x00000001FFFFFFFFULL, + 0x31415927FFFFFFFFULL, + 0x7FFFFFFFFFFFFFFFULL, + 0x80000000FFFFFFFFULL, + 0xFFFFFFFFFFFFFFFFULL +}; + +void do_unary ( char* name, void** fns, int n_fns ) +{ + int i, j; + ULong arg, res, xer; + void(*fn)(ULong,ULong*,ULong*); + for (i = 0; i < n_fns; i++) { /* shift */ + for (j = 0; j < N_ARGS64; j++) { /* arg */ + arg = args64[j]; + res = xer = 0; + fn = fns[i]; + fn( arg, &res, &xer ); + printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n", + name, arg, (int)i, res, (int)((xer >> 29 & 1))); + } + } +} + +void do_binary ( char* name, void* fnV ) +{ + int i, j; + ULong arg1, arg2, res, xer; + void(*fn)(ULong,ULong,ULong*,ULong*); + for (i = 0; i < 64+10; i++) { /* shift */ + for (j = 0; j < N_ARGS64; j++) { /* arg */ + arg1 = args64[j]; + arg2 = i; + res = xer = 0; + fn = fnV; + fn( arg1, arg2, &res, &xer ); + printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n", + name, arg1, (int)arg2, res, (int)((xer >> 29 & 1))); + } + } +} + +int main ( void ) +{ + do_unary("sradi", all_sradi, 64); + do_unary("srawi", all_srawi, 32); + do_binary("srad", do_srad); + do_binary("sraw", do_sraw); + do_binary("srd", do_srd); + do_binary("srw", do_srw); + do_binary("sld", do_sld); + do_binary("slw", do_slw); + return 0; +} + +/* +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +*/ +