sourcepawn/vm/jit/x86/jit_x86.cpp
changeset 72 e240c6d92972
parent 71 5435331cdd79
child 73 9d08f3f63830
     1.1 --- a/sourcepawn/vm/jit/x86/jit_x86.cpp	Wed Sep 20 03:56:24 2006 +0000
     1.2 +++ b/sourcepawn/vm/jit/x86/jit_x86.cpp	Wed Sep 20 04:14:53 2006 +0000
     1.3 @@ -963,6 +963,46 @@
     1.4  	IA32_Mov_Reg_Rm_Disp_Reg(jit, AMX_REG_PRI, AMX_REG_DAT, AMX_REG_TMP, NOSCALE);
     1.5  }
     1.6  
     1.7 +inline void WriteOp_Load_Both(JitWriter *jit)
     1.8 +{
     1.9 +	WriteOp_Const_Pri(jit);
    1.10 +	WriteOp_Const_Alt(jit);
    1.11 +}
    1.12 +
    1.13 +inline void WriteOp_Load_S_Both(JitWriter *jit)
    1.14 +{
    1.15 +	WriteOp_Load_S_Pri(jit);
    1.16 +	WriteOp_Load_S_Alt(jit);
    1.17 +}
    1.18 +
    1.19 +inline void WriteOp_Const(JitWriter *jit)
    1.20 +{
    1.21 +	//mov [edi+<addr>], <val>
    1.22 +	cell_t addr = jit->read_cell();
    1.23 +	cell_t val = jit->read_cell();
    1.24 +	if (addr < SCHAR_MAX && addr > SCHAR_MIN)
    1.25 +	{
    1.26 +		IA32_Mov_Rm_Imm32_Disp8(jit, AMX_REG_DAT, val, (jit_int8_t)addr);
    1.27 +	} else {
    1.28 +		IA32_Mov_Rm_Imm32_Disp32(jit, AMX_REG_DAT, val, addr);
    1.29 +	}
    1.30 +}
    1.31 +
    1.32 +inline void WriteOp_Const_S(JitWriter *jit)
    1.33 +{
    1.34 +	//mov [ebx+<offs>], <val>
    1.35 +	cell_t offs = jit->read_cell();
    1.36 +	cell_t val = jit->read_cell();
    1.37 +
    1.38 +	if (offs < SCHAR_MAX && offs > SCHAR_MIN)
    1.39 +	{
    1.40 +		IA32_Mov_Rm_Imm32_Disp8(jit, AMX_REG_FRM, val, (jit_int8_t)offs);
    1.41 +	} else {
    1.42 +		IA32_Mov_Rm_Imm32_Disp32(jit, AMX_REG_FRM, val, offs);
    1.43 +	}
    1.44 +}
    1.45 +
    1.46 +
    1.47  /*************************************************
    1.48   *************************************************
    1.49   * JIT PROPER ************************************
    1.50 @@ -1591,10 +1631,31 @@
    1.51  				WriteOp_Push_Alt(jit);
    1.52  				break;
    1.53  			}
    1.54 +		case OP_LOAD_BOTH:
    1.55 +			{
    1.56 +				WriteOp_Load_Both(jit);
    1.57 +				break;
    1.58 +			}
    1.59 +		case OP_LOAD_S_BOTH:
    1.60 +			{
    1.61 +				WriteOp_Load_S_Both(jit);
    1.62 +				break;
    1.63 +			}
    1.64 +		case OP_CONST:
    1.65 +			{
    1.66 +				WriteOp_Const(jit);
    1.67 +				break;
    1.68 +			}
    1.69 +		case OP_CONST_S:
    1.70 +			{
    1.71 +				WriteOp_Const_S(jit);
    1.72 +				break;
    1.73 +			}
    1.74  		default:
    1.75  			{
    1.76 -				/* :TODO: error! */
    1.77 -				break;
    1.78 +				AbortCompilation(co);
    1.79 +				*err = SP_ERR_INVALID_INSTRUCTION;
    1.80 +				return NULL;
    1.81  			}
    1.82  		}
    1.83  	}