From aa4d43968a50e9ee0f88fa4a2e55ecdcd1b3bc06 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Fri, 17 Apr 1998 19:04:41 +0000 Subject: [PATCH] * New R5900 COP2 test case. --- sim/testsuite/sky/.Sanitize | 1 + sim/testsuite/sky/ChangeLog | 6 ++ sim/testsuite/sky/Makefile.in | 10 ++- sim/testsuite/sky/t-cop2.s | 2 +- sim/testsuite/sky/t-cop2b.c | 136 ++++++++++++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 sim/testsuite/sky/t-cop2b.c diff --git a/sim/testsuite/sky/.Sanitize b/sim/testsuite/sky/.Sanitize index d51b6cd276a..343a1ed3325 100644 --- a/sim/testsuite/sky/.Sanitize +++ b/sim/testsuite/sky/.Sanitize @@ -212,6 +212,7 @@ sce_test9_out_gif.dat sky.ld t-cop2.s t-cop2.vuexpect +t-cop2b.c t-dma.c t-pke2.trc t-pke2.vif1expect diff --git a/sim/testsuite/sky/ChangeLog b/sim/testsuite/sky/ChangeLog index f2db693d80f..0bdf249461c 100644 --- a/sim/testsuite/sky/ChangeLog +++ b/sim/testsuite/sky/ChangeLog @@ -1,3 +1,9 @@ +Fri Apr 17 14:47:53 1998 Frank Ch. Eigler + + * t-cop2b.c: New test for COP2 via inline asm. + * Makefile.in: Build t-cop2b. + * t-cop2.s: Update for new VCALLMSR instruction. + Thu Apr 16 15:05:51 1998 Jillian Ye * t-pke2.trc t-pke2.vif1expect : Update the testcase diff --git a/sim/testsuite/sky/Makefile.in b/sim/testsuite/sky/Makefile.in index 2710dc9b77e..8adbf1898b0 100644 --- a/sim/testsuite/sky/Makefile.in +++ b/sim/testsuite/sky/Makefile.in @@ -109,7 +109,7 @@ TESTS = \ tsv408_0.ok tsv408_1.ok \ tsv416_0.ok tsv416_1.ok \ tsv432_0.ok tsv432_1.ok \ - t-cop2.vuok + t-cop2.vuok t-cop2b.ok #SCE_TESTS := $(patsubst %.dvpasm, %.ok, $(wildcard sce*.dvpasm)) SCE_TESTS = \ @@ -139,13 +139,13 @@ sanity: @eval echo GCC_FOR_TARGET = $(GCC_FOR_TARGET) @eval echo DVPAS_FOR_TARGET = $(DVPAS_FOR_TARGET) @eval echo DVPOBJCP_FOR_TARGET = $(DVPOBJCP_FOR_TARGET) - + #------------------------------------ # Rules for building and running the SCE tests : #------------------------------------ LDFLAGS=-T$(srcdir)/sky.ld -CFLAGS += -I$(srcdir) +CFLAGS += -g -I$(srcdir) ASFLAGS = -I$(srcdir) sce%.exe: sce%.o sce_main.o refresh.o @@ -217,7 +217,7 @@ sce%.ok: sce%.exe .trc.c: $(C_GEN) $< $@ .c.run: - $(GCC_FOR_TARGET) -T$(srcdir)/sky.ld -o $@ $< + $(GCC_FOR_TARGET) $(CFLAGS) $(LDFLAGS) -o $@ $< .uu.run: uudecode $< > $@ .run.vif0out: @@ -232,6 +232,8 @@ sce%.ok: sce%.exe .s.run: rm -f $@ $(AS_FOR_TARGET) -mcpu=r5900 -o $@ $< +.c.s: + $(GCC_FOR_TARGET) -S -o $@ $< # diff --git a/sim/testsuite/sky/t-cop2.s b/sim/testsuite/sky/t-cop2.s index d00d7104856..b6788f99cd1 100644 --- a/sim/testsuite/sky/t-cop2.s +++ b/sim/testsuite/sky/t-cop2.s @@ -265,7 +265,7 @@ mpg: vaddaz.xyz ACC,vf2,vf3 vaddaz.wxyz ACC,vf2,vf3 vcallms stuff - vcallmsr vi19 + vcallmsr vi27 vclip vf4 vdiv Q,vf4z,vf8w vdiv Q,vf4y,vf8x diff --git a/sim/testsuite/sky/t-cop2b.c b/sim/testsuite/sky/t-cop2b.c new file mode 100644 index 00000000000..7d3d6f4ad2a --- /dev/null +++ b/sim/testsuite/sky/t-cop2b.c @@ -0,0 +1,136 @@ +/* Copyright (C) 1998 Cygnus Solutions */ +/* COP2 function test, with non-expert inline assembly */ + + + +/* globals */ + +int num_ok = 0; +int num_errors = 0; +float data_array[128] __attribute__((aligned(16))); + + + +/* macros */ + +#define TEST(x) do_test(x, #x, __LINE__) + + + +/* prototypes */ + + +void enable_cop2(); +void test00(); +void do_test(int ok, const char* test, int line); + + + +/* Utility functions */ + +void +enable_cop2() +{ + asm volatile (".set noat"); + asm volatile ("mfc0 $1,$12; dli $2,0x40000000; or $1,$2,$2; mtc0 $1,$12" + : /* no outputs */ + : /* no inputs */ + : "$1", "$2" /* clobbered */); + asm volatile (".set at"); +} + + +void +do_test(int ok, const char* test, int line) +{ + static int test_num = 0; + + printf("[%d @ %d] (%s): ", ++test_num, line, test); + if(ok) + { + num_ok ++; + printf("ok\n"); + } + else + { + num_errors ++; + printf("ko\n"); + } +} + + + +/* Tests */ + + +/* test00: test LQC2/SQC2 data non-corruption */ +void test00() +{ + volatile float* data = & data_array[0]; + volatile float* data2 = & data_array[4]; + + /* stuff some initial values */ + data[0] = -10.0; + data[1] = +10.0; + data[2] = -20.0; + data[3] = +20.0; + + /* save values */ + asm volatile ("lqc2 vf01,%0" + : /* no output */ + : "m" (data[0]) /* input */ + : "memory" /* clobbered */); + + /* test no clobbering */ + TEST(data[0] == -10.0f); + TEST(data[1] == +10.0f); + TEST(data[2] == -20.0f); + TEST(data[3] == +20.0f); + + /* overwrite with VU constants */ + asm volatile ("sqc2 vf00,%0" + : /* no outputs */ + : "m" (data[0]) /* input */ + : "memory" /* clobbered */); + + /* test proper values */ + TEST(data[0] == 0.0f); + TEST(data[1] == 0.5f); + TEST(data[2] == -1.0f); + TEST(data[3] == +1.0f); + + /* read back original array values */ + asm volatile ("sqc2 vf01,%0" + : /* no outputs */ + : "m" (data2[0]) /* input */ + : "memory" /* clobbered */); + + /* printf("%f,%f,%f,%f\n", data2[0], data2[1], data2[2], data2[3]); */ + + /* test proper values */ + TEST(data2[0] == -10.0f); + TEST(data2[1] == +10.0f); + TEST(data2[2] == -20.0f); + TEST(data2[3] == +20.0f); +} + + + +/* Mainline */ + + +int main() +{ + enable_cop2(); + + /* tests */ + test00(); + + + /* summarize */ + printf("%d ok, %d bad\n", num_ok, num_errors); + if(num_errors > 0) + exit(47); + else + exit(0); +} -- 2.30.2