summaryrefslogtreecommitdiff
path: root/tests/tst-assembler.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tst-assembler.c')
-rw-r--r--tests/tst-assembler.c60
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 );
+ }