shrec/x86: SIMPLELINK implementation for cross checking

This commit is contained in:
Stefanos Kornilios Mitsis Poiitidis 2015-08-10 04:57:00 +02:00
parent a0175c8011
commit 89b9687628
1 changed files with 65 additions and 1 deletions

View File

@ -438,7 +438,70 @@ u32 DynaRBI::Relink()
x86e->x86_size=512;
x86e->do_realloc=false;
if (BlockType==BET_StaticCall || BlockType==BET_DynamicCall)
//#define SIMPLELINK
#ifdef SIMPLELINK
switch (BlockType) {
case BET_StaticJump:
case BET_StaticCall:
//next_pc = block->BranchBlock;
x86e->Emit(op_mov32, ECX, BranchBlock);
break;
case BET_Cond_0:
case BET_Cond_1:
{
//next_pc = next_pc_value;
//if (*jdyn == 0)
//next_pc = branch_pc_value;
x86e->Emit(op_mov32, ECX, NextBlock);
u32* ptr = &sr.T;
if (has_jcond)
ptr = &Sh4cntx.jdyn;
x86e->Emit(op_cmp32, ptr, BlockType & 1);
x86_Label* lbl = x86e->CreateLabel(false, 8);
x86e->Emit(op_jne, lbl);
x86e->Emit(op_mov32, ECX, BranchBlock);
x86e->MarkLabel(lbl);
}
break;
case BET_DynamicJump:
case BET_DynamicCall:
case BET_DynamicRet:
//next_pc = *jdyn;
x86e->Emit(op_mov32, ECX, &Sh4cntx.jdyn);
break;
case BET_DynamicIntr:
case BET_StaticIntr:
if (BlockType == BET_StaticIntr)
{
x86e->Emit(op_mov32, &next_pc, NextBlock);
}
else
{
x86e->Emit(op_mov32, EAX, GetRegPtr(reg_pc_dyn));
x86e->Emit(op_mov32, &next_pc, EAX);
}
x86e->Emit(op_call, x86_ptr_imm(UpdateINTC));
x86e->Emit(op_mov32, ECX, &next_pc);
break;
default:
die("Invalid block end type");
}
x86e->Emit(op_jmp, x86_ptr_imm(loop_no_update));
#else
if (BlockType == BET_StaticCall || BlockType == BET_DynamicCall)
{
//csc_push(this);
}
@ -532,6 +595,7 @@ u32 DynaRBI::Relink()
break;
}
#endif