From 1400a99e69bfa0b21f9625e078bef585c0100f0b Mon Sep 17 00:00:00 2001 From: Jean-Philip Desjardins Date: Mon, 11 May 2015 23:57:15 -0400 Subject: [PATCH] Added TriAce test. --- tests/vu/games/Makefile | 6 ++++ tests/vu/games/triace.cpp | 53 +++++++++++++++++++++++++++++++++ tests/vu/games/triace.elf | Bin 0 -> 125756 bytes tests/vu/games/triace.expected | 5 ++++ tests/vu/test_runner.cpp | 37 ++++++++++++++++++----- tests/vu/test_runner.h | 5 ++++ 6 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 tests/vu/games/Makefile create mode 100644 tests/vu/games/triace.cpp create mode 100644 tests/vu/games/triace.elf create mode 100644 tests/vu/games/triace.expected diff --git a/tests/vu/games/Makefile b/tests/vu/games/Makefile new file mode 100644 index 0000000..8b955a9 --- /dev/null +++ b/tests/vu/games/Makefile @@ -0,0 +1,6 @@ +TARGETS = triace +EXTRA_OBJS = ../assemble/block.o ../assemble/ops.o ../test_runner.o +EE_LIBS = -lg + +COMMON_DIR=../../../common +include $(COMMON_DIR)/common-ee.mk diff --git a/tests/vu/games/triace.cpp b/tests/vu/games/triace.cpp new file mode 100644 index 0000000..734b9cb --- /dev/null +++ b/tests/vu/games/triace.cpp @@ -0,0 +1,53 @@ +#include +#include "../test_runner.h" + +static const u32 __attribute__((aligned(16))) C_INIT[4] = {0xB063B75B, 0x8701CE82, 0x46FCC888, 0x793CC535}; + +static u32 *const CVI_INIT = (u32 *)(vu0_mem + 0x0000); + +static void setup_constants() { + *(vu128 *)CVI_INIT = *(vu128 *)C_INIT; +} + +class TriAceTestRunner : public TestRunner { +public: + TriAceTestRunner(int vu) : TestRunner(vu) { + } + + void Perform() { + using namespace VU; + + Reset(); + + WrLoadFloatRegister(DEST_XYZW, VF01, CVI_INIT); + + WrImm( 0x42FECCCD); + WrImm(MULi(DEST_X, VF02, VF01), 0x42546666); + WrImm(ADDi(DEST_X, VF03, VF02), 0x43D80D3E); + WrImm(MULi(DEST_Y, VF02, VF01), 0xC7F079B3); + WrImm(ADDi(DEST_Y, VF03, VF02), 0x43A0DA10); + WrImm(MULi(DEST_Z, VF02, VF01), 0x43A02666); + WrImm(ADDi(DEST_Z, VF03, VF02), 0x43546E14); + WrImm(MULi(DEST_W, VF02, VF01), 0x42F23333); + WrImm(ADDi(DEST_W, VF03, VF02), 0x3DD3DD98); + + Execute(); + + PrintRegister(VF01, true); + PrintRegister(VF02, true); + PrintRegister(VF03, true); + } +}; + +int main(int argc, char *argv[]) { + printf("-- TEST BEGIN\n"); + + setup_constants(); + + TriAceTestRunner runner(0); + + runner.Perform(); + + printf("-- TEST END\n"); + return 0; +} diff --git a/tests/vu/games/triace.elf b/tests/vu/games/triace.elf new file mode 100644 index 0000000000000000000000000000000000000000..25ffd29001c07351e4445e58681fe1127adffb31 GIT binary patch literal 125756 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

^Cvq8K1X_ssl60EajJK>-cmLZoBFvQ9+}K2 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

>rfuH+z1Vz4m0EUD-EU1+NUTr}u}Sy_&dH z_WNf|VTYWBa3937 z_QWqs+pN~H8*kU${pn;<`pXM<>{1ulbLOx*J#<*TGNj5$+ND4H2745JLk034^lBjc z+^fvXCcb(+_BmzpIV$7Jx=)&^>&$-XTIXxlevtGNbF%I;m){%8y3ecl&)}z@+8fI6 zzAC<~`@D)T1v~fj-VmEm;XATdeZz(SZl1&cXbx{sm^=5kargo4!gbR&1o&x40$LF5 zC!{5jvTTfh$Ztz=3B^FOUFXrm^Tr*%9#b(xDfOX99Y(?MeJArWyi-SbnlRt1@?ZA& zHm+6XV%q3qc+%Qqh^j8L27a?Lz59GUwioFkal0}@@Oi>oab9rs_}0q(zABRW2DiiG z-nbpbiya>0T|%kXxkgzVIalYOvqNJH$5HuZ_|J@4>+xxG%QPE+Fze@_+d@L$Gz7kCayj6@Bn1eP2D^u%ja*$siuo zBdVTpiN{3f#6}YW*)jOjpY-+m7!%*1$%SY+kzT69crvtQXe-dpO1zR)`(|!2`P`$w z>DL9=Rc89YlqI?Ek4qd}Z^D}zVf`ZahIh{L9;o=f6qC&@oB7=~^Sf;BaU`Lh3w{qd z8^{UptqxsAhmM7p{M|u^MCcDq_z!;Gf9SXTkNvivt@t1R9sl7k_>cUqpR4+xc+r3K z_x#6R^7kC`_m2493E$8AT_^qSQNO3)A1L|BTCw)5)D%JQ>=}w=W*>8 zlSy$y&j-d$4n*V5wgk<7vN8aU)tK~LMt120d0Lkpb{bxj9@Ok0={J_78%U3&DNEUT zPqLo59%pUuk24Q@iIW#`HT!ASjdE|w%`=&zbAmvev{T|*+ek0JeS0SMFYRvnsUNMq z5?v;^)>$8V0^jJBHbvW5N~3k22A_SJb*F9U(qNalYS67Xbh;TZQ$@O6Ujv&z8Q+(5 zQZ6gtQs<()BKzuXcm~}24C{CuT=Gt=O7xTYgDLP@9gmtt>(iE-x>{e7q}!elzDvKt zdf+-=(U?WFbjen0nSK!6q>V2=mDF>sRpbSH zBqMV>Mjq|A&UCs1omsjWH8$H_GWkOL>U0LQ=RtJ@-IheRUvulUqnj?Mp0XdQhgv!a zbt26?-K+4fgsdKEAD(4>H@?v;$|w3rC!gxmThX*H^Gsq3C*ccE(RbF!i!< zfzD3*N{*By-iz>gW4@ZG$Ge;`iZYcI#ao}satenjt~~tThHvt$ujdErdUr}hQJWd{ z@szg?ccuwbS|L4EMsh@_Q9`z~5B-FR?#m_WucYr74@{Y!#PfB(#iCg5d$}Y{>CfKy zyHq55sqD%QjBLFWl^7h^sdMqNAyeu*tWRfNyuvld6}gSK>ASzhvlCu{wmik!eEd;- zp^03UDfN}_K+pVb`EBHJ$y~3@=gOR<%#q5xY~(V~=b^7~wbIM{r_8y^Ja6Pu&@Ul# zovW383i|nffYzb!gx(V!xSG<1?vvjpOfDzA>x5?r%W_5XLwGN7NxD;iY|`C{AEjIJ zVZ+G>d0ysOWQmjKS)N7r=s9$rb>NTi@4C7xac8b`BvBd(lk8;Ext3symrm|qPhzrI zoN?EcpI}LUCXsbRBlQ2|&$M!{f12MbPaHk^a60qElb`uW`hkJ_2kzeq*~yI^OW3Ie zJGEe^7VOl5om%kYuLT3=OXnxfO+0r>4NRP=OsIi#XU@uYKx*Lh#0%%ntAR1&oqJ*I zxryg^)c-$w`kWd#d-}B9dFWaA$IqyN^QX?kq5nNUc81++2hOnN&_hEAd*S)#&wNha z;cwK*cjoe9#xN|7cUAsYUaY^WnMo56c~gX@EL1Bm@>EOIzipK;`RONIcUqsHGin{W z^*>D1e}@pH>BR5j5_+Li>=~r~C?WGabtm$~Ww?ZnpNJ}iE`)B@3_%m3)z$tW|08)J z@514qB-GL;G^GELEbSiRe?&LJ`|rp#W-BcwUUdJ6LnojAhS14xqR2&bzeIrOO*;7a z%;ZZ%Bfi8XPQGcfbo?GLbc3@N}l^<>qj|8P^?o$IhyA9n1Cj%oc@pT@HFx;1U MC)b5&9_w-a56iUsApigX literal 0 HcmV?d00001 diff --git a/tests/vu/games/triace.expected b/tests/vu/games/triace.expected new file mode 100644 index 0000000..4ef03ce --- /dev/null +++ b/tests/vu/games/triace.expected @@ -0,0 +1,5 @@ +-- TEST BEGIN +b063b75b/-0.00 8701ce82/-0.00 46fcc888/+32356.27 793cc535/+61259477699317514327946461014130688.00 +b3e2a618/-0.00 8b5b19e9/-0.00 4b1ed4a7/+10409127.00 7d1ca47b/+13013349922726739816220940519602126848.00 +42546666/+53.10 c7f079b3/-123123.40 4b1ed5e7/+10409447.00 7d1ca47b/+13013349922726739816220940519602126848.00 +-- TEST END diff --git a/tests/vu/test_runner.cpp b/tests/vu/test_runner.cpp index 3af4b77..1aff509 100644 --- a/tests/vu/test_runner.cpp +++ b/tests/vu/test_runner.cpp @@ -144,6 +144,34 @@ void TestRunner::InitFlags() { } } +u16 TestRunner::GetValueAddress(const u32 *val) { + u16 ptr = 0; + if (vu_ == 0) { + assert(val >= (u32 *)vu0_mem && val < (u32 *)(vu0_mem + vu0_mem_size)); + ptr = ((u8 *)val - vu0_mem) / 16; + } else { + assert(val >= (u32 *)vu1_mem && val < (u32 *)(vu1_mem + vu1_mem_size)); + ptr = ((u8 *)val - vu1_mem) / 16; + } + return ptr; +} + +void TestRunner::WrLoadFloatRegister(VU::Dest dest, VU::Reg r, const u32 *val) { + using namespace VU; + + assert(r >= VF00 && r <= VF31); + + u16 ptr = GetValueAddress(val); + + if ((ptr & 0x3FF) == ptr) { + Wr(LQ(dest, r, VI00, ptr)); + } else { + // This shouldn't happen? Even with 16kb, all reads should be < 0x400. + printf("Unhandled pointer load."); + assert(false); + } +} + void TestRunner::WrSetIntegerRegister(VU::Reg r, u32 v) { using namespace VU; @@ -166,14 +194,7 @@ void TestRunner::WrLoadIntegerRegister(VU::Dest dest, VU::Reg r, const u32 *val) assert(r >= VI00 && r <= VI15); - u16 ptr; - if (vu_ == 0) { - assert(val >= (u32 *)vu0_mem && val < (u32 *)(vu0_mem + vu0_mem_size)); - ptr = ((u8 *)val - vu0_mem) / 16; - } else { - assert(val >= (u32 *)vu1_mem && val < (u32 *)(vu1_mem + vu1_mem_size)); - ptr = ((u8 *)val - vu1_mem) / 16; - } + u16 ptr = GetValueAddress(val); if ((ptr & 0x3FF) == ptr) { Wr(ILW(dest, r, VI00, ptr)); diff --git a/tests/vu/test_runner.h b/tests/vu/test_runner.h index 3cd8068..ca177a4 100644 --- a/tests/vu/test_runner.h +++ b/tests/vu/test_runner.h @@ -25,6 +25,9 @@ class TestRunner : public VU::Block { // Emit an exit. void RunnerExit(); + // Emit code to set a float vector value. + void WrLoadFloatRegister(VU::Dest dest, VU::Reg r, const u32 *val); + // Emit code to set an integer value. void WrSetIntegerRegister(VU::Reg r, u32 val); void WrLoadIntegerRegister(VU::Dest dest, VU::Reg r, const u32 *val); @@ -40,6 +43,8 @@ class TestRunner : public VU::Block { void PrintIntegerRegister(int r); void PrintVectorRegister(int r); + u16 GetValueAddress(const u32 *val); + int vu_; u32 status_; u32 mac_;