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 }