Search
lxdream.org :: lxdream/test/sh4/testsh4.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/sh4/testsh4.c
changeset 1192:ba3df0bf2c23
prev1083:34895c8bab20
author nkeynes
date Fri Feb 24 21:11:58 2012 +1000 (12 years ago)
permissions -rw-r--r--
last change Add preprocessing support to genglsl
file annotate diff log raw
nkeynes@225
     1
#include <stdio.h>
nkeynes@555
     2
#include "../lib.h"
nkeynes@225
     3
nkeynes@226
     4
int total_tests = 0;
nkeynes@226
     5
int total_fails = 0;
nkeynes@226
     6
nkeynes@1192
     7
void test_print_float_error( int expect, int actual )
nkeynes@1192
     8
{
nkeynes@1192
     9
    fprintf( stderr, "Error: expected 0x%08x but was 0x%08x\n", expect, actual );
nkeynes@1192
    10
}
nkeynes@1192
    11
nkeynes@225
    12
int test_print_result( char *testname, int failed, int total )
nkeynes@225
    13
{
nkeynes@231
    14
    fprintf( stdout, "%s: %d/%d tests passed\n", testname, total-failed, total );
nkeynes@226
    15
    total_tests += total;
nkeynes@226
    16
    total_fails += failed;
nkeynes@225
    17
    return failed;
nkeynes@225
    18
}
nkeynes@225
    19
nkeynes@226
    20
void test_print_failure( char *testname, int number, char *message )
nkeynes@225
    21
{
nkeynes@226
    22
    if( message == NULL ) {
nkeynes@226
    23
	fprintf( stderr, "%s: Test %d failed!\n", testname, number );
nkeynes@226
    24
    } else {
nkeynes@226
    25
	fprintf( stderr, "%s: Test %d failed: %s\n", testname, number, message );
nkeynes@226
    26
    }
nkeynes@225
    27
}
nkeynes@225
    28
nkeynes@228
    29
extern unsigned int interrupt_pc;
nkeynes@228
    30
extern unsigned int interrupt_count;
nkeynes@228
    31
nkeynes@228
    32
int assert_exception_caught( char *testname, int number, unsigned int expectedpc ) 
nkeynes@228
    33
{
nkeynes@228
    34
    if( interrupt_count == 0 ) {
nkeynes@228
    35
	fprintf( stderr, "%s: Test %d failed: Expected exception not delivered\n",
nkeynes@228
    36
		 testname, number );
nkeynes@228
    37
	return 1;
nkeynes@228
    38
    } else if( interrupt_count != 1 ) {
nkeynes@228
    39
	fprintf( stderr, "%s: Test %d failed: Expected exception delivered %d times!\n",
nkeynes@228
    40
		 testname, number, interrupt_count );
nkeynes@228
    41
	return 1;
nkeynes@228
    42
    } else if( interrupt_pc != expectedpc ) {
nkeynes@228
    43
	fprintf( stderr, "%s: Test %d failed: Expected exception at PC %08X, but was %08X\n",
nkeynes@228
    44
		 testname, number, expectedpc, interrupt_pc );
nkeynes@228
    45
	return 1;
nkeynes@228
    46
    } else {
nkeynes@228
    47
	return 0;
nkeynes@228
    48
    }
nkeynes@228
    49
}
nkeynes@228
    50
nkeynes@555
    51
int assert_tlb_exception_caught( char *testname, int number, unsigned int expectedpc,
nkeynes@555
    52
				 unsigned int vpn )
nkeynes@555
    53
{
nkeynes@555
    54
    if( assert_exception_caught(testname, number, expectedpc) == 1 ) {
nkeynes@555
    55
	return 1;
nkeynes@555
    56
    }
nkeynes@555
    57
    
nkeynes@555
    58
    unsigned int pteh = long_read(0xFF000000);
nkeynes@555
    59
    if( (pteh & 0xFFFFFC00) != (vpn & 0xFFFFFC00) ) {
nkeynes@555
    60
	fprintf(stderr, "%s: Test %d failed: Expected PTEH.VPN = %08X, but was %08X\n",
nkeynes@555
    61
		testname, number, (vpn>>10), (pteh>>10) );
nkeynes@555
    62
	return 1;
nkeynes@555
    63
    }
nkeynes@555
    64
nkeynes@555
    65
    unsigned int tea = long_read(0xFF00000C);
nkeynes@555
    66
    if( tea != vpn ) {
nkeynes@555
    67
	fprintf(stderr, "%s: Test %d failed: Expected TEA = %08X, but was %08X\n",
nkeynes@555
    68
		testname, number, vpn, tea );
nkeynes@555
    69
	return 1;
nkeynes@555
    70
    }
nkeynes@555
    71
    return 0;
nkeynes@555
    72
}
nkeynes@555
    73
nkeynes@225
    74
int main()
nkeynes@225
    75
{
nkeynes@231
    76
    fprintf( stdout, "Instruction tests...\n" );
nkeynes@228
    77
    install_interrupt_handler();
nkeynes@225
    78
    test_add();
nkeynes@226
    79
    test_addc();
nkeynes@226
    80
    test_addv();
nkeynes@226
    81
    test_and();
nkeynes@226
    82
    test_andi();
nkeynes@228
    83
    test_bf(); 
nkeynes@231
    84
    test_bt();
nkeynes@404
    85
    test_bsr();
nkeynes@231
    86
    test_cmp();
nkeynes@364
    87
    test_cmpstr();
nkeynes@364
    88
    test_div0();
nkeynes@384
    89
    test_div1();
nkeynes@357
    90
    test_float();
nkeynes@1192
    91
    test_fsrra();
nkeynes@358
    92
    test_fmov();
nkeynes@357
    93
    test_ftrc();
nkeynes@823
    94
    test_ldc();
nkeynes@358
    95
    test_mac();
nkeynes@396
    96
    test_rot();
nkeynes@396
    97
    test_shl();
nkeynes@364
    98
    test_shld();
nkeynes@393
    99
    test_sub();
nkeynes@393
   100
    test_subc();
nkeynes@1083
   101
    test_subv();
nkeynes@533
   102
    test_trapa();
nkeynes@399
   103
    test_tas();
nkeynes@393
   104
    test_xtrct();
nkeynes@231
   105
    fprintf( stdout, "--> %d/%d instruction tests passed (%d%%)\n\n",
nkeynes@231
   106
	     total_tests-total_fails, total_tests, 
nkeynes@231
   107
	     ((total_tests-total_fails)*100)/total_tests );
nkeynes@231
   108
nkeynes@231
   109
    fprintf( stdout, "Exception tests...\n" );
nkeynes@231
   110
    test_slot_illegal();
nkeynes@233
   111
    test_undefined();
nkeynes@555
   112
    test_tlb();
nkeynes@808
   113
    test_vmexit();
nkeynes@228
   114
    remove_interrupt_handler();
nkeynes@226
   115
nkeynes@231
   116
    fprintf( stdout, "Total: %d/%d tests passed (%d%%)\n", total_tests-total_fails,
nkeynes@226
   117
	     total_tests, ((total_tests-total_fails)*100)/total_tests );
nkeynes@522
   118
    return total_fails;
nkeynes@225
   119
}
.