|
From: <sv...@va...> - 2006-12-26 03:55:41
|
Author: sewardj
Date: 2006-12-26 03:55:38 +0000 (Tue, 26 Dec 2006)
New Revision: 6431
Log:
Merge r6404/5 (fix ppc insn set tests for gcc >=3D 4.1)
Modified:
branches/VALGRIND_3_2_BRANCH/none/tests/ppc32/jm-insns.c
Modified: branches/VALGRIND_3_2_BRANCH/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
--- branches/VALGRIND_3_2_BRANCH/none/tests/ppc32/jm-insns.c 2006-12-26 0=
3:53:52 UTC (rev 6430)
+++ branches/VALGRIND_3_2_BRANCH/none/tests/ppc32/jm-insns.c 2006-12-26 0=
3:55:38 UTC (rev 6431)
@@ -177,25 +177,53 @@
#endif // #ifndef __powerpc64__
=20
=20
+#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
+
+#define SET_CR(_arg) \
+ __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR );
+
+#define SET_XER(_arg) \
+ __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
+
+#define GET_CR(_lval) \
+ __asm__ __volatile__ ("mfcr %0" : "=3Db"(_lval) )
+
+#define GET_XER(_lval) \
+ __asm__ __volatile__ ("mfxer %0" : "=3Db"(_lval) )
+
+#define GET_CR_XER(_lval_cr,_lval_xer) \
+ do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
+
+#define SET_CR_ZERO \
+ SET_CR(0)
+
+#define SET_XER_ZERO \
+ SET_XER(0)
+
+#define SET_CR_XER_ZERO \
+ do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
+
+#define SET_FPSCR_ZERO \
+ do { double _d =3D 0.0; \
+ __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
+ } while (0)
+
+
+/* XXXX these must all be callee-save regs! */
register double f14 __asm__ ("f14");
register double f15 __asm__ ("f15");
register double f16 __asm__ ("f16");
register double f17 __asm__ ("f17");
-register double f18 __asm__ ("f18");
register HWord_t r14 __asm__ ("r14");
register HWord_t r15 __asm__ ("r15");
register HWord_t r16 __asm__ ("r16");
register HWord_t r17 __asm__ ("r17");
-register HWord_t r18 __asm__ ("r18");
=20
#if defined (HAS_ALTIVEC)
# include <altivec.h>
#endif
#include <assert.h>
#include <ctype.h> // isspace
-//#include <fcntl.h>
-//#include <fenv.h>
-//#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -4540,7 +4568,7 @@
unused uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k;
=20
for (i=3D0; i<nb_iargs; i++) {
@@ -4550,29 +4578,11 @@
r15 =3D iargs[j];
r16 =3D iargs[k];
=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");
-
#ifndef __powerpc64__
printf("%s %08x, %08x, %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4589,7 +4599,7 @@
uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, xer_orig, tmpcr, tmpxer;
+ volatile uint32_t flags, xer, xer_orig;
int i, j, is_div, zap_hi32;
=20
// catches div, divwu, divo, divwu, divwuo, and . variants
@@ -4601,37 +4611,21 @@
redo:
for (i=3D0; i<nb_iargs; i++) {
for (j=3D0; j<nb_iargs; j++) {
- r14 =3D iargs[i];
- r15 =3D iargs[j];
+
/* result of division by zero is implementation dependent.
don't test it. */
if (is_div && iargs[j] =3D=3D 0)
continue;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
+ r14 =3D iargs[i];
+ r15 =3D iargs[j];
=20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D xer_orig;
- __asm__ __volatile__ ("mtxer 18");
+ SET_XER(xer_orig);
+ SET_CR_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");
-
#ifndef __powerpc64__
printf("%s %08x, %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4652,38 +4646,19 @@
uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, xer_orig, tmpcr, tmpxer;
+ volatile uint32_t flags, xer, xer_orig;
int i;
=20
xer_orig =3D 0x00000000;
redo:
for (i=3D0; i<nb_iargs; i++) {
r14 =3D iargs[i];
-
- /* 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");
- r18 =3D xer_orig;
- __asm__ __volatile__ ("mtxer 18");
+ SET_XER(xer_orig);
+ SET_CR_ZERO;
(*func)();
res =3D r17;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4768,7 +4743,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;
=20
for (i=3D0; i<nb_iargs; i++) {
@@ -4779,29 +4754,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");
-
#ifndef __powerpc64__
printf("%s %08x, %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4843,7 +4800,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, l, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 31 : 3;
@@ -4862,29 +4819,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");
-
#ifndef __powerpc64__
printf("%s %08x, %2d, %2d, %2d =3D> %08x (%08x %08x)\n",
#else
@@ -4904,7 +4843,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, l, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 31 : 3;
@@ -4921,29 +4860,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");
-
#ifndef __powerpc64__
printf("%s %08x, %08x, %2d, %2d =3D> %08x (%08x %08x)\n",
#else
@@ -4963,7 +4884,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) ? 31 : 1;
@@ -4976,29 +4897,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");
-
#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x (%08x %08x)\n",
#else
@@ -5015,7 +4918,7 @@
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- 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 : 1;
@@ -5030,28 +4933,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 14");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR(r14);
+ SET_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %d, %d (%08x) =3D> (%08x %08x)\n",
#else
@@ -5064,19 +4950,12 @@
}
}
=20
-#if 0
-static void mcrfs_cb (const char* name, test_func_t func,
- unused uint32_t test_flags)
-{}
-#endif
-
-
static void mcrxr_cb (const char* name, test_func_t func_IN,
unused uint32_t test_flags)
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D 1; //(arg_list_size =3D=3D 0) ? 7 : 1;
@@ -5090,28 +4969,11 @@
=20
r14 =3D 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 14");
+ SET_CR_ZERO;
+ SET_XER(r14);
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %d (%08x) =3D> (%08x %08x)\n",
name, k, j, flags, xer);
}
@@ -5123,35 +4985,19 @@
unused uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i;
=20
for (i=3D0; i<nb_iargs; i++) {
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 14");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR(r14);
+ SET_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");
-
#ifndef __powerpc64__
printf("%s (%08x) =3D> %08x (%08x %08x)\n",
#else
@@ -5176,7 +5022,7 @@
__asm__ __volatile__(
"mtxer %1\n"
"\tmfxer %0"
- : /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"xer"=20
+ : /*out*/"=3Db"(res) : /*in*/"b"(j) : /*trashed*/"xer"=20
);
res &=3D 0xE000007F; /* rest of the bits are undefined */
=20
@@ -5194,7 +5040,7 @@
__asm__ __volatile__(
"mtlr %1\n"
"\tmflr %0"
- : /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"lr"=20
+ : /*out*/"=3Db"(res) : /*in*/"b"(j) : /*trashed*/"lr"=20
);
=20
#ifndef __powerpc64__
@@ -5211,7 +5057,7 @@
__asm__ __volatile__(
"mtctr %1\n"
"\tmfctr %0"
- : /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"ctr"=20
+ : /*out*/"=3Db"(res) : /*in*/"b"(j) : /*trashed*/"ctr"=20
);
=20
#ifndef __powerpc64__
@@ -5221,220 +5067,14 @@
#endif
name, j, res);
}
-
-#if 0
- // mfxer
- j =3D 1;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- // Only valid bits of xer: 0xE000007F
- __asm__ __volatile__ ("lis 15,0xE000");
- __asm__ __volatile__ ("addi 15,15,0x007F");
- __asm__ __volatile__ ("and 16,15,14");
- =20
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 16");
- __asm__ __volatile__ ("mtlr 18");
- __asm__ __volatile__ ("mtctr 18");
- =20
- __asm__ __volatile__ ("mfspr 17, 1"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d (%08x) =3D> %08x (%08x %08x, %08x, %08x)\n",
- name, j, iargs[k], res, flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
- =20
- // mflr
- j =3D 8;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* 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__ ("mtlr 14");
- __asm__ __volatile__ ("mtctr 18");
- __asm__ __volatile__ ("mtxer 18");
-
- __asm__ __volatile__ ("mfspr 17, 8"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d (%08x) =3D> %08x (%08x %08x, %08x, %08x)\n",
- name, j, iargs[k], res, flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
-
- // mfctr
- j =3D 9;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* 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__ ("mtctr 14");
- __asm__ __volatile__ ("mtxer 18");
- __asm__ __volatile__ ("mtlr 18");
- =20
- __asm__ __volatile__ ("mfspr 17, 9"); // func()
- =20
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d (%08x) =3D> %08x (%08x %08x, %08x, %08x)\n",
- name, j, iargs[k], res, flags, xer, lr, ctr);
- }
-#endif
}
=20
-#if 0
-static void mftb_cb (const char* name, test_func_t func,
- unused uint32_t test_flags)
-{
-// How to test this?
-// 1) TBU won't change for a while
-// 2) TBL will have changed every loop iter
-
- volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
- int i, j;
- =20
- i =3D 269;
- for (j=3D0; j<16; j++) {
- /* 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");
- =20
- __asm__ __volatile__ ("mftb 17, 269"); // func
- =20
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d =3D> %08x (%08x %08x)\n",
- name, i, res, flags, xer);
- }
- if (verbose) printf("\n");
- =20
- i =3D 268;
- for (j=3D0; j<16; j++) {
- /* 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");
- =20
- __asm__ __volatile__ ("mftb 17, 268"); // func
- =20
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d =3D> %08x (%08x %08x)\n",
- name, i, res, flags, xer);
- }
-}
-#endif
-
static void mtcrf_cb (const char* name, test_func_t func_IN,
unused uint32_t test_flags)
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- 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) ? 99 : 1;
@@ -5447,28 +5087,10 @@
=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);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %3d, %08x =3D> (%08x %08x)\n",
#else
@@ -5484,150 +5106,6 @@
static void mtspr_cb (const char* name, test_func_t func,
unused uint32_t test_flags)
{
-#if 0
- volatile HWord_t ctr, lr;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
- int j, k;
- func =3D func; // just to stop compiler complaining
- =20
- // mtxer
- j =3D 1;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- =20
- // Only valid bits of xer: 0xE000007F
- // VEX masks these (maybe it shouldn't?), so let's do it first:
- __asm__ __volatile__ ("lis 15,0xE000");
- __asm__ __volatile__ ("addi 15,15,0x007F");
- __asm__ __volatile__ ("and 16,15,14");
- =20
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- __asm__ __volatile__ ("mtlr 18");
- __asm__ __volatile__ ("mtctr 18");
- =20
- __asm__ __volatile__ ("mtxer 16"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
-#ifndef __powerpc64__
- printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
-#else
- printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
-#endif
- name, j, iargs[k], flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
- =20
- // mtlr
- j =3D 8;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0x0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtlr 18");
- __asm__ __volatile__ ("mtctr 18");
- __asm__ __volatile__ ("mtxer 18");
- =20
- __asm__ __volatile__ ("mtlr 14"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 17"); // CAB: if 18, bashes lr - bad=
gcc opt?
- ctr =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
-#ifndef __powerpc64__
- printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
-#else
- printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
-#endif
- name, j, iargs[k], flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
- =20
- // mtctr
- j =3D 9;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* 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__ ("mtctr 18");
- __asm__ __volatile__ ("mtxer 18");
- __asm__ __volatile__ ("mtlr 18");
- =20
- __asm__ __volatile__ ("mtctr 14"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 17");
- ctr =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
-#ifndef __powerpc64__
- printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
-#else
- printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
-#endif
- name, j, iargs[k], flags, xer, lr, ctr);
- }
-#endif
}
=20
#ifdef __powerpc64__
@@ -5637,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;
@@ -5652,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);
}
@@ -5689,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;
@@ -5705,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);
}
@@ -5742,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;
@@ -5756,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);
}
@@ -5965,7 +5389,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res, base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs, is_lwa=3D0;
=20
#ifdef __powerpc64__
@@ -5986,29 +5410,11 @@
=20
r14 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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");
-
#ifndef __powerpc64__
printf("%s %2d, (%08x) =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6029,29 +5435,11 @@
=20
r14 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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");
-
#ifndef __powerpc64__
printf("%s %2d, (%08x) =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6066,7 +5454,7 @@
unused uint32_t test_flags)
{
volatile HWord_t res, base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs;
=20
// +ve d
@@ -6076,29 +5464,11 @@
r14 =3D base;
r15 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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");
-
#ifndef __powerpc64__
printf("%s %d (%08x) =3D> %08x, %d (%08x %08x)\n",
#else
@@ -6114,7 +5484,7 @@
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs, k;
HWord_t *iargs_priv, base;
=20
@@ -6136,28 +5506,10 @@
r14 =3D iargs[i]; // read from iargs
r15 =3D base; // store to r15 + offs
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6182,28 +5534,10 @@
r14 =3D iargs[nb_iargs-1+i]; // read from iargs
r15 =3D base; // store to r15 + offs
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6219,7 +5553,7 @@
test_func_t func,
unused uint32_t test_flags)
{
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs, k;
HWord_t *iargs_priv, base;
=20
@@ -6236,28 +5570,10 @@
r15 =3D base; // store to r15 + offs
r16 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %d =3D> %08x, %d (%08x %08x)\n",
#else
@@ -6292,7 +5608,7 @@
{
double res;
uint64_t u0, u1, u2, ur;
- volatile uint32_t flags, tmpcr, tmpxer;
+ volatile uint32_t flags;
int i, j, k;
=20
/* Note: using nb_normal_fargs:
@@ -6309,30 +5625,13 @@
f15 =3D fargs[j];
f16 =3D fargs[k];
=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");
- f18 =3D +0.0;
- __asm__ __volatile__ ("mtfsf 0xFF, 18");
+ SET_FPSCR_ZERO;
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
+ GET_CR(flags);
res =3D f17;
ur =3D *(uint64_t *)(&res);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
/* Note: zapping the bottom byte of the result,=20
as vex's accuracy isn't perfect */
ur &=3D 0xFFFFFFFFFFFFFF00ULL;
@@ -6358,7 +5657,7 @@
{
double res;
uint64_t u0, u1, ur;
- volatile uint32_t flags, tmpcr, tmpxer;
+ volatile uint32_t flags;
int i, j;
=20
for (i=3D0; i<nb_fargs; i+=3D3) {
@@ -6368,30 +5667,13 @@
f14 =3D fargs[i];
f15 =3D fargs[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");
- f18 =3D +0.0;
- __asm__ __volatile__ ("mtfsf 0xFF, 18");
+ SET_FPSCR_ZERO;
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
+ GET_CR(flags);
res =3D f17;
ur =3D *(uint64_t *)(&res);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %016llx =3D> %016llx",
#else
@@ -6412,7 +5694,7 @@
{
double res;
uint64_t u0, ur;
- volatile uint32_t flags, tmpcr, tmpxer;
+ volatile uint32_t flags;
int i, zap_hi_32bits;
=20
/* if we're testing fctiw or fctiwz, zap the hi 32bits,
@@ -6423,30 +5705,13 @@
u0 =3D *(uint64_t *)(&fargs[i]);
f14 =3D fargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
+ SET_FPSCR_ZERO;
+ SET_CR_XER_ZERO;
+ (*func)();
+ GET_CR(flags);
+ res =3D f17;
+ ur =3D *(uint64_t *)(&res);
=20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- f18 =3D +0.0;
- __asm__ __volatile__ ("mtfsf 0xFF, 18");
- (*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- res =3D f17;
- ur =3D *(uint64_t *)(&res);
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
if (zap_hi_32bits)
ur &=3D 0xFFFFFFFFULL;
=20
@@ -6531,7 +5796,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
uint32_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
volatile double src, res;
int i, offs;
=20
@@ -6553,29 +5818,11 @@
// load from fargs[idx] =3D> r14 + offs
r14 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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 f17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -6596,7 +5843,7 @@
unused uint32_t test_flags)
{
volatile HWord_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
volatile double src, res;
int i, offs;
=20
@@ -6614,29 +5861,11 @@
r14 =3D base;
r15 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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 f17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -6658,7 +5887,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
HWord_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
double src, *p_dst;
int i, offs;
double *fargs_priv;
@@ -6701,28 +5930,10 @@
f14 =3D src;
r15 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -6743,7 +5954,7 @@
unused uint32_t test_flags)
{
volatile HWord_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
double src, *p_dst;
int i, offs;
double *fargs_priv;
@@ -6782,28 +5993,10 @@
r15 =3D base; // store to r15 + offs
r16 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* 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);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -8202,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"
);
@@ -8218,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;
@@ -8344,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;
@@ -8367,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;
@@ -8379,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;
|