|
| 1 | +#include "stdio.h" |
| 2 | +#include "dill.h" |
| 3 | + |
| 4 | +static int errors = 0; |
| 5 | + |
| 6 | +static void check_i(int got, int expected) { |
| 7 | + if (got != expected) { |
| 8 | + printf("FAIL: got %d expected %d\n", got, expected); |
| 9 | + errors++; |
| 10 | + } |
| 11 | +} |
| 12 | + |
| 13 | +static void check_l(long got, long expected) { |
| 14 | + if (got != expected) { |
| 15 | + printf("FAIL: got %ld expected %ld\n", got, expected); |
| 16 | + errors++; |
| 17 | + } |
| 18 | +} |
| 19 | + |
| 20 | +static void noop7(void *a, void *b, void *c, int d, int e, int f, void *g) { |
| 21 | + volatile int x = d + e + f; |
| 22 | + (void)a; (void)b; (void)c; (void)g; (void)x; |
| 23 | +} |
| 24 | + |
| 25 | +int main() { |
| 26 | + dill_stream s; |
| 27 | + dill_exec_handle h; |
| 28 | + dill_reg blk_reg, tmp, d1, d2; |
| 29 | + int blk; |
| 30 | + |
| 31 | + /* Test 1: local block survives a function call */ |
| 32 | + printf("Test 1: local block across call\n"); |
| 33 | + s = dill_create_stream(); |
| 34 | + dill_start_simple_proc(s, "t1", DILL_V); |
| 35 | + blk = dill_getvblock(s, 32); |
| 36 | + blk_reg = dill_getreg(s, DILL_P); |
| 37 | + tmp = dill_getreg(s, DILL_I); |
| 38 | + dill_virtual_lea(s, blk_reg, blk); |
| 39 | + dill_seti(s, tmp, 42); |
| 40 | + dill_stii(s, tmp, blk_reg, 0); |
| 41 | + dill_seti(s, tmp, 99); |
| 42 | + dill_stii(s, tmp, blk_reg, 4); |
| 43 | + |
| 44 | + d1 = dill_getreg(s, DILL_P); |
| 45 | + d2 = dill_getreg(s, DILL_P); |
| 46 | + dill_setp(s, d1, 0); |
| 47 | + dill_setp(s, d2, 0); |
| 48 | + dill_scallv(s, (void*)noop7, "noop7", |
| 49 | + "%p%p%p%I%I%I%p", blk_reg, d1, d2, 1, 2, 3, blk_reg); |
| 50 | + |
| 51 | + dill_ldii(s, tmp, blk_reg, 0); |
| 52 | + dill_scallv(s, (void*)check_i, "post", "%i%I", tmp, 42); |
| 53 | + dill_ldii(s, tmp, blk_reg, 4); |
| 54 | + dill_scallv(s, (void*)check_i, "chk", "%i%I", tmp, 99); |
| 55 | + |
| 56 | + h = dill_finalize(s); |
| 57 | + ((void(*)())dill_get_fp(h))(); |
| 58 | + dill_free_handle(h); |
| 59 | + dill_free_stream(s); |
| 60 | + |
| 61 | + /* Test 2: multiple local blocks, all survive calls */ |
| 62 | + printf("Test 2: multiple local blocks across calls\n"); |
| 63 | + s = dill_create_stream(); |
| 64 | + dill_start_simple_proc(s, "t2", DILL_V); |
| 65 | + { |
| 66 | + int blk1 = dill_getvblock(s, 16); |
| 67 | + int blk2 = dill_getvblock(s, 16); |
| 68 | + dill_reg r1, r2, t; |
| 69 | + r1 = dill_getreg(s, DILL_P); |
| 70 | + r2 = dill_getreg(s, DILL_P); |
| 71 | + t = dill_getreg(s, DILL_I); |
| 72 | + dill_virtual_lea(s, r1, blk1); |
| 73 | + dill_virtual_lea(s, r2, blk2); |
| 74 | + |
| 75 | + dill_seti(s, t, 111); |
| 76 | + dill_stii(s, t, r1, 0); |
| 77 | + dill_seti(s, t, 222); |
| 78 | + dill_stii(s, t, r2, 0); |
| 79 | + |
| 80 | + d1 = dill_getreg(s, DILL_P); |
| 81 | + dill_setp(s, d1, 0); |
| 82 | + dill_scallv(s, (void*)noop7, "noop7", |
| 83 | + "%p%p%p%I%I%I%p", r1, d1, d1, 0, 0, 0, r2); |
| 84 | + |
| 85 | + dill_ldii(s, t, r1, 0); |
| 86 | + dill_scallv(s, (void*)check_i, "chk", "%i%I", t, 111); |
| 87 | + dill_ldii(s, t, r2, 0); |
| 88 | + dill_scallv(s, (void*)check_i, "chk", "%i%I", t, 222); |
| 89 | + } |
| 90 | + h = dill_finalize(s); |
| 91 | + ((void(*)())dill_get_fp(h))(); |
| 92 | + dill_free_handle(h); |
| 93 | + dill_free_stream(s); |
| 94 | + |
| 95 | + /* Test 3: long (8-byte) values in local block across call */ |
| 96 | + printf("Test 3: long values in local block across call\n"); |
| 97 | + s = dill_create_stream(); |
| 98 | + dill_start_simple_proc(s, "t3", DILL_V); |
| 99 | + { |
| 100 | + int b = dill_getvblock(s, 16); |
| 101 | + dill_reg br, t; |
| 102 | + br = dill_getreg(s, DILL_P); |
| 103 | + t = dill_getreg(s, DILL_L); |
| 104 | + dill_virtual_lea(s, br, b); |
| 105 | + dill_setl(s, t, (IMM_TYPE)0x123456789ABCDEF0LL); |
| 106 | + dill_stli(s, t, br, 0); |
| 107 | + |
| 108 | + d1 = dill_getreg(s, DILL_P); |
| 109 | + dill_setp(s, d1, 0); |
| 110 | + dill_scallv(s, (void*)noop7, "noop7", |
| 111 | + "%p%p%p%I%I%I%p", br, d1, d1, 0, 0, 0, d1); |
| 112 | + |
| 113 | + dill_ldli(s, t, br, 0); |
| 114 | + dill_scallv(s, (void*)check_l, "chk", "%l%L", |
| 115 | + t, (IMM_TYPE)0x123456789ABCDEF0LL); |
| 116 | + } |
| 117 | + h = dill_finalize(s); |
| 118 | + ((void(*)())dill_get_fp(h))(); |
| 119 | + dill_free_handle(h); |
| 120 | + dill_free_stream(s); |
| 121 | + |
| 122 | + if (errors == 0) { |
| 123 | + printf("No errors!\n"); |
| 124 | + } else { |
| 125 | + printf("%d errors\n", errors); |
| 126 | + } |
| 127 | + return errors != 0; |
| 128 | +} |
0 commit comments