void
enable_cop2()
{
- asm volatile (".set noat");
- asm volatile ("mfc0 $1,$12; dli $2,0x40000000; or $1,$2,$2; mtc0 $1,$12"
+ asm volatile ("mfc0 $3,$12; dli $2,0x40000000; or $3,$2,$2; mtc0 $3,$12"
: /* no outputs */
: /* no inputs */
- : "$1", "$2" /* clobbered */);
- asm volatile (".set at");
+ : "$3", "$2" /* clobbered */);
}
{
static int test_num = 0;
- printf("[%d @ %d] (%s): ", ++test_num, line, test);
+ printf("[%3d @ %3d] (%s): ", ++test_num, line, test);
if(ok)
{
num_ok ++;
+/* test01: test QMFC2/QMTC2 data non-corruption */
+void test01()
+{
+ 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 ("lq $4,%0; qmtc2 $4,vf01"
+ : /* no output */
+ : "m" (data[0]) /* input */
+ : "$4", "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 ("qmfc2 $4,vf00; sq $4,%0"
+ : /* no outputs */
+ : "m" (data[0]) /* input */
+ : "$4", "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 ("qmfc2 $4,vf01; sq $4,%0"
+ : /* no outputs */
+ : "m" (data2[0]) /* input */
+ : "$4", "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 */
/* tests */
test00();
+ test01();
/* summarize */