diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-03-28 17:48:38 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-03-28 17:48:38 +0000 |
commit | 229bd5f50d69a07deaa4b7943bd713b1e69d1bbe (patch) | |
tree | 2c01c41b169ddd8281ed402a8df6f98f8bf4cf36 | |
parent | a6b819c584aed7f769c96544ca963e86314acbd9 (diff) | |
download | mailfromd-229bd5f50d69a07deaa4b7943bd713b1e69d1bbe.tar.gz mailfromd-229bd5f50d69a07deaa4b7943bd713b1e69d1bbe.tar.bz2 |
Prepare the instruction set for array data type: remove PUSH_LITERAL,
PUSH_IMMEDIATE, VARIABLE, AUTO, ARG; introduce instead MEM, MEMSTK,
MEMEXT, DEREF; Change semantics of ASGN
git-svn-id: file:///svnroot/mailfromd/trunk@1319 7a8a7f39-df28-0410-adc6-e0d955640f24
-rw-r--r-- | src/drivers.c | 74 | ||||
-rw-r--r-- | src/opcodes | 14 | ||||
-rw-r--r-- | src/prog.c | 148 |
3 files changed, 126 insertions, 110 deletions
diff --git a/src/drivers.c b/src/drivers.c index 3653f4ae..0e276b81 100644 --- a/src/drivers.c +++ b/src/drivers.c @@ -26,6 +26,31 @@ } while (0) + +void +code_memref(NODE *node) +{ + switch (node->v.var_ref.variable->storage_class) { + case storage_extern: + code_op(opcode_memext); + code_immediate((void*)node->v.var_ref.variable->off); + break; + + case storage_auto: + code_op(opcode_memstk); + code_immediate((void*)node->v.var_ref.nframes); + code_immediate((void*)node->v.var_ref.variable->off); + break; + + case storage_param: + code_op(opcode_memstk); + code_immediate((void*)node->v.var_ref.nframes); + code_immediate((void*)(-(node->v.var_ref.variable->off + 2))); + break; + } +} + + /* type noop */ /* Empty node, nothing to print, mark, optimize or code */ @@ -51,8 +76,8 @@ void code_type_string(NODE *node, struct locus **old_locus) { MARK_LOCUS(); - code_op(opcode_push_literal); - code_immediate((STKVAL)node->v.literal->off); + code_op(opcode_memext); + code_immediate((const void*)node->v.literal->off); } @@ -92,7 +117,7 @@ void code_type_number(NODE *node, struct locus **old_locus) { MARK_LOCUS(); - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate((void*)node->v.number); } @@ -663,11 +688,11 @@ code_type_bin(NODE *node, struct locus **old_locus) code_node(node->v.bin.arg[1]); code_op(opcode_bnz); pos2 = code_immediate((void *)4); - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate((void *)0); code_op(opcode_jmp); code_immediate((void *)2); - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate((void*)1); code_put(pos1, (void *)(pos2 - pos1)); break; @@ -688,11 +713,11 @@ code_type_bin(NODE *node, struct locus **old_locus) code_node(node->v.bin.arg[1]); code_op(opcode_bz); pos2 = code_immediate((void *)4); - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate((void *)1); code_op(opcode_jmp); code_immediate((void *)2); - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate((void *)0); code_put(pos1, (void *)(pos2 - pos1)); break; @@ -729,7 +754,7 @@ code_type_bin(NODE *node, struct locus **old_locus) case bin_match: code_node(node->v.bin.arg[1]); - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate((void*) (node->v.bin.qualifier & QUALIFIER_REGFREE)); MARK_LOCUS(); @@ -922,7 +947,7 @@ code_type_result(NODE *node, struct locus **old_locus) if (node->v.ret.message) code_node(node->v.ret.message); else { - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate(NULL); } MARK_LOCUS(); @@ -1030,7 +1055,7 @@ code_type_builtin(NODE *node, struct locus **old_locus) for (p = node->v.builtin.args, i = 0; p; p = p->next, i++) code_node(p); for (; i < bp->parmcount; i++) { - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate(0); } @@ -1124,22 +1149,8 @@ void code_type_variable(NODE *node, struct locus **old_locus) { MARK_LOCUS(); - switch (node->v.var_ref.variable->storage_class) { - case storage_extern: - code_op(opcode_variable); - break; - - case storage_auto: - code_op(opcode_auto); - code_immediate((void*)node->v.var_ref.nframes); - break; - - case storage_param: - code_op(opcode_arg); - code_immediate((void*)node->v.var_ref.nframes); - break; - } - code_immediate((void*)node->v.var_ref.variable->off); + code_memref(node); + code_op(opcode_deref); if (node->v.var_ref.variable->type == dtype_string) code_op(opcode_svalidate); } @@ -1176,10 +1187,8 @@ code_type_asgn(NODE *node, struct locus **old_locus) { code_node(node->v.asgn.node); node->v.asgn.var->type = node_type(node->v.asgn.node); + code_memref(node); code_op(opcode_asgn); - code_immediate((void*)node->v.asgn.var->storage_class); - code_immediate((void*)node->v.asgn.nframes); - code_immediate((void*)node->v.asgn.var->off); } @@ -1196,9 +1205,10 @@ void code_type_arg(NODE *node, struct locus **old_locus) { MARK_LOCUS(); - code_op(opcode_arg); + code_op(opcode_memstk); code_immediate((void*)0); - code_immediate((void*)node->v.arg.number); + code_immediate((void*)(-(node->v.arg.number+2))); + code_op(opcode_deref); } @@ -1364,7 +1374,7 @@ code_type_catch(NODE *node, struct locus **old_locus) code_op(opcode_jmp); jump_pc = code_immediate((void*)jump_pc); } else { - code_op(opcode_push_immediate); + code_op(opcode_push); code_immediate(NULL); code_op(opcode_result); code_immediate(SMFIS_CONTINUE); diff --git a/src/opcodes b/src/opcodes index 1dd3e6fb..cd0aaf2a 100644 --- a/src/opcodes +++ b/src/opcodes @@ -24,16 +24,12 @@ STKALLOC dump_stkalloc 1 XCHG NULL 0 POP NULL 0 DUP NULL 0 -PUSH_IMMEDIATE dump_push_immediate 1 -PUSH_LITERAL dump_push_literal 1 -VARIABLE dump_variable 1 -AUTO dump_auto 2 -ARG dump_auto 2 +PUSH dump_push 1 SYMBOL dump_symbol 1 BACKREF dump_backref 1 STON NULL 0 NTOS NULL 0 -ADJUST dump_variable 1 +ADJUST dump_adjust 1 POPREG NULL 0 PUSHREG NULL 0 @@ -79,7 +75,11 @@ LOGNOT NULL 0 CONCAT NULL 0 -ASGN dump_asgn 3 +MEMSTK dump_memstk 2 +MEMEXT dump_memext 1 +MEM NULL 0 +DEREF NULL 0 +ASGN NULL 0 BUILTIN dump_builtin 2 SVALIDATE NULL 0 @@ -521,21 +521,87 @@ instr_pop(eval_environ_t env) } void -instr_push_immediate(eval_environ_t env) +instr_push(eval_environ_t env) { if (PROG_TRACE_ENGINE) - prog_trace(env, "PUSH_IMMEDIATE %x", get_immediate(env, 0)); + prog_trace(env, "PUSH %x", get_immediate(env, 0)); push(env, get_immediate(env, 0)); advance_pc(env, 1); } void -dump_push_immediate(prog_counter_t i) +dump_push(prog_counter_t i) { printf("%lx", (unsigned long) prog[i]); } void +instr_memstk(eval_environ_t env) +{ + size_t frame = (size_t) get_immediate(env, 0); + long off = (long) get_immediate(env, 1); + STKVAL val = (STKVAL) &env->stack[env_base(env, frame) + off]; + advance_pc(env, 2); + if (PROG_TRACE_ENGINE) + prog_trace(env, "MEMSTK %lu(%ld)=%08x", + (unsigned long) frame, off, + val); + push(env, val); +} + +void +dump_memstk(prog_counter_t i) +{ + printf("%lu(%ld)", (unsigned long) prog[i], (long) prog[i+1]); +} + +void +instr_memext(eval_environ_t env) +{ + size_t off = (size_t) get_immediate(env, 0); + STKVAL val = (STKVAL) &env->dataseg[off]; + advance_pc(env, 1); + if (PROG_TRACE_ENGINE) + prog_trace(env, "MEMEXT %08x=%08x", + (unsigned long) off, + val); + push(env, val); +} + +void +dump_memext(prog_counter_t i) +{ + printf("%08x", (unsigned long) prog[i]); +} + +void +instr_mem(eval_environ_t env) +{ + size_t frame = (size_t) get_arg(env, 2); + size_t off = (size_t) get_arg(env, 1); + storage_class_t class = (storage_class_t) get_arg(env, 0); + adjust_stack(env, 3); + + if (PROG_TRACE_ENGINE) + prog_trace(env, "LOC %s %lu(%lu)", + storage_class_str(class), + (unsigned long) frame, + (unsigned long) off); + push(env, (STKVAL) env_reference(env, class, off, frame)); +} + +void +instr_deref(eval_environ_t env) +{ + STKVAL *p = (STKVAL*) get_arg(env, 0); + adjust_stack(env, 1); + if (PROG_TRACE_ENGINE) + prog_trace(env, "DEREF %p=%p", p, *p); + push(env, *p); +} + + +void instr_push_literal(eval_environ_t env) { size_t s = (size_t) get_immediate(env, 0); @@ -1282,52 +1348,22 @@ instr_concat(eval_environ_t env) } void -instr_variable(eval_environ_t env) -{ - size_t off = (size_t) get_immediate(env, 0); - advance_pc(env, 1); - if (PROG_TRACE_ENGINE) - prog_trace(env, "VARIABLE %lu = %lu", - (unsigned long) off, - (unsigned long) env->dataseg[off]); - push(env, (STKVAL) env->dataseg[off]); -} - -void -dump_variable(prog_counter_t i) +dump_adjust(prog_counter_t i) { printf("%lu ", (unsigned long) prog[i]); } void -dump_auto(prog_counter_t i) -{ - printf("%lu(%lu)", (unsigned long) prog[i], (unsigned long) prog[i+1]); -} - -void instr_asgn(eval_environ_t env) { - STKVAL val = get_arg(env, 0); - storage_class_t sc = (storage_class_t) get_immediate(env, 0); - size_t frame = (size_t) get_immediate(env, 1); - size_t off = (size_t) get_immediate(env, 2); - advance_pc(env, 3); - adjust_stack(env, 1); + STKVAL val = get_arg(env, 1); + STKVAL *dest = (STKVAL*)get_arg(env, 0); + adjust_stack(env, 2); if (PROG_TRACE_ENGINE) - prog_trace(env, "ASGN %s %lu(%lu) %x", - storage_class_str(sc), - (unsigned long) frame, - (unsigned long) off, - (unsigned long) val); - *env_reference(env, sc, off, frame) = val; -} - -void -dump_asgn(prog_counter_t i) -{ - printf("%s %lu(%lu)", storage_class_str((storage_class_t)prog[i]), - (unsigned long) prog[i+1], (unsigned long) prog[i+2]); + prog_trace(env, "ASGN %p=%p", + dest, + val); + *dest = val; } void @@ -1341,36 +1377,6 @@ instr_svalidate(eval_environ_t env) } void -instr_arg(eval_environ_t env) -{ - size_t frame = (size_t) get_immediate(env, 0); - size_t n = (size_t) get_immediate(env, 1); - STKVAL val = *env_reference(env, storage_param, n, frame); - advance_pc(env, 2); - if (PROG_TRACE_ENGINE) - prog_trace(env, "ARG %lu(%lu) = %p", - (unsigned long) frame, - (unsigned long) n, - val); - push(env, val); -} - -void -instr_auto(eval_environ_t env) -{ - size_t frame = (size_t) get_immediate(env, 0); - size_t n = (size_t) get_immediate(env, 1); - STKVAL val = *env_reference(env, storage_auto, n, frame); - advance_pc(env, 2); - if (PROG_TRACE_ENGINE) - prog_trace(env, "AUTO %lu(%lu) = %p", - (unsigned long) frame, - (unsigned long) n, - val); - push(env, val); -} - -void instr_catch(eval_environ_t env) { long off = (long) get_immediate(env, 0); |