Commit | Line | Data |
---|---|---|
4a71579b PC |
1 | #include <stdio.h> |
2 | #include <lightning.h> | |
3 | ||
4 | typedef int (*pifi)(int); /* Pointer to Int Function of Int */ | |
5 | ||
6 | static jit_state_t *_jit; | |
7 | ||
8 | void stack_push(int reg, int *sp) | |
9 | { | |
10 | jit_stxi_i (*sp, JIT_FP, reg); | |
11 | *sp += sizeof (int); | |
12 | } | |
13 | ||
14 | void stack_pop(int reg, int *sp) | |
15 | { | |
16 | *sp -= sizeof (int); | |
17 | jit_ldxi_i (reg, JIT_FP, *sp); | |
18 | } | |
19 | ||
20 | jit_node_t *compile_rpn(char *expr) | |
21 | { | |
22 | jit_node_t *in, *fn; | |
23 | int stack_base, stack_ptr; | |
24 | ||
25 | fn = jit_note(NULL, 0); | |
26 | jit_prolog(); | |
79bfeef6 | 27 | in = jit_arg_i(); |
4a71579b PC |
28 | stack_ptr = stack_base = jit_allocai (32 * sizeof (int)); |
29 | ||
30 | jit_getarg_i(JIT_R2, in); | |
31 | ||
32 | while (*expr) { | |
33 | char buf[32]; | |
34 | int n; | |
35 | if (sscanf(expr, "%[0-9]%n", buf, &n)) { | |
36 | expr += n - 1; | |
37 | stack_push(JIT_R0, &stack_ptr); | |
38 | jit_movi(JIT_R0, atoi(buf)); | |
39 | } else if (*expr == 'x') { | |
40 | stack_push(JIT_R0, &stack_ptr); | |
41 | jit_movr(JIT_R0, JIT_R2); | |
42 | } else if (*expr == '+') { | |
43 | stack_pop(JIT_R1, &stack_ptr); | |
44 | jit_addr(JIT_R0, JIT_R1, JIT_R0); | |
45 | } else if (*expr == '-') { | |
46 | stack_pop(JIT_R1, &stack_ptr); | |
47 | jit_subr(JIT_R0, JIT_R1, JIT_R0); | |
48 | } else if (*expr == '*') { | |
49 | stack_pop(JIT_R1, &stack_ptr); | |
50 | jit_mulr(JIT_R0, JIT_R1, JIT_R0); | |
51 | } else if (*expr == '/') { | |
52 | stack_pop(JIT_R1, &stack_ptr); | |
53 | jit_divr(JIT_R0, JIT_R1, JIT_R0); | |
54 | } else { | |
55 | fprintf(stderr, "cannot compile: %s\n", expr); | |
56 | abort(); | |
57 | } | |
58 | ++expr; | |
59 | } | |
60 | jit_retr(JIT_R0); | |
61 | jit_epilog(); | |
62 | return fn; | |
63 | } | |
64 | ||
65 | int main(int argc, char *argv[]) | |
66 | { | |
67 | jit_node_t *nc, *nf; | |
68 | pifi c2f, f2c; | |
69 | int i; | |
70 | ||
71 | init_jit(argv[0]); | |
72 | _jit = jit_new_state(); | |
73 | ||
74 | nc = compile_rpn("32x9*5/+"); | |
75 | nf = compile_rpn("x32-5*9/"); | |
76 | (void)jit_emit(); | |
77 | c2f = (pifi)jit_address(nc); | |
78 | f2c = (pifi)jit_address(nf); | |
79 | jit_clear_state(); | |
80 | ||
81 | printf("\nC:"); | |
82 | for (i = 0; i <= 100; i += 10) printf("%3d ", i); | |
83 | printf("\nF:"); | |
84 | for (i = 0; i <= 100; i += 10) printf("%3d ", c2f(i)); | |
85 | printf("\n"); | |
86 | ||
87 | printf("\nF:"); | |
88 | for (i = 32; i <= 212; i += 18) printf("%3d ", i); | |
89 | printf("\nC:"); | |
90 | for (i = 32; i <= 212; i += 18) printf("%3d ", f2c(i)); | |
91 | printf("\n"); | |
92 | ||
93 | jit_destroy_state(); | |
94 | finish_jit(); | |
95 | return 0; | |
96 | } |