diff --git a/psx/octoshock/docs/upstreaminfo.txt b/psx/octoshock/docs/upstreaminfo.txt index d32b8829ac..9b2362b5a6 100644 --- a/psx/octoshock/docs/upstreaminfo.txt +++ b/psx/octoshock/docs/upstreaminfo.txt @@ -129,4 +129,6 @@ [NO] psx/gpu : render parameters stuff [NO] psx/input/dualshocK : AMCT stuff [NO] psx/psx : render parameters stuff -[OK] tests : pasted over and whittled down \ No newline at end of file +[OK] tests : pasted over and whittled down +0.9.41 -> 0.9.42 +[OK] tests : some 64bit casting tests \ No newline at end of file diff --git a/psx/octoshock/tests.cpp b/psx/octoshock/tests.cpp index d6f51721d6..304b82db8f 100644 --- a/psx/octoshock/tests.cpp +++ b/psx/octoshock/tests.cpp @@ -1393,6 +1393,66 @@ static void TestRoundPow2(void) #endif } +template +static NO_INLINE NO_CLONE RT TestCasts_Sub_L(T v) +{ + return (RT)v << sa; +} + +template +static NO_INLINE NO_CLONE RT TestCasts_Sub_R(T v) +{ + return (RT)v >> sa; +} + +template +static INLINE RT TestCasts_Sub(T v) +{ + if(sa < 0) + return TestCasts_Sub_R(v); + else + return TestCasts_Sub_L(v); +} + +static void TestCastShift(void) +{ + assert((TestCasts_Sub< int64, uint8, 4>(0xEF) == 0x0000000000000EF0ULL)); + assert((TestCasts_Sub(0xEF) == 0xFFFFFFFFFFFFFEF0ULL)); + + assert((TestCasts_Sub< int64, uint16, 4>(0xBEEF) == 0x00000000000BEEF0ULL)); + assert((TestCasts_Sub(0xBEEF) == 0xFFFFFFFFFFFBEEF0ULL)); + + assert((TestCasts_Sub< int64, uint32, 4>(0xDEADBEEF) == 0x0000000DEADBEEF0ULL)); + assert((TestCasts_Sub(0xDEADBEEF) == 0xFFFFFFFDEADBEEF0ULL)); + + assert((TestCasts_Sub< int64, uint8, 20>(0xEF) == 0x000000000EF00000ULL)); + assert((TestCasts_Sub(0xEF) == 0xFFFFFFFFFEF00000ULL)); + + assert((TestCasts_Sub< int64, uint16, 20>(0xBEEF) == 0x0000000BEEF00000ULL)); + assert((TestCasts_Sub(0xBEEF) == 0xFFFFFFFBEEF00000ULL)); + + assert((TestCasts_Sub< int64, uint32, 20>(0xDEADBEEF) == 0x000DEADBEEF00000ULL)); + assert((TestCasts_Sub(0xDEADBEEF) == 0xFFFDEADBEEF00000ULL)); + + assert((TestCasts_Sub< int64, uint8, -4>(0xEF) == 0x000000000000000EULL)); + assert((TestCasts_Sub(0xEF) == 0x0FFFFFFFFFFFFFFEULL)); + + assert((TestCasts_Sub< int64, uint16, -4>(0xBEEF) == 0x0000000000000BEEULL)); + assert((TestCasts_Sub(0xBEEF) == 0x0FFFFFFFFFFFFBEEULL)); + + assert((TestCasts_Sub< int64, uint32, -4>(0xDEADBEEF) == 0x000000000DEADBEEULL)); + assert((TestCasts_Sub(0xDEADBEEF) == 0x0FFFFFFFFDEADBEEULL)); + + assert((TestCasts_Sub< int64, uint8, -20>(0xEF) == 0x0000000000000000ULL)); + assert((TestCasts_Sub(0xEF) == 0x00000FFFFFFFFFFFULL)); + + assert((TestCasts_Sub< int64, uint16, -20>(0xBEEF) == 0x0000000000000000ULL)); + assert((TestCasts_Sub(0xBEEF) == 0x00000FFFFFFFFFFFULL)); + + assert((TestCasts_Sub< int64, uint32, -20>(0xDEADBEEF) == 0x0000000000000DEAULL)); + assert((TestCasts_Sub(0xDEADBEEF) == 0x00000FFFFFFFFDEAULL)); +} + #ifdef WANT_TEST_TIME static void Time_Test(void) { @@ -1695,6 +1755,8 @@ bool MDFN_RunMathTests(void) Time_Test(); #endif + TestCastShift(); + #if 0 // Not really a math test. const char *test_paths[] = { "/meow", "/meow/cow", "\\meow", "\\meow\\cow", "\\\\meow", "\\\\meow\\cow",