small opt in push tracker
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40152
This commit is contained in:
		
							parent
							
								
									739bad1912
								
							
						
					
					
						commit
						4459591825
					
				@ -1624,12 +1624,12 @@ 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>*4	; we want the count in bytes not in cells
 | 
					 | 
				
			||||||
	//add [edx+pcur], 4
 | 
						//add [edx+pcur], 4
 | 
				
			||||||
 | 
						//mov [ecx], <val>*4	; we want the count in bytes not in cells
 | 
				
			||||||
	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*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));
 | 
				
			||||||
 | 
						IA32_Mov_Rm_Imm32(jit, AMX_REG_TMP, val*4, MOD_MEM_REG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Restore PRI & ALT */
 | 
						/* Restore PRI & ALT */
 | 
				
			||||||
	//pop edx
 | 
						//pop edx
 | 
				
			||||||
 | 
				
			|||||||
@ -520,8 +520,8 @@ void WriteIntrinsic_GenArray(JitWriter *jit)
 | 
				
			|||||||
	//jae :done				;end loop if done
 | 
						//jae :done				;end loop if done
 | 
				
			||||||
	//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 eax, 1			;increment
 | 
						//add eax, 1			;increment
 | 
				
			||||||
 | 
						//add edx, ecx			;add size (indirection vector)
 | 
				
			||||||
	//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_Reg_Rm(jit, REG_EDX, REG_ECX, MOD_REG);
 | 
					 | 
				
			||||||
	IA32_Add_Rm_Imm8(jit, REG_EAX, 1, MOD_REG);
 | 
						IA32_Add_Rm_Imm8(jit, REG_EAX, 1, MOD_REG);
 | 
				
			||||||
 | 
						IA32_Add_Reg_Rm(jit, REG_EDX, REG_ECX, 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -573,7 +573,7 @@ void WriteIntrinsic_GenArray(JitWriter *jit)
 | 
				
			|||||||
	//push edi					;push dim array
 | 
						//push edi					;push dim array
 | 
				
			||||||
	//push ebx
 | 
						//push ebx
 | 
				
			||||||
	//call GenerateArrayIndirectionVectors
 | 
						//call GenerateArrayIndirectionVectors
 | 
				
			||||||
	//add esp, 4*3
 | 
						//add esp, 4*4
 | 
				
			||||||
	IA32_Lea_Reg_DispRegMult(jit, REG_EBX, REG_EAX, REG_EBP, NOSCALE);
 | 
						IA32_Lea_Reg_DispRegMult(jit, REG_EBX, REG_EAX, REG_EBP, NOSCALE);
 | 
				
			||||||
	IA32_Push_Rm_Disp8_ESP(jit, 8);
 | 
						IA32_Push_Rm_Disp8_ESP(jit, 8);
 | 
				
			||||||
	IA32_Push_Rm_Disp8_ESP(jit, 8);
 | 
						IA32_Push_Rm_Disp8_ESP(jit, 8);
 | 
				
			||||||
@ -690,20 +690,18 @@ void WriteOp_Tracker_Push_Reg(JitWriter *jit, uint8_t reg)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	CompData *data = (CompData *)jit->data;
 | 
						CompData *data = (CompData *)jit->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//:TODO: optimize reg usage, i dont like it.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Save registers that may be damaged by the call */
 | 
						/* Save registers that may be damaged by the call */
 | 
				
			||||||
	//push eax
 | 
						//push eax
 | 
				
			||||||
	//push edx
 | 
					 | 
				
			||||||
	//push ecx
 | 
						//push ecx
 | 
				
			||||||
	//push <reg>
 | 
						//push edi
 | 
				
			||||||
 | 
						//lea edi, [<reg>*4]		; we want the count in bytes not in cells
 | 
				
			||||||
	IA32_Push_Reg(jit, AMX_REG_PRI);
 | 
						IA32_Push_Reg(jit, AMX_REG_PRI);
 | 
				
			||||||
	IA32_Push_Reg(jit, AMX_REG_ALT);
 | 
						if (reg == REG_ECX)
 | 
				
			||||||
	IA32_Push_Reg(jit, AMX_REG_TMP);
 | 
					 | 
				
			||||||
	if (reg != REG_ECX)
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		IA32_Push_Reg(jit, reg);
 | 
							IA32_Push_Reg(jit, AMX_REG_TMP);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						IA32_Push_Reg(jit, AMX_REG_STK);
 | 
				
			||||||
 | 
						IA32_Lea_Reg_RegMultImm32(jit, REG_EDI, reg, SCALE4, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get the context ptr, push it and call the check */
 | 
						/* Get the context ptr, push it and call the check */
 | 
				
			||||||
	//mov eax, [esi+context]
 | 
						//mov eax, [esi+context]
 | 
				
			||||||
@ -723,30 +721,24 @@ void WriteOp_Tracker_Push_Reg(JitWriter *jit, uint8_t reg)
 | 
				
			|||||||
	IA32_Jump_Cond_Imm32_Abs(jit, CC_NZ, data->jit_error_tracker_bounds);
 | 
						IA32_Jump_Cond_Imm32_Abs(jit, CC_NZ, data->jit_error_tracker_bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Push the register into the stack and increment pCur */
 | 
						/* Push the register into the stack and increment pCur */
 | 
				
			||||||
	//pop ecx
 | 
					 | 
				
			||||||
	//mov edx, [eax+vm[]]
 | 
						//mov edx, [eax+vm[]]
 | 
				
			||||||
	//mov eax, [edx+pcur]
 | 
						//mov eax, [edx+pcur]
 | 
				
			||||||
	//lea ecx, [ecx*4]	; we want the count in bytes not in cells
 | 
					 | 
				
			||||||
	//mov [eax], ecx
 | 
					 | 
				
			||||||
	//add [edx+pcur], 4
 | 
						//add [edx+pcur], 4
 | 
				
			||||||
	IA32_Pop_Reg(jit, REG_ECX);
 | 
						//mov [eax], edi
 | 
				
			||||||
	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, REG_EAX, REG_EDX, offsetof(tracker_t, pCur));
 | 
						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));
 | 
						IA32_Add_Rm_Imm8_Disp8(jit, REG_EDX, 4, offsetof(tracker_t, pCur));
 | 
				
			||||||
 | 
						IA32_Mov_Rm_Reg(jit, REG_EAX, REG_EDI, MOD_MEM_REG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Restore PRI, ALT and STK */
 | 
						/* Restore PRI, ALT and STK */
 | 
				
			||||||
 | 
						//pop edi
 | 
				
			||||||
	//pop ecx
 | 
						//pop ecx
 | 
				
			||||||
	//pop edx
 | 
					 | 
				
			||||||
	//pop eax
 | 
						//pop eax
 | 
				
			||||||
	if (reg != REG_ECX)
 | 
						IA32_Pop_Reg(jit, AMX_REG_STK);
 | 
				
			||||||
 | 
						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_TMP);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	IA32_Pop_Reg(jit, AMX_REG_PRI);
 | 
						IA32_Pop_Reg(jit, AMX_REG_PRI);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -274,8 +274,8 @@ typedef enum
 | 
				
			|||||||
*       DONE: SYSREQ.N .C (rev2)
 | 
					*       DONE: SYSREQ.N .C (rev2)
 | 
				
			||||||
*			  MACRO OPCODES (rev2)
 | 
					*			  MACRO OPCODES (rev2)
 | 
				
			||||||
*             ERROR CHECKS\{VERIFY ADDR} (rev2)
 | 
					*             ERROR CHECKS\{VERIFY ADDR} (rev2)
 | 
				
			||||||
*		TODO: BrkDebug
 | 
					 | 
				
			||||||
*			  ARRAY STUFF
 | 
					*			  ARRAY STUFF
 | 
				
			||||||
 | 
					*		TODO: BrkDebug
 | 
				
			||||||
*			  EXEC FUNCTION
 | 
					*			  EXEC FUNCTION
 | 
				
			||||||
*			  VERIFY ADDR
 | 
					*			  VERIFY ADDR
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user