"RVM_MOD",
"RVM_MODS",
"RVM_BX",
+ "RVM_BXL",
"RVM_BL",
"RVM_B",
"RVM_STR",
{
rword pc = 0;
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
rword pc = 0;
if ((cpu->status & RVM_STATUS_Z)) {
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
}
rword pc = 0;
if ((cpu->status & RVM_STATUS_Z) == 0) {
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
}
rword pc = 0;
if ((cpu->status & RVM_STATUS_N) || (cpu->status & RVM_STATUS_Z)) {
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
}
rword pc = 0;
if ((cpu->status & RVM_STATUS_N) == 0 || (cpu->status & RVM_STATUS_Z) == 1){
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
}
rword pc = 0;
- if ((cpu->status & RVM_STATUS_N)){
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ if ((cpu->status & RVM_STATUS_N)) {
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
}
rword pc = 0;
if ((cpu->status & RVM_STATUS_N) == 0 && (cpu->status & RVM_STATUS_Z) == 0) {
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
}
}
+static void rvm_op_bxl(rvmcpu_t *cpu, rvm_asmins_t *ins)
+{
+ RVM_CPUREG_SETIP(cpu, LR, RVM_CPUREG_GETIP(cpu, PC));
+ RVM_CPUREG_SETIP(cpu, PC, RVM_CPUREG_GETIP(cpu, ins->op1));
+}
+
+
static void rvm_op_bl(rvmcpu_t *cpu, rvm_asmins_t *ins)
{
rword pc = 0;
- if (ins->op1 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op1);
- if (ins->op2 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op2);
- if (ins->op3 != XX)
- pc += RVM_CPUREG_GETU(cpu, ins->op3);
+// if (ins->op1 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op1);
+// if (ins->op2 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op2);
+// if (ins->op3 != XX)
+// pc += RVM_CPUREG_GETU(cpu, ins->op3);
+ pc += RVM_CPUREG_GETU(cpu, ins->op1);
RVM_CPUREG_SETIP(cpu, LR, RVM_CPUREG_GETIP(cpu, PC));
RVM_CPUREG_INCIP(cpu, PC, pc - 1);
}
RVM_CPUREG_SETIP(cpu, LR, RVM_CPUREG_GETIP(cpu, PC));
rvm_op_swiid(cpu, ins);
} else if (RVM_REG_GETTYPE(arg1) == RVM_DTYPE_FUNCTION) {
- rvm_op_bl(cpu, ins);
+ rvm_op_bxl(cpu, ins);
} else {
RVM_ABORT(cpu, RVM_E_NOTFUNCTION);
}
rvm_op_mod, // RVM_MOD
rvm_op_mods, // RVM_MODS
rvm_op_bx, // RVM_BX
+ rvm_op_bxl, // RVM_BXL
rvm_op_bl, // RVM_BL
rvm_op_b, // RVM_B
rvm_op_str, // RVM_STR
rvm_funcall_t *funcall = r_array_empty(co->funcall) ? NULL : (rvm_funcall_t *) r_array_slot(co->funcall, r_array_length(co->funcall) - 1);
rvm_codegen_addins(co->cg, rvm_asm(RVM_SUB, FP, SP, DA, funcall->params));
- rvm_codegen_addins(co->cg, rvm_asm(RVM_CALL, R0, DA, XX, -rvm_codegen_getcodesize(co->cg)));
+ rvm_codegen_addins(co->cg, rvm_asm(RVM_CALL, R0, XX, XX, 0));
rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, SP, FP, XX, 0));
rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BITS(TP,LR)));
r_array_removelast(co->funcall);
rvm_codegen_addins(co->cg, rvm_asm(RVM_B, DA, XX, XX, 0)); /* Will be re-written later */
rvm_codegen_addins(co->cg, rvm_asm(RVM_ADD, SP, FP, DA, 0)); /* Will be re-written later */
rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xffffffff));
- rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xffffffff));
- rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xffffffff));
r_array_push(co->fp, 0, rword);
r_array_add(co->fundecl, &fundecl);
} else {
rvm_codegen_replaceins(co->cg, fundecl->codestart + 0, rvm_asmp(RVM_MOV, R1, DA, XX, fname->data.ptr));
}
- rvm_codegen_replaceins(co->cg, fundecl->codestart + 1, rvm_asm(RVM_MOV, R0, DA, XX, fundecl->codestart + 5));
+ rvm_codegen_replaceins(co->cg, fundecl->codestart + 1, rvm_asm(RVM_ADD, R0, PC, DA, sizeof(rvm_asmins_t) * 3));
rvm_codegen_replaceins(co->cg, fundecl->codestart + 2, rvm_asm(RVM_SETTYPE, R0, DA, XX, RVM_DTYPE_FUNCTION));
rvm_codegen_replaceins(co->cg, fundecl->codestart + 3, rvm_asm(RVM_STRR, R0, R1, XX, 0));
rvm_codegen_replaceins(co->cg, fundecl->codestart + 4, rvm_asm(RVM_B, DA, XX, XX, fundecl->codesize - 4));