filename | test/lib.c |
changeset | 190:f7653df5e832 |
prev | 185:6755a04c447f |
author | nkeynes |
date | Fri Dec 02 18:18:04 2011 +1000 (11 years ago) |
permissions | -rw-r--r-- |
last change | SH4 shadow-mode tweaks - Fix exceptions generated by the translator to account for the excepting instruction(s) in the cycle counts. - Compare floating point regs bitwise rather than with FP comparisons (otherwise can fail due to nan != nan) - Dump the translated block when we abort with an inconsistency |
file | annotate | diff | log | raw |
nkeynes@185 | 1 | #include "lib.h" |
nkeynes@185 | 2 | |
nkeynes@185 | 3 | void fwrite_dump( FILE *f, char *buf, int length) |
nkeynes@185 | 4 | { |
nkeynes@185 | 5 | int i,j; |
nkeynes@185 | 6 | for( i=0; i<length; i+=16 ) { |
nkeynes@185 | 7 | fprintf( f, "%08X: ", i ); |
nkeynes@185 | 8 | for( j=0; j<16 && i+j < length; j+=4 ) { |
nkeynes@185 | 9 | unsigned int val = *((volatile unsigned int *)(buf+i+j)); |
nkeynes@185 | 10 | fprintf( f, "%02X %02X %02X %02X ", val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF, (val>>24)&0xFF ); |
nkeynes@185 | 11 | } |
nkeynes@185 | 12 | for( ;j<16; j+= 4 ) { |
nkeynes@185 | 13 | fprintf( f, " " ); |
nkeynes@185 | 14 | } |
nkeynes@185 | 15 | for( j=0; j<16 && i+j < length; j++ ) { |
nkeynes@185 | 16 | fprintf( f, "%c", isprint(buf[i+j]) ? buf[i+j] : '.' ); |
nkeynes@185 | 17 | } |
nkeynes@185 | 18 | fprintf( f, "\n"); |
nkeynes@185 | 19 | } |
nkeynes@185 | 20 | } |
nkeynes@190 | 21 | |
nkeynes@190 | 22 | void fwrite_diff( FILE *f, char *a, int a_length, char *b, int b_length ) |
nkeynes@190 | 23 | { |
nkeynes@190 | 24 | int i; |
nkeynes@190 | 25 | fprintf( f, "Expected %d bytes:\n", a_length ); |
nkeynes@190 | 26 | fwrite_dump( f, a, a_length ); |
nkeynes@190 | 27 | fprintf( f, "but was %d bytes =>\n", b_length ); |
nkeynes@190 | 28 | fwrite_dump( f, b, b_length ); |
nkeynes@190 | 29 | } |
nkeynes@190 | 30 | |
nkeynes@190 | 31 | void fwrite_diff32( FILE *f, char *a, int a_length, char *b, int b_length ) |
nkeynes@190 | 32 | { |
nkeynes@190 | 33 | int i,j, k; |
nkeynes@190 | 34 | int length = a_length > b_length ? a_length : b_length; |
nkeynes@190 | 35 | fprintf( f, "Expected %d bytes, was %d bytes =>\n", a_length, b_length ); |
nkeynes@190 | 36 | |
nkeynes@190 | 37 | for( i=0; i<length; i+=16 ) { |
nkeynes@190 | 38 | for( k=0; k<32 && i+k < length; k+=4 ) { |
nkeynes@190 | 39 | if( i+k >= a_length || i+k >= b_length || |
nkeynes@190 | 40 | *((volatile unsigned int *)(a+i+k)) != *((volatile unsigned int *)(b+i+k)) ) { |
nkeynes@190 | 41 | break; |
nkeynes@190 | 42 | } |
nkeynes@190 | 43 | } |
nkeynes@190 | 44 | if( k != 32 && i+k != length ) { |
nkeynes@190 | 45 | fprintf( f, "%08X: ", i ); |
nkeynes@190 | 46 | for( j=0; j<16 && i+j < a_length; j+=4 ) { |
nkeynes@190 | 47 | fprintf( f, "%08X ", *((volatile unsigned int *)(a+i+j)) ); |
nkeynes@190 | 48 | } |
nkeynes@190 | 49 | |
nkeynes@190 | 50 | for(; j<16; j+=4 ) { |
nkeynes@190 | 51 | fprintf( f, " " ); |
nkeynes@190 | 52 | } |
nkeynes@190 | 53 | |
nkeynes@190 | 54 | fprintf( f, "| " ); |
nkeynes@190 | 55 | for( j=0; j<16 && i+j < b_length; j+=4 ) { |
nkeynes@190 | 56 | fprintf( f, "%08X ", *((volatile unsigned int *)(b+i+j)) ); |
nkeynes@190 | 57 | } |
nkeynes@190 | 58 | |
nkeynes@190 | 59 | fprintf( f, "\n"); |
nkeynes@190 | 60 | } |
nkeynes@190 | 61 | } |
nkeynes@190 | 62 | } |
.