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 \
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@
--- /dev/null
+
+#include <stdio.h>
+
+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<<i ));
+ }
+ printf("\n");
+ j = 1;
+ for (i = 0; i < 32; i++) {
+ printf("0x%08x\n", try_mfocrf( j ));
+ j *= 3;
+ }
+
+ return 0;
+}