From: Julian Seward Date: Wed, 1 Mar 2006 22:36:49 +0000 (+0000) Subject: A simple test of m{f,t}ocrf. X-Git-Tag: svn/VALGRIND_3_2_0~242 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b57adab44f5926ed994d461f9017d74efd5aab11;p=thirdparty%2Fvalgrind.git A simple test of m{f,t}ocrf. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5705 --- diff --git a/none/tests/ppc32/Makefile.am b/none/tests/ppc32/Makefile.am index 0fc5015904..e04c7f0c5e 100644 --- a/none/tests/ppc32/Makefile.am +++ b/none/tests/ppc32/Makefile.am @@ -6,6 +6,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ jm-int.stderr.exp jm-int.stdout.exp jm-int.vgtest \ jm-fp.stderr.exp jm-fp.stdout.exp jm-fp.vgtest \ jm-vmx.stderr.exp jm-vmx.stdout.exp jm-vmx.vgtest \ + mftocrf.stderr.exp mftocrf.stdout.exp mftocrf.vgtest \ test_fx.stderr.exp test_fx.stdout.exp test_fx.vgtest \ test_gx.stderr.exp test_gx.stdout.exp test_gx.vgtest \ testVMX.stderr.exp testVMX.stdout.exp testVMX.vgtest \ @@ -13,7 +14,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ xlc_dbl_u32.stderr.exp xlc_dbl_u32.stdout.exp xlc_dbl_u32.vgtest check_PROGRAMS = \ - lsw jm-insns test_fx test_gx testVMX twi xlc_dbl_u32 + lsw jm-insns mftocrf test_fx test_gx testVMX twi xlc_dbl_u32 AM_CFLAGS = $(WERROR) -Winline -Wall -Wshadow -g -I$(top_srcdir)/include \ @FLAG_M32@ diff --git a/none/tests/ppc32/mftocrf.c b/none/tests/ppc32/mftocrf.c new file mode 100644 index 0000000000..099fbdfdbd --- /dev/null +++ b/none/tests/ppc32/mftocrf.c @@ -0,0 +1,66 @@ + +#include + +static +int try_mtocrf ( int x ) +{ + int base = 0x31415927; + int res; + + /* pre-set CR */ + __asm__ __volatile__( + "mtcr %0" + : /*w*/ : /*r*/ "b"(base) : /*trash*/"cc" ); + + /* do it */ + __asm__ __volatile__( + "mtocrf 4, %0" + : /*w*/ : /*r*/ "b"(x) : /*trash*/"cc" ); + + /* get CR */ + __asm__ __volatile__( + "mfcr %0" + : /*w*/"=b"(res) : /*r*/ ); + + return res; +} + +static +int try_mfocrf ( int x ) +{ + int res; + /* CR = x */ + __asm__ __volatile__( + "mtcr %0" + : /*w*/ : /*r*/ "b"(x) : /*trash*/"cc" ); + + /* do it */ + __asm__ __volatile__( + "li %0,0\n\t" + "mfocrf %0,64" + : /*w*/"=b"(res) : /*r*/ ); + + return res; +} + +/* This is a bit of a kludge since mfocrf reads the spec'd CR field, + but the remaining returned bits are undefined. It seems like on + MPC7447A (Apple Mac Mini) mfocrf just reads the entire CR, which is + an acceptable implementation, but is not necessarily what other + implementations are going to do. */ + +int main ( void ) +{ + int i, j; + for (i = 0; i < 32; i++) { + printf("0x%08x\n", try_mtocrf( 1<