|
From: <sv...@va...> - 2006-12-16 14:25:09
|
Author: sewardj
Date: 2006-12-16 14:25:04 +0000 (Sat, 16 Dec 2006)
New Revision: 6405
Log:
64-bit followup to r6404: fix and simplify the inline assembly, so it
works right when compiled by gcc-4.1.0. Also add a new flag, -A, to
test all available instructions.
Modified:
trunk/none/tests/ppc32/jm-insns.c
Modified: trunk/none/tests/ppc32/jm-insns.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/none/tests/ppc32/jm-insns.c 2006-12-16 05:00:38 UTC (rev 6404)
+++ trunk/none/tests/ppc32/jm-insns.c 2006-12-16 14:25:04 UTC (rev 6405)
@@ -5115,7 +5115,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
@@ -5130,29 +5130,11 @@
r14 =3D iargs[i];
r15 =3D iargs[j];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %016lx, %016lx, %2d =3D> %016lx (%08x %08x)\n",
name, iargs[i], iargs[j], k, res, flags, xer);
}
@@ -5167,7 +5149,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
@@ -5183,29 +5165,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %016lx, %2d, %2d =3D> %016lx (%08x %08x)\n",
name, iargs[i], j, k, res, flags, xer);
}
@@ -5220,7 +5184,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
@@ -5234,29 +5198,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %016lx, %2d =3D> %016lx (%08x %08x)\n",
name, iargs[i], j, res, flags, xer);
}
@@ -7449,6 +7395,7 @@
"\t-i: test integer instructions (default)\n"
"\t-f: test floating point instructions\n"
"\t-a: test altivec instructions\n"
+ "\t-A: test all (int, fp, altivec) instructions\n"
"\t-v: be verbose\n"
"\t-h: display this help and exit\n"
);
@@ -7465,6 +7412,9 @@
insn_sel_flags_t flags;
int c;
=20
+ // check HWord_t really is a host word
+ assert(sizeof(void*) =3D=3D sizeof(HWord_t));
+
flags.one_arg =3D 0;
flags.two_args =3D 0;
flags.three_args =3D 0;
@@ -7591,6 +7541,7 @@
./jm-insns -i =3D> int insns
./jm-insns -f =3D> fp insns
./jm-insns -a =3D> av insns
+ ./jm-insns -A =3D> int, fp and avinsns
*/
char *filter =3D NULL;
insn_sel_flags_t flags;
@@ -7614,7 +7565,7 @@
// Flags
flags.cr =3D 2;
=20
- while ((c =3D getopt(argc, argv, "ifahv")) !=3D -1) {
+ while ((c =3D getopt(argc, argv, "ifahvA")) !=3D -1) {
switch (c) {
case 'i':
flags.integer =3D 1;
@@ -7626,6 +7577,12 @@
flags.altivec =3D 1;
flags.faltivec =3D 1;
break;
+ case 'A':
+ flags.integer =3D 1;
+ flags.floats =3D 1;
+ flags.altivec =3D 1;
+ flags.faltivec =3D 1;
+ break;
case 'h':
usage();
return 0;
|