sourcepawn/vm/jit/x86/opcode_helpers.cpp
changeset 97 684e06b004f8
parent 93 b00ab8fec541
child 98 a98cd5307c13
     1.1 --- a/sourcepawn/vm/jit/x86/opcode_helpers.cpp	Thu Sep 28 15:11:41 2006 +0000
     1.2 +++ b/sourcepawn/vm/jit/x86/opcode_helpers.cpp	Thu Sep 28 19:33:58 2006 +0000
     1.3 @@ -20,6 +20,7 @@
     1.4  	 * This is because we do not support resuming or sleeping!
     1.5  	 */
     1.6  
     1.7 +	//:TODO: FIX THIS FOR THE EBP AND EDI SWITCHING
     1.8  	//push ebp
     1.9  	//mov ebp, esp
    1.10  	IA32_Push_Reg(jit, REG_EBP);
    1.11 @@ -141,7 +142,7 @@
    1.12  	//jnz :nocall
    1.13  	IA32_Push_Reg(jit, AMX_REG_TMP);
    1.14  	IA32_Mov_Reg_Rm_Disp8(jit, AMX_REG_TMP, AMX_REG_INFO, AMX_INFO_CONTEXT);
    1.15 -	IA32_Cmp_Rm_Imm32_Disp8(jit, AMX_REG_TMP, offsetof(sp_context_t, dbreak), 0);
    1.16 +	IA32_Cmp_Rm_Disp8_Imm8(jit, AMX_REG_TMP, offsetof(sp_context_t, dbreak), 0);
    1.17  	jitoffs_t jmp = IA32_Jump_Cond_Imm8(jit, CC_NZ, 0);
    1.18  
    1.19  	//pushad
    1.20 @@ -153,7 +154,7 @@
    1.21  	//call ecx
    1.22  	//add esp, 8
    1.23  	//popad
    1.24 -	IA32_Push_Rm_Disp8(jit, AMX_REG_INFO, AMX_INFO_FRAME);
    1.25 +	IA32_Push_Rm_Disp8(jit, AMX_REG_INFO, AMX_INFO_FRAME); //:TODO: move to regs and push? and dont disp for 0
    1.26  	IA32_Push_Rm_Disp8(jit, AMX_REG_TMP, offsetof(sp_context_t, context));
    1.27  	IA32_Mov_Reg_Rm_Disp8(jit, AMX_REG_TMP, AMX_REG_TMP, offsetof(sp_context_t, dbreak));
    1.28  	IA32_Call_Reg(jit, AMX_REG_TMP);
    1.29 @@ -180,14 +181,12 @@
    1.30  
    1.31  void Write_Check_DivZero(JitWriter *jit, jit_uint8_t reg)
    1.32  {
    1.33 -	CompData *data = (CompData *)jit->data;
    1.34 -
    1.35  	//test reg, reg
    1.36  	//jnz :continue
    1.37  	//divzero: (write error)
    1.38  	IA32_Test_Rm_Reg(jit, reg, reg, MOD_REG);
    1.39  	jitoffs_t jmp = IA32_Jump_Cond_Imm8(jit, CC_NZ, 0);
    1.40 -	if (!(data->inline_level & JIT_INLINE_ERRORCHECKS))
    1.41 +	if (!(((CompData *)jit->data)->inline_level & JIT_INLINE_ERRORCHECKS))
    1.42  	{
    1.43  		//sub esp, 4    - correct stack for returning to non-inlined JIT
    1.44  		IA32_Sub_Rm_Imm8(jit, REG_ESP, 4, MOD_REG);
    1.45 @@ -197,7 +196,7 @@
    1.46  	IA32_Send_Jump8_Here(jit, jmp);
    1.47  
    1.48  }
    1.49 -
    1.50 +//:TODO: FIX THIS FOR NEW EBP STUFF
    1.51  void Write_Check_VerifyAddr(JitWriter *jit, jit_uint8_t reg, bool firstcall)
    1.52  {
    1.53  	CompData *data = (CompData *)jit->data;
    1.54 @@ -283,10 +282,10 @@
    1.55  			//cmp eax, ecx
    1.56  			//jg :err_bounds
    1.57  			//ret
    1.58 -			IA32_Cmp_Rm_Imm32(jit, MOD_REG, AMX_REG_PRI, 0);//:TODO: use imm8
    1.59 +			IA32_Cmp_Rm_Imm8(jit, MOD_REG, AMX_REG_PRI, 0);
    1.60  			jitoffs_t jmp1 = IA32_Jump_Cond_Imm8(jit, CC_L, 0);
    1.61  			//:TODO: make sure this is right order
    1.62 -			IA32_Cmp_Rm_Reg(jit, AMX_REG_PRI, AMX_REG_TMP, MOD_REG);
    1.63 +			IA32_Cmp_Reg_Rm(jit, AMX_REG_PRI, AMX_REG_TMP, MOD_REG);
    1.64  			jitoffs_t jmp2 = IA32_Jump_Cond_Imm8(jit, CC_G, 0);
    1.65  			IA32_Return(jit);
    1.66  			IA32_Send_Jump8_Here(jit, jmp1);
    1.67 @@ -296,11 +295,15 @@
    1.68  	} else {
    1.69  		//cmp eax, 0
    1.70  		//jl :err_bounds
    1.71 -		IA32_Cmp_Rm_Imm32(jit, MOD_REG, AMX_REG_PRI, 0);//:TODO: use imm8
    1.72 +		IA32_Cmp_Rm_Imm8(jit, MOD_REG, AMX_REG_PRI, 0);
    1.73  		jitoffs_t jmp1 = IA32_Jump_Cond_Imm8(jit, CC_L, 0);
    1.74  		//cmp eax, <val>
    1.75  		//jg :err_bounds
    1.76 -		IA32_Cmp_Rm_Imm32(jit, MOD_REG, AMX_REG_PRI, jit->read_cell());//:TODO:check val size and use cmp eax or imm8
    1.77 +		cell_t val = jit->read_cell();
    1.78 +		if (val < SCHAR_MAX && val > SCHAR_MIN)
    1.79 +			IA32_Cmp_Rm_Imm8(jit, MOD_REG, AMX_REG_PRI, (jit_int8_t)val);
    1.80 +		else
    1.81 +			IA32_Cmp_Eax_Imm32(jit, val);
    1.82  		jitoffs_t jmp2 = IA32_Jump_Cond_Imm8(jit, CC_G, 0);
    1.83  		//jmp :continue
    1.84  		jitoffs_t cont = IA32_Jump_Imm8(jit, 0);
    1.85 @@ -331,13 +334,13 @@
    1.86  		IA32_Mov_Reg_Rm_Disp8(jit, AMX_REG_TMP, AMX_REG_INFO, AMX_INFO_HEAP);
    1.87  		IA32_Cmp_Reg_Rm_Disp8(jit, AMX_REG_TMP, AMX_REG_INFO, AMX_INFO_HEAPLOW);
    1.88  		jitoffs_t hm = IA32_Jump_Cond_Imm8(jit, CC_L, 0);
    1.89 -		//lea ecx, [edi+ecx+STACK_MARGIN]
    1.90 -		//cmp ecx, ebp
    1.91 +		//lea ecx, [ebp+ecx+STACK_MARGIN]
    1.92 +		//cmp ecx, edi
    1.93  		// jg :error_heaplow
    1.94  		//OR
    1.95  		// ret
    1.96  		IA32_Lea_Reg_DispRegMultImm8(jit, AMX_REG_TMP, AMX_REG_DAT, AMX_REG_TMP, NOSCALE, STACK_MARGIN);
    1.97 -		IA32_Cmp_Rm_Reg(jit, REG_ECX, AMX_REG_STK, MOD_REG);
    1.98 +		IA32_Cmp_Reg_Rm(jit, AMX_REG_TMP, AMX_REG_STK, MOD_REG);
    1.99  		jitoffs_t hl = IA32_Jump_Cond_Imm8(jit, CC_G, 0);
   1.100  		jitoffs_t cont;
   1.101  		if (always_inline)
   1.102 @@ -364,7 +367,7 @@
   1.103  {
   1.104  	/* this is small, so we always inline it.
   1.105  	*/
   1.106 -	//cmp ebp, [esi+stp]
   1.107 +	//cmp edi, [esi+stp]
   1.108  	//jle :continue
   1.109  	IA32_Cmp_Reg_Rm_Disp8(jit, AMX_REG_STK, AMX_REG_INFO, AMX_INFO_STACKTOP);
   1.110  	jitoffs_t jmp = IA32_Jump_Cond_Imm8(jit, CC_LE, 0);
   1.111 @@ -381,17 +384,17 @@
   1.112  void Macro_PushN_Addr(JitWriter *jit, int i)
   1.113  {
   1.114  	//push eax
   1.115 -	//mov eax, frm
   1.116 +	//mov eax, [esi+frm]
   1.117  	//loop i times:
   1.118  	// lea ecx, [eax+<val>]
   1.119 -	// mov [ebp-4*i], ecx
   1.120 -	//sub ebp, 4*N
   1.121 +	// mov [edi-4*i], ecx
   1.122 +	//sub edi, 4*N
   1.123  	//pop eax
   1.124  
   1.125  	cell_t val;
   1.126  	int n = 1;
   1.127  	IA32_Push_Reg(jit, AMX_REG_PRI);
   1.128 -	IA32_Mov_Reg_Rm(jit, AMX_REG_PRI, AMX_INFO_FRM, MOD_MEM_REG);
   1.129 +	IA32_Mov_Reg_Rm(jit, AMX_REG_PRI, AMX_REG_INFO, MOD_MEM_REG);
   1.130  	do
   1.131  	{
   1.132  		val = jit->read_cell();
   1.133 @@ -409,8 +412,8 @@
   1.134  {
   1.135  	//loop i times:
   1.136  	// mov ecx, [ebx+<val>]
   1.137 -	// mov [ebp-4*i], ecx
   1.138 -	//sub ebp, 4*N
   1.139 +	// mov [edi-4*i], ecx
   1.140 +	//sub edi, 4*N
   1.141  
   1.142  	cell_t val;
   1.143  	int n = 1;
   1.144 @@ -429,8 +432,8 @@
   1.145  void Macro_PushN_C(JitWriter *jit, int i)
   1.146  {
   1.147  	//loop i times:
   1.148 -	// mov [ebp-4*i], <val>
   1.149 -	//sub ebp, 4*N
   1.150 +	// mov [edi-4*i], <val>
   1.151 +	//sub edi, 4*N
   1.152  
   1.153  	int n = 1;
   1.154  	do 
   1.155 @@ -443,9 +446,9 @@
   1.156  void Macro_PushN(JitWriter *jit, int i)
   1.157  {
   1.158  	//loop i times:
   1.159 -	// mov ecx, [edi+<val>]
   1.160 -	// mov [ebp-4*i], ecx
   1.161 -	//sub ebp, 4*N
   1.162 +	// mov ecx, [ebp+<val>]
   1.163 +	// mov [edi-4*i], ecx
   1.164 +	//sub edi, 4*N
   1.165  
   1.166  	cell_t val;
   1.167  	int n = 1;