added tracker push helper

dyn arrays are working now

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40139
This commit is contained in:
Borja Ferrer 2006-11-04 18:30:20 +00:00
parent f95dd901ca
commit 0ece7914b7
3 changed files with 88 additions and 17 deletions

View File

@ -1003,11 +1003,11 @@ inline void WriteOp_GenArray(JitWriter *jit, bool autozero)
IA32_Mov_Rm_Reg(jit, AMX_REG_STK, AMX_REG_ALT, MOD_MEM_REG); IA32_Mov_Rm_Reg(jit, AMX_REG_STK, AMX_REG_ALT, MOD_MEM_REG);
IA32_Lea_Reg_DispRegMult(jit, AMX_REG_ALT, AMX_REG_ALT, AMX_REG_TMP, SCALE4); IA32_Lea_Reg_DispRegMult(jit, AMX_REG_ALT, AMX_REG_ALT, AMX_REG_TMP, SCALE4);
IA32_Mov_Rm_Reg_Disp8(jit, AMX_REG_INFO, AMX_REG_ALT, AMX_INFO_HEAP); IA32_Mov_Rm_Reg_Disp8(jit, AMX_REG_INFO, AMX_REG_ALT, AMX_INFO_HEAP);
IA32_Add_Rm_Reg(jit, AMX_REG_ALT, AMX_REG_DAT, MOD_REG); IA32_Add_Reg_Rm(jit, AMX_REG_ALT, AMX_REG_DAT, MOD_REG);
IA32_Cmp_Rm_Reg(jit, AMX_REG_ALT, AMX_REG_STK, MOD_REG); IA32_Cmp_Reg_Rm(jit, AMX_REG_ALT, AMX_REG_STK, MOD_REG);
IA32_Jump_Cond_Imm32_Abs(jit, CC_AE, ((CompData *)jit->data)->jit_error_heaplow); IA32_Jump_Cond_Imm32_Abs(jit, CC_AE, ((CompData *)jit->data)->jit_error_heaplow);
/* :TODO: PUSH ECX ONTO TRACKER */ WriteOp_Tracker_Push_Reg(jit, REG_ECX);
if (autozero) if (autozero)
{ {
@ -1024,8 +1024,8 @@ inline void WriteOp_GenArray(JitWriter *jit, bool autozero)
IA32_Push_Reg(jit, REG_EAX); IA32_Push_Reg(jit, REG_EAX);
IA32_Push_Reg(jit, REG_EDI); IA32_Push_Reg(jit, REG_EDI);
IA32_Xor_Reg_Rm(jit, REG_EAX, REG_EAX, MOD_REG); IA32_Xor_Reg_Rm(jit, REG_EAX, REG_EAX, MOD_REG);
IA32_Mov_Reg_Rm(jit, REG_EDI, REG_EDI, MOD_REG); IA32_Mov_Reg_Rm(jit, REG_EDI, REG_EDI, MOD_MEM_REG);
IA32_Add_Rm_Reg(jit, REG_EDI, REG_EBP, MOD_REG); IA32_Add_Reg_Rm(jit, REG_EDI, REG_EBP, MOD_REG);
IA32_Cld(jit); IA32_Cld(jit);
IA32_Rep(jit); IA32_Rep(jit);
IA32_Stosd(jit); IA32_Stosd(jit);
@ -1624,11 +1624,11 @@ inline void WriteOp_Tracker_Push_C(JitWriter *jit)
/* Push the value into the stack and increment pCur */ /* Push the value into the stack and increment pCur */
//mov edx, [eax+vm[]] //mov edx, [eax+vm[]]
//mov ecx, [edx+pcur] //mov ecx, [edx+pcur]
//mov [ecx], <val> //mov [ecx], <val>*4 ; we want the count in bytes not in cells
//add [edx+pcur], 4 //add [edx+pcur], 4
IA32_Mov_Reg_Rm_Disp8(jit, REG_EDX, REG_EAX, offsetof(sp_context_t, vm[JITVARS_TRACKER])); IA32_Mov_Reg_Rm_Disp8(jit, REG_EDX, REG_EAX, offsetof(sp_context_t, vm[JITVARS_TRACKER]));
IA32_Mov_Reg_Rm_Disp8(jit, AMX_REG_TMP, REG_EDX, offsetof(tracker_t, pCur)); IA32_Mov_Reg_Rm_Disp8(jit, AMX_REG_TMP, REG_EDX, offsetof(tracker_t, pCur));
IA32_Mov_Rm_Imm32(jit, AMX_REG_TMP, val, MOD_MEM_REG); IA32_Mov_Rm_Imm32(jit, AMX_REG_TMP, val*4, MOD_MEM_REG);
IA32_Add_Rm_Imm8_Disp8(jit, REG_EDX, 4, offsetof(tracker_t, pCur)); IA32_Add_Rm_Imm8_Disp8(jit, REG_EDX, 4, offsetof(tracker_t, pCur));
/* Restore PRI & ALT */ /* Restore PRI & ALT */
@ -1677,6 +1677,8 @@ inline void WriteOp_Tracker_Pop_SetHeap(JitWriter *jit)
IA32_Mov_Reg_Rm(jit, AMX_REG_TMP, AMX_REG_TMP, MOD_MEM_REG); IA32_Mov_Reg_Rm(jit, AMX_REG_TMP, AMX_REG_TMP, MOD_MEM_REG);
IA32_Sub_Rm_Reg_Disp8(jit, AMX_REG_INFO, AMX_REG_TMP, AMX_INFO_HEAP); IA32_Sub_Rm_Reg_Disp8(jit, AMX_REG_INFO, AMX_REG_TMP, AMX_INFO_HEAP);
Write_CheckHeap_Min(jit);
/* Restore PRI & ALT */ /* Restore PRI & ALT */
//pop edx //pop edx
//pop eax //pop eax
@ -2038,7 +2040,7 @@ jit_rewind:
ctx->vm[JITVARS_TRACKER] = trk; ctx->vm[JITVARS_TRACKER] = trk;
trk->pBase = (ucell_t *)malloc(1024); trk->pBase = (ucell_t *)malloc(1024);
trk->pCur = trk->pBase; trk->pCur = trk->pBase;
trk->size = 1024; trk->size = 1024 / sizeof(cell_t);
/* clean up relocation+compilation memory */ /* clean up relocation+compilation memory */
AbortCompilation(co); AbortCompilation(co);

View File

@ -107,7 +107,7 @@ jitoffs_t Write_Execute_Function(JitWriter *jit)
IA32_Sub_Reg_Rm(jit, REG_EDI, REG_EBP, MOD_REG); IA32_Sub_Reg_Rm(jit, REG_EDI, REG_EBP, MOD_REG);
IA32_Mov_Reg_Rm_Disp8(jit, REG_EDX, REG_ESI, AMX_INFO_HEAP); IA32_Mov_Reg_Rm_Disp8(jit, REG_EDX, REG_ESI, AMX_INFO_HEAP);
IA32_Mov_Rm_Reg_Disp8(jit, REG_ECX, REG_EDI, offsetof(sp_context_t, sp)); IA32_Mov_Rm_Reg_Disp8(jit, REG_ECX, REG_EDI, offsetof(sp_context_t, sp));
IA32_Mov_Rm_Reg(jit, REG_ECX, REG_EDX, MOD_REG); IA32_Mov_Rm_Reg_Disp8(jit, REG_ECX, REG_EDX, offsetof(sp_context_t, hp));
//add esp, 4*NUM_INFO_PARAMS //add esp, 4*NUM_INFO_PARAMS
//pop ebx //pop ebx
@ -521,7 +521,7 @@ void WriteIntrinsic_GenArray(JitWriter *jit)
//mov ecx, [edi+eax*4] ;get dimension size //mov ecx, [edi+eax*4] ;get dimension size
//imul edx, ecx ;multiply by size //imul edx, ecx ;multiply by size
//add edx, ecx ;add size (indirection vector) //add edx, ecx ;add size (indirection vector)
//inc eax ;increment //add eax, 1 ;increment
//jmp :loop ;jump back //jmp :loop ;jump back
//:done //:done
IA32_Mov_Reg_Rm(jit, REG_EDX, AMX_REG_STK, MOD_MEM_REG); IA32_Mov_Reg_Rm(jit, REG_EDX, AMX_REG_STK, MOD_MEM_REG);
@ -531,8 +531,8 @@ void WriteIntrinsic_GenArray(JitWriter *jit)
jitoffs_t done1 = IA32_Jump_Cond_Imm8(jit, CC_AE, 0); jitoffs_t done1 = IA32_Jump_Cond_Imm8(jit, CC_AE, 0);
IA32_Mov_Reg_Rm_Disp_Reg(jit, REG_ECX, AMX_REG_STK, REG_EAX, SCALE4); IA32_Mov_Reg_Rm_Disp_Reg(jit, REG_ECX, AMX_REG_STK, REG_EAX, SCALE4);
IA32_IMul_Reg_Rm(jit, REG_EDX, REG_ECX, MOD_REG); IA32_IMul_Reg_Rm(jit, REG_EDX, REG_ECX, MOD_REG);
IA32_Add_Rm_Reg(jit, REG_EDX, REG_ECX, MOD_REG); IA32_Add_Reg_Rm(jit, REG_EDX, REG_ECX, MOD_REG);
IA32_Inc_Reg(jit, REG_EAX); IA32_Add_Rm_Imm8(jit, REG_EAX, 1, MOD_REG);
IA32_Write_Jump8(jit, IA32_Jump_Imm8(jit, loop1), loop1); IA32_Write_Jump8(jit, IA32_Jump_Imm8(jit, loop1), loop1);
IA32_Send_Jump8_Here(jit, done1); IA32_Send_Jump8_Here(jit, done1);
@ -548,7 +548,7 @@ void WriteIntrinsic_GenArray(JitWriter *jit)
IA32_Lea_Reg_DispRegMult(jit, REG_EAX, REG_EAX, REG_EDX, SCALE4); IA32_Lea_Reg_DispRegMult(jit, REG_EAX, REG_EAX, REG_EDX, SCALE4);
IA32_Cmp_Rm_Imm32(jit, MOD_REG, REG_EAX, ((CompData *)jit->data)->plugin->data_size); IA32_Cmp_Rm_Imm32(jit, MOD_REG, REG_EAX, ((CompData *)jit->data)->plugin->data_size);
IA32_Jump_Cond_Imm32_Abs(jit, CC_BE, ((CompData *)jit->data)->jit_error_array_too_big); IA32_Jump_Cond_Imm32_Abs(jit, CC_BE, ((CompData *)jit->data)->jit_error_array_too_big);
IA32_Add_Rm_Reg(jit, REG_EAX, AMX_REG_DAT, MOD_REG); IA32_Add_Reg_Rm(jit, REG_EAX, AMX_REG_DAT, MOD_REG);
IA32_Cmp_Reg_Rm(jit, REG_EAX, AMX_REG_STK, MOD_REG); IA32_Cmp_Reg_Rm(jit, REG_EAX, AMX_REG_STK, MOD_REG);
IA32_Jump_Cond_Imm32_Abs(jit, CC_AE, ((CompData *)jit->data)->jit_error_array_too_big); IA32_Jump_Cond_Imm32_Abs(jit, CC_AE, ((CompData *)jit->data)->jit_error_array_too_big);
@ -562,7 +562,7 @@ void WriteIntrinsic_GenArray(JitWriter *jit)
IA32_Mov_Rm_Reg_Disp8(jit, AMX_REG_INFO, REG_EBX, AMX_INFO_HEAP); IA32_Mov_Rm_Reg_Disp8(jit, AMX_REG_INFO, REG_EBX, AMX_INFO_HEAP);
IA32_Push_Reg(jit, REG_EAX); IA32_Push_Reg(jit, REG_EAX);
/* :TODO: Push EDX into tracker */ WriteOp_Tracker_Push_Reg(jit, REG_EDX);
/* This part is too messy to do in straight assembly. /* This part is too messy to do in straight assembly.
* I'm letting the compiler handle it and thus it's in C. * I'm letting the compiler handle it and thus it's in C.
@ -686,6 +686,70 @@ void WriteOp_Sysreq_N_Function(JitWriter *jit)
IA32_Return(jit); IA32_Return(jit);
} }
void WriteOp_Tracker_Push_Reg(JitWriter *jit, uint8_t reg)
{
CompData *data = (CompData *)jit->data;
//:TODO: optimize reg usage, i dont like it.
/* Save registers that may be damaged by the call */
//push eax
//push edx
//push ecx
//push <reg>
IA32_Push_Reg(jit, AMX_REG_PRI);
IA32_Push_Reg(jit, AMX_REG_ALT);
IA32_Push_Reg(jit, AMX_REG_TMP);
if (reg != REG_ECX)
{
IA32_Push_Reg(jit, reg);
}
/* Get the context ptr, push it and call the check */
//mov eax, [esi+context]
//push eax
//call JIT_VerifyOrAllocateTracker
IA32_Mov_Reg_Rm_Disp8(jit, REG_EAX, AMX_REG_INFO, AMX_INFO_CONTEXT);
IA32_Push_Reg(jit, REG_EAX);
jitoffs_t call = IA32_Call_Imm32(jit, 0);
IA32_Write_Jump32_Abs(jit, call, JIT_VerifyOrAllocateTracker);
/* Check for errors */
//pop eax
//cmp [eax+err], 0
//jnz :error
IA32_Pop_Reg(jit, REG_EAX);
IA32_Cmp_Rm_Disp8_Imm8(jit, REG_EAX, offsetof(sp_context_t, err), 0);
IA32_Jump_Cond_Imm32_Abs(jit, CC_NZ, data->jit_error_tracker_bounds);
/* Push the register into the stack and increment pCur */
//pop ecx
//mov edx, [eax+vm[]]
//mov eax, [edx+pcur]
//lea ecx, [ecx*4] ; we want the count in bytes not in cells
//mov [eax], ecx
//add [edx+pcur], 4
IA32_Pop_Reg(jit, REG_ECX);
IA32_Mov_Reg_Rm_Disp8(jit, REG_EDX, REG_EAX, offsetof(sp_context_t, vm[JITVARS_TRACKER]));
IA32_Mov_Reg_Rm_Disp8(jit, REG_EAX, REG_EDX, offsetof(tracker_t, pCur));
IA32_Lea_Reg_RegMultImm32(jit, REG_ECX, REG_ECX, SCALE4, 0);
IA32_Mov_Rm_Reg(jit, REG_EAX, REG_ECX, MOD_MEM_REG);
IA32_Add_Rm_Imm8_Disp8(jit, REG_EDX, 4, offsetof(tracker_t, pCur));
/* Restore PRI, ALT and STK */
//pop ecx
//pop edx
//pop eax
if (reg != REG_ECX)
{
IA32_Pop_Reg(jit, AMX_REG_ALT);
} else {
IA32_Shr_Rm_Imm8(jit, REG_ECX, 2, MOD_REG);
}
IA32_Pop_Reg(jit, AMX_REG_TMP);
IA32_Pop_Reg(jit, AMX_REG_PRI);
}
void JIT_VerifyOrAllocateTracker(sp_context_t *ctx) void JIT_VerifyOrAllocateTracker(sp_context_t *ctx)
{ {
tracker_t *trk = (tracker_t *)(ctx->vm[JITVARS_TRACKER]); tracker_t *trk = (tracker_t *)(ctx->vm[JITVARS_TRACKER]);
@ -700,7 +764,7 @@ void JIT_VerifyOrAllocateTracker(sp_context_t *ctx)
{ {
size_t disp = trk->size - 1; size_t disp = trk->size - 1;
trk->size *= 2; trk->size *= 2;
trk->pBase = (ucell_t *)realloc(trk->pBase, trk->size); trk->pBase = (ucell_t *)realloc(trk->pBase, trk->size * sizeof(cell_t));
if (!trk->pBase) if (!trk->pBase)
{ {

View File

@ -72,6 +72,11 @@ void Macro_PushN(JitWriter *jit, int i);
void JIT_VerifyLowBoundTracker(sp_context_t *ctx); void JIT_VerifyLowBoundTracker(sp_context_t *ctx);
void JIT_VerifyOrAllocateTracker(sp_context_t *ctx); void JIT_VerifyOrAllocateTracker(sp_context_t *ctx);
/**
* Writes the push into tracker function.
*/
void WriteOp_Tracker_Push_Reg(JitWriter *jit, uint8_t reg);
/** /**
* Legend for Statuses: * Legend for Statuses:
* ****** *** ******** * ****** *** ********
@ -252,7 +257,7 @@ typedef enum
OP_SYSREQ_ND, // !GEN UNSUPPORT OP_SYSREQ_ND, // !GEN UNSUPPORT
/* ----- */ /* ----- */
OP_TRACKER_PUSH_C, //DONE OP_TRACKER_PUSH_C, //DONE
OP_TRACKER_POP_SETHEAP, //DONE OP_TRACKER_POP_SETHEAP, //VERIFIED
OP_GENARRAY, //VERIFIED OP_GENARRAY, //VERIFIED
OP_GENARRAY_Z, //-VERIFIED (not tested for 1D arrays) OP_GENARRAY_Z, //-VERIFIED (not tested for 1D arrays)
/* ----- */ /* ----- */
@ -262,8 +267,8 @@ typedef enum
/* /*
* :TODO: List of ASM Opts * :TODO: List of ASM Opts
* from jit_x86.cpp * from jit_x86.cpp
* TODO: all new array opcodes (4 ATM)
* DONE: Rest of opcodes including the SYSREQ.N inlined version (rev2) * DONE: Rest of opcodes including the SYSREQ.N inlined version (rev2)
* Including genarray and the 2 tracker ones
* DONE: ALL ungen opcodes (rev1) * DONE: ALL ungen opcodes (rev1)
* from opcode_helpers.cpp * from opcode_helpers.cpp
* DONE: SYSREQ.N .C (rev2) * DONE: SYSREQ.N .C (rev2)