Yet another ppc test program, which duplicates jm-insns so isn't too useful.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5642 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/auxprogs/ppc64shifts.c b/auxprogs/ppc64shifts.c
new file mode 100644
index 0000000..cf8d571
--- /dev/null
+++ b/auxprogs/ppc64shifts.c
@@ -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 = 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
+*/
+