|
From: <sv...@va...> - 2006-02-12 18:56:23
|
Author: sewardj
Date: 2006-02-12 18:56:16 +0000 (Sun, 12 Feb 2006)
New Revision: 5642
Log:
Yet another ppc test program, which duplicates jm-insns so isn't too usef=
ul.
Added:
trunk/auxprogs/ppc64shifts.c
Modified:
trunk/auxprogs/Makefile.am
Modified: trunk/auxprogs/Makefile.am
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/Makefile.am 2006-02-12 15:45:46 UTC (rev 5641)
+++ trunk/auxprogs/Makefile.am 2006-02-12 18:56:16 UTC (rev 5642)
@@ -5,7 +5,7 @@
=20
noinst_SCRIPTS =3D gen-mdg DotToScc.hs primes.c \
gsl16test gsl16-badfree.patch gsl16-wavelet.patch \
- ppcfround.c
+ ppcfround.c ppc64shifts.c
=20
EXTRA_DIST =3D $(noinst_SCRIPTS)
=20
Added: trunk/auxprogs/ppc64shifts.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/auxprogs/ppc64shifts.c (rev 0)
+++ trunk/auxprogs/ppc64shifts.c 2006-02-12 18:56:16 UTC (rev 5642)
@@ -0,0 +1,543 @@
+
+#include <stdio.h>
+
+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 =3D arg; =
\
+ ULong resW =3D 0; =
\
+ ULong xerW =3D 0; =
\
+ __asm__ __volatile__( =
\
+ "sradi %0,%2, " #nnn "\n\t" =
\
+ "mfxer %1" =
\
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW) =
\
+ : /*in*/ "b"(argW) =
\
+ : /*trash*/ "cc" =
\
+ ); =
\
+ *res =3D resW; =
\
+ *xer =3D 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]=20
+ =3D {
+ (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 =3D arg; =
\
+ ULong resW =3D 0; =
\
+ ULong xerW =3D 0; =
\
+ __asm__ __volatile__( =
\
+ "srawi %0,%2, " #nnn "\n\t" =
\
+ "mfxer %1" =
\
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW) =
\
+ : /*in*/ "b"(argW) =
\
+ : /*trash*/ "cc" =
\
+ ); =
\
+ *res =3D resW; =
\
+ *xer =3D 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]=20
+ =3D {
+ (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,=20
+ /*OUT*/ULong* res, /*OUT*/ULong* xer )
+{
+ ULong arg1W =3D arg1;
+ ULong arg2W =3D arg2;
+ ULong resW =3D 0;
+ ULong xerW =3D 0;
+ __asm__ __volatile__(
+ "srad %0,%2,%3\n\t"
+ "mfxer %1"
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW)
+ : /*in*/ "b"(arg1W), "b"(arg2W)
+ : /*trash*/ "cc"
+ );
+ *res =3D resW;
+ *xer =3D xerW;
+}
+
+
+/* ------------------------ SRAW ------------------------ */
+
+void do_sraw ( ULong arg1, ULong arg2,=20
+ /*OUT*/ULong* res, /*OUT*/ULong* xer )
+{
+ ULong arg1W =3D arg1;
+ ULong arg2W =3D arg2;
+ ULong resW =3D 0;
+ ULong xerW =3D 0;
+ __asm__ __volatile__(
+ "sraw %0,%2,%3\n\t"
+ "mfxer %1"
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW)
+ : /*in*/ "b"(arg1W), "b"(arg2W)
+ : /*trash*/ "cc"
+ );
+ *res =3D resW;
+ *xer =3D xerW;
+}
+
+/* ------------------------ SRD ------------------------ */
+
+void do_srd ( ULong arg1, ULong arg2,=20
+ /*OUT*/ULong* res, /*OUT*/ULong* xer )
+{
+ ULong arg1W =3D arg1;
+ ULong arg2W =3D arg2;
+ ULong resW =3D 0;
+ ULong xerW =3D 0;
+ __asm__ __volatile__(
+ "srd %0,%2,%3\n\t"
+ "mfxer %1"
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW)
+ : /*in*/ "b"(arg1W), "b"(arg2W)
+ : /*trash*/ "cc"
+ );
+ *res =3D resW;
+ *xer =3D xerW;
+}
+
+
+/* ------------------------ SRW ------------------------ */
+
+void do_srw ( ULong arg1, ULong arg2,=20
+ /*OUT*/ULong* res, /*OUT*/ULong* xer )
+{
+ ULong arg1W =3D arg1;
+ ULong arg2W =3D arg2;
+ ULong resW =3D 0;
+ ULong xerW =3D 0;
+ __asm__ __volatile__(
+ "srw %0,%2,%3\n\t"
+ "mfxer %1"
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW)
+ : /*in*/ "b"(arg1W), "b"(arg2W)
+ : /*trash*/ "cc"
+ );
+ *res =3D resW;
+ *xer =3D xerW;
+}
+
+
+/* ------------------------ SLD ------------------------ */
+
+void do_sld ( ULong arg1, ULong arg2,=20
+ /*OUT*/ULong* res, /*OUT*/ULong* xer )
+{
+ ULong arg1W =3D arg1;
+ ULong arg2W =3D arg2;
+ ULong resW =3D 0;
+ ULong xerW =3D 0;
+ __asm__ __volatile__(
+ "sld %0,%2,%3\n\t"
+ "mfxer %1"
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW)
+ : /*in*/ "b"(arg1W), "b"(arg2W)
+ : /*trash*/ "cc"
+ );
+ *res =3D resW;
+ *xer =3D xerW;
+}
+
+
+/* ------------------------ SLW ------------------------ */
+
+void do_slw ( ULong arg1, ULong arg2,=20
+ /*OUT*/ULong* res, /*OUT*/ULong* xer )
+{
+ ULong arg1W =3D arg1;
+ ULong arg2W =3D arg2;
+ ULong resW =3D 0;
+ ULong xerW =3D 0;
+ __asm__ __volatile__(
+ "slw %0,%2,%3\n\t"
+ "mfxer %1"
+ : /*out*/ "=3Db"(resW), "=3Db"(xerW)
+ : /*in*/ "b"(arg1W), "b"(arg2W)
+ : /*trash*/ "cc"
+ );
+ *res =3D resW;
+ *xer =3D xerW;
+}
+
+
+/* ------------------------ ------------------------ */
+/* ------------------------ ------------------------ */
+/* ------------------------ ------------------------ */
+
+#define N_ARGS64 41
+
+ULong args64[N_ARGS64] =3D {
+ 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 =3D 0; i < n_fns; i++) { /* shift */
+ for (j =3D 0; j < N_ARGS64; j++) { /* arg */
+ arg =3D args64[j];
+ res =3D xer =3D 0;
+ fn =3D fns[i];
+ fn( arg, &res, &xer );
+ printf("%5s(0x%016llx, %2d) =3D 0x%016llx, %d\n",=20
+ 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 =3D 0; i < 64+10; i++) { /* shift */
+ for (j =3D 0; j < N_ARGS64; j++) { /* arg */
+ arg1 =3D args64[j];
+ arg2 =3D i;
+ res =3D xer =3D 0;
+ fn =3D fnV;
+ fn( arg1, arg2, &res, &xer );
+ printf("%5s(0x%016llx, %2d) =3D 0x%016llx, %d\n",=20
+ 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
+*/
+
|