void lil_print_instruction()

in vm/vmcore/src/lil/lil.cpp [2183:2399]


void lil_print_instruction(FILE* out, LilInstruction* i)
{
    assert(i);
    switch (i->tag) {
    case LIT_Label:
        fprintf(out, ":%s", i->u.label.l);
        break;
    case LIT_Locals:
        fprintf(out, "locals %d", i->u.locals);
        break;
    case LIT_StdPlaces:
        fprintf(out, "std_places %d", i->u.std_places);
        break;
    case LIT_Alloc:
        fprintf(out, "alloc ");
        lil_print_variable(out, &i->u.alloc.dst);
        fprintf(out, ",0x%x", i->u.alloc.num_bytes);
        break;
    case LIT_Asgn:
        lil_print_variable(out, &(i->u.asgn.dst));
        fprintf(out, "=");
        switch (i->u.asgn.op) {
        case LO_Mov:
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Add:
            lil_print_operand(out, &(i->u.asgn.o1));
            fprintf(out, "+");
            lil_print_operand(out, &(i->u.asgn.o2));
            break;
        case LO_Sub:
            lil_print_operand(out, &(i->u.asgn.o1));
            fprintf(out, "-");
            lil_print_operand(out, &(i->u.asgn.o2));
            break;
        case LO_SgMul:
            lil_print_operand(out, &(i->u.asgn.o1));
            fprintf(out, "*");
            lil_print_operand(out, &(i->u.asgn.o2));
            break;
        case LO_Shl:
            lil_print_operand(out, &(i->u.asgn.o1));
            fprintf(out, "<<");
            lil_print_operand(out, &(i->u.asgn.o2));
            break;
        case LO_And:
            lil_print_operand(out, &(i->u.asgn.o1));
            fprintf(out, "&");
            lil_print_operand(out, &(i->u.asgn.o2));
            break;
        case LO_Neg:
            fprintf(out, "-");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Not:
            fprintf(out, "not ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Sx1:
            fprintf(out, "sx1 ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Sx2:
            fprintf(out, "sx2 ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Sx4:
            fprintf(out, "sx4 ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Zx1:
            fprintf(out, "zx1 ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Zx2:
            fprintf(out, "zx2 ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        case LO_Zx4:
            fprintf(out, "zx4 ");
            lil_print_operand(out, &(i->u.asgn.o1));
            break;
        default: DIE(("Unknown operation"));
        }
        break;
    case LIT_Ts:
        lil_print_variable(out, &i->u.ts);
        fprintf(out, "=ts");
        break;
    case LIT_Handles:
        fprintf(out, "handles=");
        lil_print_operand(out, &i->u.handles);
        break;
    case LIT_Ld:
        fprintf(out, "ld ");
        lil_print_variable(out, &(i->u.ldst.operand.val.var));
        fprintf(out, ",");
        lil_print_address(out, i);
        if (i->u.ldst.extend==LLX_Sign) fprintf(out, ",sx");
        if (i->u.ldst.extend==LLX_Zero) fprintf(out, ",zx");
        break;
    case LIT_St:
        fprintf(out, "st ");
        lil_print_address(out, i);
        fprintf(out, ",");
        lil_print_operand(out, &(i->u.ldst.operand));
        break;
    case LIT_Inc:
        fprintf(out, "inc ");
        lil_print_address(out, i);
        break;
    case LIT_Cas:
        fprintf(out, "cas ");
        lil_print_address(out, i);
        fprintf(out, "=");
        lil_print_operand(out, &(i->u.ldst.compare));
        fprintf(out, ",");
        lil_print_operand(out, &(i->u.ldst.operand));
        fprintf(out, ",%s", i->u.ldst.l);
        break;
    case LIT_J:
        fprintf(out, "j %s", i->u.j);
        break;
    case LIT_Jc:
        fprintf(out, "jc ");
        switch (i->u.jc.c.tag) {
        case LP_IsZero:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, "=0");
            break;
        case LP_IsNonzero:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, "!=0");
            break;
        case LP_Eq:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, "=");
            lil_print_operand(out, &(i->u.jc.c.o2));
            break;
        case LP_Ne:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, "!=");
            lil_print_operand(out, &(i->u.jc.c.o2));
            break;
        case LP_Le:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, "<=");
            lil_print_operand(out, &(i->u.jc.c.o2));
            break;
        case LP_Lt:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, "<");
            lil_print_operand(out, &(i->u.jc.c.o2));
            break;
        case LP_Ule:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, " <=u ");
            lil_print_operand(out, &(i->u.jc.c.o2));
            break;
        case LP_Ult:
            lil_print_operand(out, &(i->u.jc.c.o1));
            fprintf(out, " <u ");
            lil_print_operand(out, &(i->u.jc.c.o2));
            break;
        default: DIE(("Unknown predicate"));
        }
        fprintf(out, ",%s", i->u.jc.l);
        break;
    case LIT_Out:
        fprintf(out, "out ");
        lil_print_sig(out, &(i->u.out));
        break;
    case LIT_In2Out:
        fprintf(out, "in2out ");
        lil_print_cc(out, i->u.out.cc);
        fprintf(out, ":");
        lil_print_type(out, i->u.out.ret_type);
        break;
    case LIT_Call:
        switch (i->u.call.k) {
        case LCK_Call:
            fprintf(out, "call ");
            break;
        case LCK_CallNoRet:
            fprintf(out, "call.noret ");
            break;
        case LCK_TailCall:
            fprintf(out, "tailcall ");
            break;
        default: DIE(("Unknown call kind"));
        }
        lil_print_operand(out, &(i->u.call.target));
        break;
    case LIT_Ret:
        fprintf(out, "ret");
        break;
    case LIT_PushM2N:
        fprintf(out, "push_m2n %p, frame_type= %p", i->u.push_m2n.method, i->u.push_m2n.current_frame_type);
        if (i->u.push_m2n.handles) fprintf(out, ",handles");
        break;
    case LIT_M2NSaveAll:
        fprintf(out, "m2n_save_all");
        break;
    case LIT_PopM2N:
        fprintf(out, "pop_m2n");
        break;
    case LIT_Print:
        fprintf(out, "print %p, ", i->u.print.str);
        lil_print_operand(out, &i->u.print.arg);
        fprintf(out, "\n");
        break;
    default:
        DIE(("Unknown instruction tag"));
    };
    fprintf(out, ";\n");
    fflush(out);
}