コード例 #1
0
ファイル: gen.c プロジェクト: martijnvandijke/Computation-2
static void prelabel(Node p) {
	if (p == NULL)
		return;
	prelabel(p->kids[0]);
	prelabel(p->kids[1]);
	if (NeedsReg[opindex(p->op)])
		setreg(p, (*IR->x.rmap)(opkind(p->op)));
	switch (generic(p->op)) {
	case ADDRF: case ADDRL:
		if (p->syms[0]->sclass == REGISTER)
			p->op = VREG+P;
		break;
	case INDIR:
		if (p->kids[0]->op == VREG+P)
			setreg(p, p->kids[0]->syms[0]);
		break;
	case ASGN:
		if (p->kids[0]->op == VREG+P)
			rtarget(p, 1, p->kids[0]->syms[0]);
		break;
	case CVI: case CVU: case CVP:
		if (optype(p->op) != F
		&&  opsize(p->op) <= p->syms[0]->u.c.v.i)
			p->op = LOAD + opkind(p->op);
		break;
	}
	(IR->x.target)(p);
}
コード例 #2
0
ファイル: dcpu16.i.c プロジェクト: DCPUTools/dcpu16-lcc
static void target(Node p)
{
    /*
     debug({
     fprintf(stderr, "target called on %x (%s)\n", p, opname(p->op));
     if (p->syms[RX])
     fprintf(stderr, "    sclass: %d, name: %s\n", p->syms[RX]->sclass, p->syms[RX]->name);
     if (p->kids[0]) {
     fprintf(stderr, "    %x (%s)\n", p->kids[0], opname(p->kids[0]->op));
     if (p->kids[0]->syms[RX])
     fprintf(stderr, "        sclass: %d, name: %s\n", p->kids[0]->syms[RX]->sclass, p->kids[0]->syms[RX]->name);
     }
     if (p->kids[1]) {
     fprintf(stderr, "    %x (%s)\n", p->kids[1], opname(p->kids[1]->op));
     if (p->kids[1]->syms[RX])
     fprintf(stderr, "        sclass: %d, name: %s\n", p->kids[1]->syms[RX]->sclass, p->kids[1]->syms[RX]->name);
     }
     });
     */
    assert(p);
    switch (specific(p->op))
    {
        case RET + F:
        case RET + I:
        case RET + U:
        case RET + P:
            rtarget(p, 0, reg[RGA]);
            break;
        case CALL + F:
        case CALL + I:
        case CALL + U:
        case CALL + P:
            setreg(p, reg[RGA]);
            break;
        case ARG + F:
        case ARG + I:
        case ARG + U:
        case ARG + P:
            switch (p->x.argno)
            {
                case 0:
                    debug(
                            fprintf(stderr, "target called on ARG with argno = %d, targetting A\n", p->x.argno));
                    spill(1 << RGA, IREG, p);
                    rtarget(p, 0, reg[RGA]);
                    break;
                case 1:
                    debug(
                            fprintf(stderr, "target called on ARG with argno = %d, targetting B\n", p->x.argno));
                    spill(1 << RGB, IREG, p);
                    rtarget(p, 0, reg[RGB]);
                    break;
                case 2:
                    debug(
                            fprintf(stderr, "target called on ARG with argno = %d, targetting C\n", p->x.argno));
                    spill(1 << RGC, IREG, p);
                    rtarget(p, 0, reg[RGC]);
                    break;
                default:
                    debug(
                            fprintf(stderr, "target called on ARG with argno = %d, skipping\n", p->x.argno));
            }
            break;
    }

    /*
     debug({
     fprintf(stderr, "target returning on %x (%s)\n", p, opname(p->op));
     if (p->syms[RX])
     fprintf(stderr, "    sclass: %d, name: %s\n", p->syms[RX]->sclass, p->syms[RX]->name);
     if (p->kids[0]) {
     fprintf(stderr, "    %x (%s)\n", p->kids[0], opname(p->kids[0]->op));
     if (p->kids[0]->syms[RX])
     fprintf(stderr, "        sclass: %d, name: %s\n", p->kids[0]->syms[RX]->sclass, p->kids[0]->syms[RX]->name);
     }
     if (p->kids[1]) {
     fprintf(stderr, "    %x (%s)\n", p->kids[1], opname(p->kids[1]->op));
     if (p->kids[1]->syms[RX])
     fprintf(stderr, "        sclass: %d, name: %s\n", p->kids[1]->syms[RX]->sclass, p->kids[1]->syms[RX]->name);
     }
     });
     */
}