* New R5900 COP2 test case.
This commit is contained in:
parent
216c36d92b
commit
aa4d43968a
|
@ -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
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
Fri Apr 17 14:47:53 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* 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 <jillian@cygnus.com>
|
||||
|
||||
* t-pke2.trc t-pke2.vif1expect : Update the testcase
|
||||
|
|
|
@ -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 = \
|
||||
|
@ -145,7 +145,7 @@ sanity:
|
|||
#------------------------------------
|
||||
|
||||
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 $@ $<
|
||||
|
||||
|
||||
#
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue