diff options
Diffstat (limited to 'tests/tst-assembler.c')
| -rw-r--r-- | tests/tst-assembler.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/tst-assembler.c b/tests/tst-assembler.c new file mode 100644 index 0000000..9b31edc --- /dev/null +++ b/tests/tst-assembler.c @@ -0,0 +1,60 @@ +#include <stdio.h> +#include <string.h> +#include <libmcpu.h> +#include "../utils/mcpu-asm.h" +#define CHECK(c,m) do{if(!(c)){fprintf(stderr,"FAIL: %s\n",m);return 1;}}while(0) +static const char src[]= +".data\n" +"big:\n" +" .integer 128, 123456789012345678901234567890\n" +"rv:\n" +" .real 128, 1.25\n" +"cv:\n" +" .complex 128, 1.5, -2.5\n" +".text\n" +" LDI r128@0x00000, -17\n" +" LDR r128@0x00010, -17.0\n" +" LDC c128@0x00020, -17.0r0+32.0j0\n" +" RCONST r128@0x00030, PI\n" +" IADD r128@0x00040, r128@0x00000, r128@0x00000\n" +" RADD r128@0x00050, r128@0x00010, r128@0x00010\n" +" CADD c128@0x00060, c128@0x00020, c128@0x00020\n" +" LOAD r128@0x00070, big\n" +" HALT\n"; +int +main( void ) +{ + cpu_asm_image im; + char err[256]; + mpu_int128_t ie; + mpu_real128_t re, rr; + mpu_wide_real_t cr, ci, er, ei; + int rc; + __cpu_init(); + CHECK( cpu_assemble_text( src, &im, err, sizeof( err ) ) == 0, err ); + CHECK( im.code_size > 0, "code produced" ); + CHECK( im.data_size == 64, "DATA NULL guard plus directives size" ); + CHECK( !memcmp( im.data, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", CPU_DATA_NULL_GUARD_SIZE ), "DATA NULL guard bytes" ); + CHECK( __cpu_program_set( im.code, im.code_size ) == 0, "program set" ); + CHECK( __cpu_data_set( im.data, im.data_size ) == 0, "data set" ); + rc = __cpu_run(); + CHECK( rc == 0, "assembled program run" ); + iatoi( ( mpu_int * ) ie, "-17", NB_I128 ); + CHECK( !memcmp( __cpu_reg_ptr( 128, 0 ), ie, NB_I128 ), "LDI" ); + ascii_to_real( ( mpu_real * ) re, "-17.0", NB_R128 ); + CHECK( r_cmp( ( mpu_real * ) __cpu_reg_ptr( 128, 16 ), ( mpu_real * ) re, NB_R128 ) == 0, "LDR" ); + _m_PI( ( mpu_real * ) rr, NB_R128 ); + CHECK( r_cmp( ( mpu_real * ) __cpu_reg_ptr( 128, 48 ), ( mpu_real * ) rr, NB_R128 ) == 0, "RCONST PI" ); + c_real_part( ( mpu_real * ) cr, ( mpu_complex * ) __cpu_reg_ptr( 128, 32 ), NB_R64 ); + c_imaginary( ( mpu_real * ) ci, ( mpu_complex * ) __cpu_reg_ptr( 128, 32 ), NB_R64 ); + ascii_to_real( ( mpu_real * ) er, "-17.0", NB_R64 ); + ascii_to_real( ( mpu_real * ) ei, "32.0", NB_R64 ); + CHECK( r_cmp( ( mpu_real * ) cr, ( mpu_real * ) er, NB_R64 ) == 0, "LDC real component" ); + CHECK( r_cmp( ( mpu_real * ) ci, ( mpu_real * ) ei, NB_R64 ) == 0, "LDC imag component" ); + iatoi( ( mpu_int * ) ie, "123456789012345678901234567890", NB_I128 ); + CHECK( !memcmp( __cpu_reg_ptr( 128, 112 ), ie, NB_I128 ), "LOAD DATA integer" ); + cpu_asm_image_free( &im ); + __cpu_free_context(); + puts( "libcpu test assembler regression: PASS" ); + return( 0 ); + } |
