void dump_bytecode(struct fn_node root) { struct fn_node *current = &root; int i; uint16_t ins; uint16_t args[3]; while(current != NULL) { printf("-- FUNCTION %d --\n", current->id); for(i = 0; i < current->ins_len; i++) { ins = current->code[i * 4]; memcpy(args, current->code + i * 4 + 1, sizeof(uint16_t) * 3); printf("%2d: ", i); switch(ins) { case BC_RET: printf("ret\n"); break; case BC_LOAD_CONSTANT: printf("load_constant: %s %d\n", reg_to_str(args[0]), args[1]); break; case BC_PRINT_NUM: printf("print_num: %s\n", reg_to_str(args[0])); break; case BC_CALL: printf("call: %d\n", args[0]); break; case BC_LOCAL_JMP: printf("local_jmp: %d\n", args[0]); break; case BC_LOCAL_JE: printf("local_je: %d\n", args[0]); break; case BC_LOCAL_JNE: printf("local_jne: %d\n", args[0]); break; case BC_REL_JMP: printf("rel_jmp: %d\n", args[0]); break; case BC_REL_JE: printf("rel_je: %d\n", args[0]); break; case BC_REL_JNE: printf("rel_jne: %d\n", args[0]); break; case BC_CMP: printf("cmp: %s %s\n", reg_to_str(args[0]), reg_to_str(args[1])); break; case BC_PRINT_STR: printf("_print_str: %d\n", args[0]); break; default: printf("(dump unimplemented for %d)\n", ins); break; } } current = current->next; } }
void dump_registers(void) { char *str, *imm_str; for (ui32 i = 0; i < REGISTER_COUNT; ++i) { if (i >= F0 && i <= F3) { printf("%s: %f\n", reg_to_str(i), *((float*)registers + i)); } else { imm_str = imm_to_str(registers[i], "%d"); str = str_cat(3, reg_to_str(i), ": ", imm_str); puts(str); free(str); free(imm_str); } } }