summaryrefslogtreecommitdiff
path: root/tests/tst-aggregate.c
diff options
context:
space:
mode:
authorkx <kx@radix-linux.su>2026-10-09 18:00:15 +0300
committerkx <kx@radix-linux.su>2026-10-09 18:00:15 +0300
commit065da3509019b15dd0e678072e6be629e5330bef (patch)
tree69c934c9e786ac048b4fbe8f4c4c5571661521f4 /tests/tst-aggregate.c
parentd130fe27fa753be02ed76fd9b277aa3c3d928eb9 (diff)
downloadlibmcpu-0.4.0.tar.xz
Version 0.4.00.4.0
Diffstat (limited to 'tests/tst-aggregate.c')
-rw-r--r--tests/tst-aggregate.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/tst-aggregate.c b/tests/tst-aggregate.c
new file mode 100644
index 0000000..2311d0f
--- /dev/null
+++ b/tests/tst-aggregate.c
@@ -0,0 +1,68 @@
+#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[]=
+".text\n"
+" ADJSP -16\n"
+" LEASP r64@0x00000, 0\n"
+" LDI r64@0x00100, 11\n"
+" LDI r64@0x00108, 22\n"
+" ADJSP -32\n"
+" STSP 0, r64@0x00000\n"
+" STSP 8, r128@0x00100\n"
+" CALL copy_pair\n"
+" ADJSP 32\n"
+" LDSP r128@0x00200, 0\n"
+" IADD r64@0x00210, r64@0x00200, r64@0x00208\n"
+" LEASP r64@0x00008, 0\n"
+" ADJSP -16\n"
+" STSP 0, r64@0x00008\n"
+" CALL first_field\n"
+" ADJSP 16\n"
+" ADJSP 16\n"
+" HALT\n"
+"copy_pair:\n"
+" LDSP r64@0x00300, 8\n"
+" LDSP r128@0x00310, 16\n"
+" STOREP r64@0x00300, r128@0x00310\n"
+" RET\n"
+"first_field:\n"
+" LDSP r64@0x00400, 8\n"
+" LOADP r64@0x7fff8, r64@0x00400\n"
+" RET\n";
+
+static int
+eq64( unsigned address, const char *text )
+{
+ mpu_int64_t x;
+ iatoi( ( mpu_int * ) x, (__mpu_char8_t *)text, NB_I64 );
+ return( !memcmp( __cpu_reg_ptr( 64, address ), x, NB_I64 ) );
+}
+
+int
+main( void )
+{
+ cpu_asm_image im;
+ char err[256];
+
+ __cpu_init();
+ CHECK( cpu_assemble_text( src, &im, err, sizeof( err ) ) == 0, err );
+ CHECK( __cpu_program_set( im.code, im.code_size ) == 0, "program set" );
+ CHECK( __cpu_stack_alloc( 512 ) == 0, "stack alloc" );
+ CHECK( __cpu_run() == CPU_EXEC_SUCCESS, "aggregate ABI program run" );
+
+ CHECK( __cpu_sp == 512, "caller released local object and all arguments" );
+ CHECK( eq64( 0x00200, "11" ), "aggregate return first field" );
+ CHECK( eq64( 0x00208, "22" ), "aggregate return second field" );
+ CHECK( eq64( 0x00210, "33" ), "aggregate return object preserved" );
+ CHECK( eq64( 0x7fff8, "11" ), "pointer argument and scalar return" );
+
+ cpu_asm_image_free( &im );
+ __cpu_free_context();
+ puts( "libcpu aggregate CALL ABI regression: PASS" );
+ return( 0 );
+}