#include "izt.h"
#include "gen.h"
+static void _setupPointer(REG *reg, asmop *into, int offset)
+{
+ iemit("; _setupPointer for %s", reg->name);
+}
+
+void izt_putAop(asmop *into, const char *sz, int size, int offset)
+{
+ wassert(offset == 0);
+
+ switch (into->type) {
+ case AOP_TYPE_REG:
+ iemit("mov %s,%s", into->u.reg->name, sz);
+ break;
+ case AOP_TYPE_CARRY:
+ // Should support.
+ wassert(0);
+ break;
+
+ case AOP_TYPE_SCRATCH_PTR:
+ _setupPointer(izt_port->scratch, into, offset);
+ iemit("mov a,%s", sz);
+ iemit("mov %s,a", izt_port->scratch->name);
+ break;
+
+ case AOP_TYPE_STACK:
+ iemit("mov a,%s", sz);
+ iemit("mov (%s+%d),a", izt_port->base_ptr->name, into->u.stack);
+ break;
+
+ case AOP_TYPE_LITERAL:
+ case AOP_TYPE_IMMEDIATE:
+ default:
+ wassert(0);
+ }
+}
+
+char *izt_getAop(asmop *from, int size, int offset)
+{
+ return "blah";
+}
+
+/** Perform a generic move operation.
+ */
+static void _mov(asmop *into, asmop *from)
+{
+ int size = into->size;
+ izt_putAop(into, izt_getAop(from, size, 0), size, 0);
+}
+
static void _genLabel(iCode *ic)
{
iemit("!tlabeldef", IC_LABEL(ic)->key + 100);
if (sym->stack) {
iemit("!enterx", sym->stack);
}
- else {
- iemit("!enter");
+ else
+ {
+ iemit ("!enter");
}
}
-static void _genReturn(iCode *ic)
+static void _genEndFunction(iCode *ic)
+{
+ // symbol *sym = OP_SYMBOL(IC_LEFT(ic));
+
+ /* PENDING: calleeSave */
+
+ iemit("!leave");
+ iemit("ret");
+}
+
+static void
+_genReturn (iCode * ic)
{
if (IC_LEFT(ic)) {
// Has a return value. Load it up.
- iemit("; PENDING: call the generic loader to setup the return value.");
+ izt_bindAop(IC_LEFT(ic), ic);
+ _mov(izt_getAopForReturn(AOP_SIZE(IC_LEFT(ic))), AOP(IC_LEFT(ic)));
}
- if (ic->next && ic->next->op == LABEL && IC_LABEL(ic->next) == returnLabel) {
- // The next label is the return label. Dont bother emitting a jump.
+ if (ic->next && ic->next->op == LABEL && IC_LABEL (ic->next) == returnLabel)
+ {
+ // The next label is the return label. Dont bother emitting a jump.
}
- else {
- iemit("jp !tlabel", returnLabel->key+100);
+ else
+ {
+ iemit ("jp !tlabel", returnLabel->key + 100);
}
}
{ GOTO, _genGoto },
{ FUNCTION, _genFunction },
{ RETURN, _genReturn },
+ { ENDFUNCTION, _genEndFunction },
{ 0, NULL }
};
-void izt_initBaseEmitters(hTab **into)
+void
+izt_initBaseEmitters (hTab ** into)
{
- izt_addEmittersToHTab(into, _base_emitters);
+ izt_addEmittersToHTab (into, _base_emitters);
}