aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2007-03-28 17:48:38 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2007-03-28 17:48:38 +0000
commit229bd5f50d69a07deaa4b7943bd713b1e69d1bbe (patch)
tree2c01c41b169ddd8281ed402a8df6f98f8bf4cf36
parenta6b819c584aed7f769c96544ca963e86314acbd9 (diff)
downloadmailfromd-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.c74
-rw-r--r--src/opcodes14
-rw-r--r--src/prog.c148
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
diff --git a/src/prog.c b/src/prog.c
index 310a92a4..f8fc20c7 100644
--- a/src/prog.c
+++ b/src/prog.c
@@ -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);

Return to:

Send suggestions and report system problems to the System administrator.