Commit 1d23e27ca3ae13655041d4aaf6325a922e3bef27
1 parent
dd7468b7
Exists in
master
incremental
Showing
9 changed files
with
21 additions
and
248 deletions
Show diff stats
runtime/test3
No preview for this file type
sim2c-1.0/epilogue.m4
No preview for this file type
sim2c-1.0/test2.c
| ... | ... | @@ -1,228 +0,0 @@ |
| 1 | -#include <stdio.h> | |
| 2 | - | |
| 3 | -// == Global data ============================================================= | |
| 4 | - | |
| 5 | -#define W * 4 | |
| 6 | -#define KB * 1024 | |
| 7 | -#define MB KB KB | |
| 8 | - | |
| 9 | -#define DATA_SZ 1 MB | |
| 10 | -#define HEAP_SZ 1 MB | |
| 11 | -#define STACK_SZ 1 MB | |
| 12 | - | |
| 13 | -#define MEM_SZ ((DATA_SZ) + (HEAP_SZ) + (STACK_SZ)) | |
| 14 | - | |
| 15 | -union { | |
| 16 | - int mem[0]; | |
| 17 | - struct { | |
| 18 | - int m_display[0]; // data label for "display" | |
| 19 | - int a_0001; | |
| 20 | - int a_0002; | |
| 21 | - int a_0003; | |
| 22 | - int m_htop[0]; // data label for "htop" | |
| 23 | - int a_0004; | |
| 24 | - int m_heap[0]; // data label for "heap" | |
| 25 | - } named; | |
| 26 | - struct { | |
| 27 | - int z_data[DATA_SZ]; | |
| 28 | - int z_heap[HEAP_SZ]; | |
| 29 | - int z_stack[STACK_SZ]; | |
| 30 | - } zone; | |
| 31 | -} global; | |
| 32 | - | |
| 33 | -#define M global.mem | |
| 34 | -#define DATA global.zone.z_data | |
| 35 | -#define HEAP global.zone.z_heap | |
| 36 | -#define STACK global.zone.z_stack | |
| 37 | - | |
| 38 | -int SP = MEM_SZ; | |
| 39 | -int FP = 0; | |
| 40 | -int SR; | |
| 41 | -void *PC; // (unused) | |
| 42 | - | |
| 43 | -// -- Names for global variables ---------------------------------------------- | |
| 44 | - | |
| 45 | -#define GV_display ((int *) &global.named.m_display - (int *) &global.named) | |
| 46 | -#define GV_htop ((int *) &global.named.m_htop - (int *) &global.named) | |
| 47 | -#define GV_heap ((int *) &global.named.m_heap - (int *) &global.named) | |
| 48 | - | |
| 49 | -// == Program ================================================================= | |
| 50 | - | |
| 51 | -int main (int argc, char *argv[]) | |
| 52 | -{ | |
| 53 | - int i; | |
| 54 | - | |
| 55 | -// -- Initialization ---------------------------------------------------------- | |
| 56 | - global.named.a_0001 = 0; | |
| 57 | - global.named.a_0002 = 0; | |
| 58 | - global.named.a_0003 = 0; | |
| 59 | - global.named.a_0004 = GV_heap; | |
| 60 | - | |
| 61 | -// -- Library ----------------------------------------------------------------- | |
| 62 | - | |
| 63 | - goto lib_init; // skip library code! | |
| 64 | - | |
| 65 | -print_int: // print_int (int) -> () | |
| 66 | - printf ("%d\n", M[SP+1]); | |
| 67 | - goto * ((void *) M[SP++]); | |
| 68 | - | |
| 69 | -print_char: // print_char (int) -> () | |
| 70 | - putchar (M[SP+1]); | |
| 71 | - goto * ((void *) M[SP++]); | |
| 72 | - | |
| 73 | -read_int: // read_int () -> int | |
| 74 | - scanf ("%d", &M[SP+1]); | |
| 75 | - goto * ((void *) M[SP++]); | |
| 76 | - | |
| 77 | -read_char: // read_char () -> int | |
| 78 | - M[SP+1] = getchar (); | |
| 79 | - goto * ((void *) M[SP++]); | |
| 80 | - | |
| 81 | -halt: // halt () -> () | |
| 82 | - return 0; | |
| 83 | - | |
| 84 | -dump_regs: // dump_regs () -> () | |
| 85 | - { | |
| 86 | - printf ("-- Register dump --\n"); | |
| 87 | - printf ("SP = 0x%x (%d)\n", (int) SP, (int) SP); | |
| 88 | - printf ("FP = 0x%x (%d)\n", (int) FP, (int) FP); | |
| 89 | - printf ("SR = 0x%x (%d)\n", (int) SR, (int) SR); | |
| 90 | - printf ("PC = (unused)\n"); | |
| 91 | - } | |
| 92 | - goto * ((void *) M[SP++]); | |
| 93 | - | |
| 94 | -dump_stack: // dump_stack () -> () | |
| 95 | - { | |
| 96 | - printf ("-- Stack dump --\n"); | |
| 97 | - } | |
| 98 | - goto * ((void *) M[SP++]); | |
| 99 | - | |
| 100 | -stack_trace: // stack_trace () -> () | |
| 101 | - { | |
| 102 | - printf ("-- Stack trace --\n"); | |
| 103 | - } | |
| 104 | - goto * ((void *) M[SP++]); | |
| 105 | - | |
| 106 | -lib_init: | |
| 107 | - { | |
| 108 | - // (declarations for function ) (print_int); | |
| 109 | - // (declarations for function ) (print_char); | |
| 110 | - // (declarations for function ) (read_int); | |
| 111 | - // (declarations for function ) (read_char); | |
| 112 | - // (declarations for function ) (halt); | |
| 113 | - // (declarations for function ) (dump_regs); | |
| 114 | - // (declarations for function ) (dump_stack); | |
| 115 | - // (declarations for function ) (stack_trace); | |
| 116 | - } | |
| 117 | - | |
| 118 | -// -- Start execution --------------------------------------------------------- | |
| 119 | - M[--SP] = (int) &&L_exit_program; // Save return address for main program | |
| 120 | - goto program; // start kicking... | |
| 121 | -L_exit_program: // Return here, and... | |
| 122 | - exit (0); // quit. | |
| 123 | - | |
| 124 | - | |
| 125 | -// -- Instructions ------------------------------------------------------------ | |
| 126 | - M[--SP] = (int) &&_let_0; // PUSH _let_0 | |
| 127 | - goto * ((void *) M[SP++]); // JUMP | |
| 128 | -nfactor_1: | |
| 129 | - M[--SP] = 4; // PUSH 4 | |
| 130 | - { int N = M[SP]; M[SP]= FP; FP=SP+1; SP -= N; } // LINK | |
| 131 | - M[--SP] = GV_display; // PUSH display | |
| 132 | - M[--SP] = 8; // PUSH 8 | |
| 133 | - M[SP+1] = M[SP+1] + M[SP+0]; ++SP; // ADD | |
| 134 | - M[SP-1] = M[SP]; --SP; // DUP | |
| 135 | - M[SP] = M[M[SP]]; // LOAD | |
| 136 | - M[--SP] = -4; // PUSH -4 | |
| 137 | - M[SP] = M[SP] + FP; // LOCAL | |
| 138 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 139 | - M[--SP] = 0; // PUSH 0 | |
| 140 | - M[SP] = M[SP] + FP; // LOCAL | |
| 141 | - M[SP-1] = M[SP]; M[SP] = M[SP+1]; M[SP+1]=M[SP-1]; // SWAP | |
| 142 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 143 | - M[--SP] = (int) &&_then_1; // PUSH _then_1 | |
| 144 | - M[--SP] = (int) &&_neq_3; // PUSH _neq_3 | |
| 145 | - M[--SP] = 12; // PUSH 12 | |
| 146 | - M[SP] = M[SP] + FP; // LOCAL | |
| 147 | - M[SP] = M[M[SP]]; // LOAD | |
| 148 | - M[--SP] = 0; // PUSH 0 | |
| 149 | - M[SP+1] = M[SP+1] - M[SP+0]; ++SP; // SUB | |
| 150 | - if (! M[SP++]) goto P_26; // SKIPZ | |
| 151 | - goto * ((void *) M[SP++]); // JUMP | |
| 152 | -P_26: ++SP; // POP | |
| 153 | - M[--SP] = 1; // PUSH 1 | |
| 154 | - M[--SP] = (int) &&_fimeq_4; // PUSH _fimeq_4 | |
| 155 | - goto * ((void *) M[SP++]); // JUMP | |
| 156 | -_neq_3: | |
| 157 | - M[--SP] = 0; // PUSH 0 | |
| 158 | -_fimeq_4: | |
| 159 | - if (! M[SP++]) goto P_33; // SKIPZ | |
| 160 | - goto * ((void *) M[SP++]); // JUMP | |
| 161 | -P_33: ++SP; // POP | |
| 162 | - M[--SP] = 12; // PUSH 12 | |
| 163 | - M[SP] = M[SP] + FP; // LOCAL | |
| 164 | - M[SP] = M[M[SP]]; // LOAD | |
| 165 | - M[--SP] = 12; // PUSH 12 | |
| 166 | - M[SP] = M[SP] + FP; // LOCAL | |
| 167 | - M[SP] = M[M[SP]]; // LOAD | |
| 168 | - M[--SP] = 1; // PUSH 1 | |
| 169 | - M[SP+1] = M[SP+1] - M[SP+0]; ++SP; // SUB | |
| 170 | - M[SP-1] = M[SP]; --SP; // DUP | |
| 171 | - M[--SP] = (int) &&nfactor_1; // PUSH nfactor_1 | |
| 172 | - { void *C = (void *) M[SP]; M[SP]=(int)&&P_45; goto *C; } // CALL | |
| 173 | -P_45: M[SP-1] = M[SP]; M[SP] = M[SP+1]; M[SP+1]=M[SP-1]; // SWAP | |
| 174 | - ++SP; // POP | |
| 175 | - M[SP+1] = M[SP+1] * M[SP+0]; ++SP; // MUL | |
| 176 | - M[--SP] = (int) &&_fimif_2; // PUSH _fimif_2 | |
| 177 | - goto * ((void *) M[SP++]); // JUMP | |
| 178 | -_then_1: | |
| 179 | - M[--SP] = 1; // PUSH 1 | |
| 180 | -_fimif_2: | |
| 181 | - M[--SP] = 8; // PUSH 8 | |
| 182 | - M[SP] = M[SP] + FP; // LOCAL | |
| 183 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 184 | - M[--SP] = -4; // PUSH -4 | |
| 185 | - M[SP] = M[SP] + FP; // LOCAL | |
| 186 | - M[SP] = M[M[SP]]; // LOAD | |
| 187 | - M[--SP] = GV_display; // PUSH display | |
| 188 | - M[--SP] = 8; // PUSH 8 | |
| 189 | - M[SP+1] = M[SP+1] + M[SP+0]; ++SP; // ADD | |
| 190 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 191 | - SP=FP; FP=M[SP-1]; // UNLINK | |
| 192 | - goto * ((void *) M[SP++]); // JUMP | |
| 193 | -_let_0: | |
| 194 | - M[--SP] = 0; // PUSH 0 | |
| 195 | - M[--SP] = 4; // PUSH 4 | |
| 196 | - { int N = M[SP]; M[SP]= FP; FP=SP+1; SP -= N; } // LINK | |
| 197 | - M[--SP] = GV_display; // PUSH display | |
| 198 | - M[--SP] = 4; // PUSH 4 | |
| 199 | - M[SP+1] = M[SP+1] + M[SP+0]; ++SP; // ADD | |
| 200 | - M[SP-1] = M[SP]; --SP; // DUP | |
| 201 | - M[SP] = M[M[SP]]; // LOAD | |
| 202 | - M[--SP] = -4; // PUSH -4 | |
| 203 | - M[SP] = M[SP] + FP; // LOCAL | |
| 204 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 205 | - M[--SP] = 0; // PUSH 0 | |
| 206 | - M[SP] = M[SP] + FP; // LOCAL | |
| 207 | - M[SP-1] = M[SP]; M[SP] = M[SP+1]; M[SP+1]=M[SP-1]; // SWAP | |
| 208 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 209 | - M[--SP] = 10; // PUSH 10 | |
| 210 | - M[SP-1] = M[SP]; --SP; // DUP | |
| 211 | - M[--SP] = (int) &&nfactor_1; // PUSH nfactor_1 | |
| 212 | - { void *C = (void *) M[SP]; M[SP]=(int)&&P_82; goto *C; } // CALL | |
| 213 | -P_82: M[SP-1] = M[SP]; M[SP] = M[SP+1]; M[SP+1]=M[SP-1]; // SWAP | |
| 214 | - ++SP; // POP | |
| 215 | - M[--SP] = 4; // PUSH 4 | |
| 216 | - M[SP] = M[SP] + FP; // LOCAL | |
| 217 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 218 | - M[--SP] = -4; // PUSH -4 | |
| 219 | - M[SP] = M[SP] + FP; // LOCAL | |
| 220 | - M[SP] = M[M[SP]]; // LOAD | |
| 221 | - M[--SP] = GV_display; // PUSH display | |
| 222 | - M[--SP] = 4; // PUSH 4 | |
| 223 | - M[SP+1] = M[SP+1] + M[SP+0]; ++SP; // ADD | |
| 224 | - M[M[SP]] = M[SP+1]; SP += 2; // STORE | |
| 225 | - SP=FP; FP=M[SP-1]; // UNLINK | |
| 226 | - | |
| 227 | -} | |
| 228 | - |
sim2c-1.0/test3
No preview for this file type
sim2c-1.0/test3.c
| ... | ... | @@ -13,15 +13,15 @@ |
| 13 | 13 | #define MEM_SZ ((DATA_SZ) + (HEAP_SZ) + (STACK_SZ)) |
| 14 | 14 | |
| 15 | 15 | union { |
| 16 | - long mem[0]; | |
| 16 | + int mem[0]; | |
| 17 | 17 | struct { |
| 18 | - long m_x; | |
| 19 | - long m_xpto[20]; | |
| 18 | + int m_x; | |
| 19 | + int m_xpto[20]; | |
| 20 | 20 | } named; |
| 21 | 21 | struct { |
| 22 | - long z_data[DATA_SZ]; | |
| 23 | - long z_heap[HEAP_SZ]; | |
| 24 | - long z_stack[STACK_SZ]; | |
| 22 | + int z_data[DATA_SZ]; | |
| 23 | + int z_heap[HEAP_SZ]; | |
| 24 | + int z_stack[STACK_SZ]; | |
| 25 | 25 | } zone; |
| 26 | 26 | } global; |
| 27 | 27 | |
| ... | ... | @@ -30,21 +30,21 @@ union { |
| 30 | 30 | #define HEAP global.zone.z_heap |
| 31 | 31 | #define STACK global.zone.z_stack |
| 32 | 32 | |
| 33 | -long SP = MEM_SZ; | |
| 34 | -long FP = 0; | |
| 35 | -long SR; | |
| 33 | +int SP = MEM_SZ; | |
| 34 | +int FP = 0; | |
| 35 | +int SR; | |
| 36 | 36 | void *PC; // (unused) |
| 37 | 37 | |
| 38 | 38 | // -- Names for global variables ---------------------------------------------- |
| 39 | 39 | |
| 40 | -#define GV_x ((long *) &global.named.m_x - (long *) &global.named) | |
| 41 | -#define GV_xpto ((long *) &global.named.m_xpto - (long *) &global.named) | |
| 40 | +#define GV_x ((int *) &global.named.m_x - (int *) &global.named) | |
| 41 | +#define GV_xpto ((int *) &global.named.m_xpto - (int *) &global.named) | |
| 42 | 42 | |
| 43 | 43 | // == Program ================================================================= |
| 44 | 44 | |
| 45 | 45 | int main (int argc, char *argv[]) |
| 46 | 46 | { |
| 47 | - long i; | |
| 47 | + int i; | |
| 48 | 48 | |
| 49 | 49 | // -- Initialization ---------------------------------------------------------- |
| 50 | 50 | global.named.m_x = 123; |
| ... | ... | @@ -55,7 +55,7 @@ int main (int argc, char *argv[]) |
| 55 | 55 | goto lib_init; // skip library code! |
| 56 | 56 | |
| 57 | 57 | print_int: // print_int (int) -> () |
| 58 | - printf ("%ld\n", M[SP+1]); | |
| 58 | + printf ("%d\n", M[SP+1]); | |
| 59 | 59 | goto * ((void *) M[SP++]); |
| 60 | 60 | |
| 61 | 61 | print_char: // print_char (int) -> () |
| ... | ... | @@ -76,9 +76,9 @@ halt: // halt () -> () |
| 76 | 76 | dump_regs: // dump_regs () -> () |
| 77 | 77 | { |
| 78 | 78 | printf ("-- Register dump --\n"); |
| 79 | - printf ("SP = 0x%x (%d)\n", (long) SP, (long) SP); | |
| 80 | - printf ("FP = 0x%x (%d)\n", (long) FP, (long) FP); | |
| 81 | - printf ("SR = 0x%x (%d)\n", (long) SR, (long) SR); | |
| 79 | + printf ("SP = 0x%x (%d)\n", (int) SP, (int) SP); | |
| 80 | + printf ("FP = 0x%x (%d)\n", (int) FP, (int) FP); | |
| 81 | + printf ("SR = 0x%x (%d)\n", (int) SR, (int) SR); | |
| 82 | 82 | printf ("PC = (unused)\n"); |
| 83 | 83 | } |
| 84 | 84 | goto * ((void *) M[SP++]); |
| ... | ... | @@ -108,7 +108,7 @@ lib_init: |
| 108 | 108 | } |
| 109 | 109 | |
| 110 | 110 | // -- Start execution --------------------------------------------------------- |
| 111 | - M[--SP] = (long) &&L_exit_program; // Save return address for main program | |
| 111 | + M[--SP] = (int) &&L_exit_program; // Save return address for main program | |
| 112 | 112 | goto program; // start kicking... |
| 113 | 113 | L_exit_program: // Return here, and... |
| 114 | 114 | exit (0); // quit. |
| ... | ... | @@ -117,10 +117,10 @@ L_exit_program: // Return here, and... |
| 117 | 117 | // -- Instructions ------------------------------------------------------------ |
| 118 | 118 | program: |
| 119 | 119 | M[--SP] = 0; // PUSH 0 |
| 120 | - { long N = M[SP]; M[SP]= FP; FP=SP+1; SP -= N; } // LINK | |
| 120 | + { int N = M[SP]; M[SP]= FP; FP=SP+1; SP -= N; } // LINK | |
| 121 | 121 | M[--SP] = 12; // PUSH 12 |
| 122 | - M[--SP] = (long) &&print_int; // PUSH print_int | |
| 123 | - { void *C = (void *) M[SP]; M[SP]=(long)&&P_6; goto *C; } // CALL | |
| 122 | + M[--SP] = (int) &&print_int; // PUSH print_int | |
| 123 | + { void *C = (void *) M[SP]; M[SP]=(int)&&P_6; goto *C; } // CALL | |
| 124 | 124 | P_6: SP=FP; FP=M[SP-1]; // UNLINK |
| 125 | 125 | goto * ((void *) M[SP++]); // JUMP |
| 126 | 126 | ... | ... |
No preview for this file type
No preview for this file type