Exemple #1
0
Fichier : vm.c Projet : rjeli/vm
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;
	}
}
Exemple #2
0
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);
        }
    }
}