diff options
Diffstat (limited to 'iburg/briggs/icg-tools/iburg/sample4.brg')
-rw-r--r-- | iburg/briggs/icg-tools/iburg/sample4.brg | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/iburg/briggs/icg-tools/iburg/sample4.brg b/iburg/briggs/icg-tools/iburg/sample4.brg new file mode 100644 index 00000000000..0b5c6116afa --- /dev/null +++ b/iburg/briggs/icg-tools/iburg/sample4.brg @@ -0,0 +1,109 @@ +%{ +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +enum { + ADDI=309, ADDRLP=295, ASGNI=53, + CNSTI=21, CVCI=85, I0I=661, INDIRC=67 +}; + +#define STATE_TYPE long +typedef struct tree { + int op; + struct tree *kids[2]; + int val; + struct { STATE_TYPE state; } x; +} *NODEPTR_TYPE, *Tree; +#define LEFT_CHILD(p) ((p)->kids[0]) +#define RIGHT_CHILD(p) ((p)->kids[1]) +#define PANIC printf +#define STATE_LABEL(p) ((p)->x.state) + +int OP_LABEL(NODEPTR_TYPE p) { + switch (p->op) { + case CNSTI: if (p->val == 0) return 661 /* I0I */; + default: return p->op; + } +} + +static void burm_trace(NODEPTR_TYPE, int, int, int); +%} +%term ADDI=309 ADDRLP=295 ASGNI=53 +%term CNSTI=21 CVCI=85 I0I=661 INDIRC=67 +%% +stmt: ASGNI(disp,reg) = 4 (1); +stmt: reg = 5; +reg: ADDI(reg,rc) = 6 (1); +reg: CVCI(INDIRC(disp)) = 7 (1); +reg: I0I = 8; +reg: disp = 9 (1); +disp: ADDI(reg,con) = 10; +disp: ADDRLP = 11; +rc: con = 12; +rc: reg = 13; +con: CNSTI = 14; +con: I0I = 15; +%% + +static int trace; + +/* burm_trace - print trace message for matching p; decrement trace */ +static void burm_trace(NODEPTR_TYPE p, int eruleno, int cost, int bestcost) { + if (trace < 0) + fprintf(stderr, "0x%p matched %s = %d with cost %d vs. %d\n", p, + burm_string[eruleno], eruleno, cost, bestcost); + else if (trace > 0 && cost < bestcost) { + --trace; + fprintf(stderr, "0x%p matched %s = %d with cost %d\n", p, + burm_string[eruleno], eruleno, cost); + } +} + +/* dumpCover - print the matched cover for p */ +static void dumpCover(Tree p, int goalnt, int indent) { + int eruleno = burm_rule(p->x.state, goalnt); + short *nts = burm_nts[eruleno]; + Tree kids[10]; + int i; + + for (i = 0; i < indent; i++) + fprintf(stderr, " "); + fprintf(stderr, "%s\n", burm_string[eruleno]); + burm_kids(p, eruleno, kids); + for (i = 0; nts[i]; i++) + dumpCover(kids[i], nts[i], indent + 1); +} + +static void gen(NODEPTR_TYPE p) { + if (burm_label(p) == 0) + fprintf(stderr, "no cover\n"); + else + dumpCover(p, 1, 0); +} + +static Tree tree(int op, Tree l, Tree r) { + Tree t = malloc(sizeof *t); + + t->op = op; + t->kids[0] = l; t->kids[1] = r; + t->val = 0; + t->x.state = 0; + return t; +} + +main(void) { + Tree t; + + if (getenv("Trace")) + trace = atoi(getenv("Trace")); + printf("i = c + 4;\n"); + t = tree(ASGNI, + tree(ADDRLP, 0, 0), + tree(ADDI, + tree(CVCI, tree(INDIRC, tree(ADDRLP, 0, 0), 0), 0), + (t = tree(CNSTI, 0, 0), t->val = 4, t) + ) + ); + gen(t); + return 0; +} |