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);
}