yet more timing hacks
[pcsx_rearmed.git] / deps / lightning / doc / rpn.c
CommitLineData
4a71579b
PC
1#include <stdio.h>
2#include <lightning.h>
3
4typedef int (*pifi)(int); /* Pointer to Int Function of Int */
5
6static jit_state_t *_jit;
7
8void stack_push(int reg, int *sp)
9{
10 jit_stxi_i (*sp, JIT_FP, reg);
11 *sp += sizeof (int);
12}
13
14void stack_pop(int reg, int *sp)
15{
16 *sp -= sizeof (int);
17 jit_ldxi_i (reg, JIT_FP, *sp);
18}
19
20jit_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
65int 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}