Author: zoltan
Date: 2008-02-14 12:24:55 -0500 (Thu, 14 Feb 2008)
New Revision: 95663
Modified:
trunk/mono/mono/mini/ChangeLog
trunk/mono/mono/mini/mini-ops.h
trunk/mono/mono/mini/mini-x86.c
Log:
2008-02-14 Zoltan Varga <[EMAIL PROTECTED]>
* mini-x86.c: Sync with the version on the linear IR branch by adding
new
opcodes and other small changes.
* mini-ops.h: Add some new opcodes from the linear IR branch.
Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog 2008-02-14 17:24:02 UTC (rev 95662)
+++ trunk/mono/mono/mini/ChangeLog 2008-02-14 17:24:55 UTC (rev 95663)
@@ -1,5 +1,10 @@
2008-02-14 Zoltan Varga <[EMAIL PROTECTED]>
+ * mini-x86.c: Sync with the version on the linear IR branch by adding
new
+ opcodes and other small changes.
+
+ * mini-ops.h: Add some new opcodes from the linear IR branch.
+
* mini-ops.h: Get rid of the OP_X86_..._MEMBASE opcodes.
* mini-x86.c inssel-x86.brg cpu-x86.md: Get rid of the confusing
_MEMBASE
Modified: trunk/mono/mono/mini/mini-ops.h
===================================================================
--- trunk/mono/mono/mini/mini-ops.h 2008-02-14 17:24:02 UTC (rev 95662)
+++ trunk/mono/mono/mini/mini-ops.h 2008-02-14 17:24:55 UTC (rev 95663)
@@ -119,6 +119,7 @@
MINI_OP(OP_LOADI4_MEM, "loadi4_mem")
MINI_OP(OP_LOADU1_MEM, "loadu1_mem")
MINI_OP(OP_LOADU2_MEM, "loadu2_mem")
+MINI_OP(OP_STORE_MEM_IMM, "store_mem_imm")
MINI_OP(OP_LOADR8_SPILL_MEMBASE,"loadr8_spill_membase")
MINI_OP(OP_LOADU4_MEM,"loadu4_mem")
@@ -601,7 +602,8 @@
MINI_OP(OP_X86_FP_LOAD_I4, "x86_fp_load_i4")
MINI_OP(OP_X86_SETEQ_MEMBASE, "x86_seteq_membase")
MINI_OP(OP_X86_SETNE_MEMBASE, "x86_setne_membase")
-MINI_OP(OP_X86_OUTARG_ALIGN_STACK, "x86_outarg_align_stack")
+MINI_OP(OP_X86_OUTARG_ALIGN_STACK, "x86_outarg_align_stack")
+MINI_OP(OP_X86_FXCH, "x86_fxch")
#endif
#if defined(__x86_64__)
Modified: trunk/mono/mono/mini/mini-x86.c
===================================================================
--- trunk/mono/mono/mini/mini-x86.c 2008-02-14 17:24:02 UTC (rev 95662)
+++ trunk/mono/mono/mini/mini-x86.c 2008-02-14 17:24:55 UTC (rev 95663)
@@ -494,9 +494,9 @@
for (k = 0; k < param_count; k++) {
- if (csig->pinvoke)
+ if (csig->pinvoke) {
size = mono_type_native_stack_size (csig->params [k],
&align);
- else {
+ } else {
int ialign;
size = mini_type_stack_size (NULL, csig->params [k],
&ialign);
align = ialign;
@@ -2163,10 +2163,24 @@
case OP_STOREI4_MEMBASE_REG:
x86_mov_membase_reg (code, ins->inst_destbasereg,
ins->inst_offset, ins->sreg1, 4);
break;
+ case OP_STORE_MEM_IMM:
+ x86_mov_mem_imm (code, ins->inst_p0, ins->inst_c0, 4);
+ break;
case OP_LOADU4_MEM:
x86_mov_reg_imm (code, ins->dreg, ins->inst_p0);
x86_mov_reg_membase (code, ins->dreg, ins->dreg, 0, 4);
break;
+ case OP_LOAD_MEM:
+ case OP_LOADI4_MEM:
+ /* These are created by the cprop pass so they use
inst_imm as the source */
+ x86_mov_reg_mem (code, ins->dreg, ins->inst_imm, 4);
+ break;
+ case OP_LOADU1_MEM:
+ x86_widen_mem (code, ins->dreg, ins->inst_imm, FALSE,
FALSE);
+ break;
+ case OP_LOADU2_MEM:
+ x86_widen_mem (code, ins->dreg, ins->inst_imm, FALSE,
TRUE);
+ break;
case OP_LOAD_MEMBASE:
case OP_LOADI4_MEMBASE:
case OP_LOADU4_MEMBASE:
@@ -2199,9 +2213,11 @@
x86_widen_reg (code, ins->dreg, ins->sreg1, FALSE,
TRUE);
break;
case OP_COMPARE:
+ case OP_ICOMPARE:
x86_alu_reg_reg (code, X86_CMP, ins->sreg1, ins->sreg2);
break;
case OP_COMPARE_IMM:
+ case OP_ICOMPARE_IMM:
x86_alu_reg_imm (code, X86_CMP, ins->sreg1,
ins->inst_imm);
break;
case OP_X86_COMPARE_MEMBASE_REG:
@@ -2243,6 +2259,21 @@
case OP_X86_XOR_MEMBASE_IMM:
x86_alu_membase_imm (code, X86_XOR, ins->inst_basereg,
ins->inst_offset, ins->inst_imm);
break;
+ case OP_X86_ADD_MEMBASE_REG:
+ x86_alu_membase_reg (code, X86_ADD, ins->inst_basereg,
ins->inst_offset, ins->sreg2);
+ break;
+ case OP_X86_SUB_MEMBASE_REG:
+ x86_alu_membase_reg (code, X86_SUB, ins->inst_basereg,
ins->inst_offset, ins->sreg2);
+ break;
+ case OP_X86_AND_MEMBASE_REG:
+ x86_alu_membase_reg (code, X86_AND, ins->inst_basereg,
ins->inst_offset, ins->sreg2);
+ break;
+ case OP_X86_OR_MEMBASE_REG:
+ x86_alu_membase_reg (code, X86_OR, ins->inst_basereg,
ins->inst_offset, ins->sreg2);
+ break;
+ case OP_X86_XOR_MEMBASE_REG:
+ x86_alu_membase_reg (code, X86_XOR, ins->inst_basereg,
ins->inst_offset, ins->sreg2);
+ break;
case OP_X86_INC_MEMBASE:
x86_inc_membase (code, ins->inst_basereg,
ins->inst_offset);
break;
@@ -2258,41 +2289,65 @@
case OP_X86_MUL_REG_MEMBASE:
x86_imul_reg_membase (code, ins->sreg1, ins->sreg2,
ins->inst_offset);
break;
+ case OP_X86_AND_REG_MEMBASE:
+ x86_alu_reg_membase (code, X86_AND, ins->sreg1,
ins->sreg2, ins->inst_offset);
+ break;
+ case OP_X86_OR_REG_MEMBASE:
+ x86_alu_reg_membase (code, X86_OR, ins->sreg1,
ins->sreg2, ins->inst_offset);
+ break;
+ case OP_X86_XOR_REG_MEMBASE:
+ x86_alu_reg_membase (code, X86_XOR, ins->sreg1,
ins->sreg2, ins->inst_offset);
+ break;
case OP_BREAK:
x86_breakpoint (code);
break;
+ case OP_NOP:
+ case OP_DUMMY_USE:
+ case OP_DUMMY_STORE:
+ case OP_NOT_REACHED:
+ case OP_NOT_NULL:
+ break;
case OP_ADDCC:
+ case OP_IADDCC:
case OP_IADD:
x86_alu_reg_reg (code, X86_ADD, ins->sreg1, ins->sreg2);
break;
case OP_ADC:
+ case OP_IADC:
x86_alu_reg_reg (code, X86_ADC, ins->sreg1, ins->sreg2);
break;
case OP_ADDCC_IMM:
case OP_ADD_IMM:
+ case OP_IADD_IMM:
x86_alu_reg_imm (code, X86_ADD, ins->dreg,
ins->inst_imm);
break;
case OP_ADC_IMM:
+ case OP_IADC_IMM:
x86_alu_reg_imm (code, X86_ADC, ins->dreg,
ins->inst_imm);
break;
case OP_SUBCC:
+ case OP_ISUBCC:
case OP_ISUB:
x86_alu_reg_reg (code, X86_SUB, ins->sreg1, ins->sreg2);
break;
case OP_SBB:
+ case OP_ISBB:
x86_alu_reg_reg (code, X86_SBB, ins->sreg1, ins->sreg2);
break;
case OP_SUBCC_IMM:
case OP_SUB_IMM:
+ case OP_ISUB_IMM:
x86_alu_reg_imm (code, X86_SUB, ins->dreg,
ins->inst_imm);
break;
case OP_SBB_IMM:
+ case OP_ISBB_IMM:
x86_alu_reg_imm (code, X86_SBB, ins->dreg,
ins->inst_imm);
break;
case OP_IAND:
x86_alu_reg_reg (code, X86_AND, ins->sreg1, ins->sreg2);
break;
case OP_AND_IMM:
+ case OP_IAND_IMM:
x86_alu_reg_imm (code, X86_AND, ins->sreg1,
ins->inst_imm);
break;
case OP_IDIV:
@@ -2338,12 +2393,14 @@
x86_alu_reg_reg (code, X86_OR, ins->sreg1, ins->sreg2);
break;
case OP_OR_IMM:
+ case OP_IOR_IMM:
x86_alu_reg_imm (code, X86_OR, ins->sreg1,
ins->inst_imm);
break;
case OP_IXOR:
x86_alu_reg_reg (code, X86_XOR, ins->sreg1, ins->sreg2);
break;
case OP_XOR_IMM:
+ case OP_IXOR_IMM:
x86_alu_reg_imm (code, X86_XOR, ins->sreg1,
ins->inst_imm);
break;
case OP_ISHL:
@@ -2355,9 +2412,11 @@
x86_shift_reg (code, X86_SAR, ins->dreg);
break;
case OP_SHR_IMM:
+ case OP_ISHR_IMM:
x86_shift_reg_imm (code, X86_SAR, ins->dreg,
ins->inst_imm);
break;
case OP_SHR_UN_IMM:
+ case OP_ISHR_UN_IMM:
x86_shift_reg_imm (code, X86_SHR, ins->dreg,
ins->inst_imm);
break;
case OP_ISHR_UN:
@@ -2365,6 +2424,7 @@
x86_shift_reg (code, X86_SHR, ins->dreg);
break;
case OP_SHL_IMM:
+ case OP_ISHL_IMM:
x86_shift_reg_imm (code, X86_SHL, ins->dreg,
ins->inst_imm);
break;
case OP_LSHL: {
@@ -2459,6 +2519,7 @@
x86_imul_reg_reg (code, ins->sreg1, ins->sreg2);
break;
case OP_MUL_IMM:
+ case OP_IMUL_IMM:
switch (ins->inst_imm) {
case 2:
/* MOV r1, r2 */
@@ -2750,6 +2811,23 @@
code = mono_emit_stack_alloc (code, ins);
x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4);
break;
+ case OP_LOCALLOC_IMM: {
+ guint32 size = ins->inst_imm;
+ size = (size + (MONO_ARCH_FRAME_ALIGNMENT - 1)) & ~
(MONO_ARCH_FRAME_ALIGNMENT - 1);
+
+ if (ins->flags & MONO_INST_INIT) {
+ /* FIXME: Optimize this */
+ x86_mov_reg_imm (code, ins->dreg, size);
+ ins->sreg1 = ins->dreg;
+
+ code = mono_emit_stack_alloc (code, ins);
+ x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4);
+ } else {
+ x86_alu_reg_imm (code, X86_SUB, X86_ESP, size);
+ x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4);
+ }
+ break;
+ }
case OP_THROW: {
x86_push_reg (code, ins->sreg1);
code = emit_call (cfg, code,
MONO_PATCH_INFO_INTERNAL_METHOD,
@@ -2829,6 +2907,11 @@
case OP_CGT:
case OP_CGT_UN:
case OP_CNE:
+ case OP_ICEQ:
+ case OP_ICLT:
+ case OP_ICLT_UN:
+ case OP_ICGT:
+ case OP_ICGT_UN:
x86_set_reg (code, cc_table [mono_opcode_to_cond
(ins->opcode)], ins->dreg, cc_signed_table [mono_opcode_to_cond (ins->opcode)]);
x86_widen_reg (code, ins->dreg, ins->dreg, FALSE,
FALSE);
break;
@@ -2842,6 +2925,16 @@
case OP_COND_EXC_GE_UN:
case OP_COND_EXC_LE:
case OP_COND_EXC_LE_UN:
+ case OP_COND_EXC_IEQ:
+ case OP_COND_EXC_INE_UN:
+ case OP_COND_EXC_ILT:
+ case OP_COND_EXC_ILT_UN:
+ case OP_COND_EXC_IGT:
+ case OP_COND_EXC_IGT_UN:
+ case OP_COND_EXC_IGE:
+ case OP_COND_EXC_IGE_UN:
+ case OP_COND_EXC_ILE:
+ case OP_COND_EXC_ILE_UN:
EMIT_COND_SYSTEM_EXCEPTION (cc_table
[mono_opcode_to_cond (ins->opcode)], cc_signed_table [mono_opcode_to_cond
(ins->opcode)], ins->inst_p1);
break;
case OP_COND_EXC_OV:
@@ -2850,6 +2943,12 @@
case OP_COND_EXC_NC:
EMIT_COND_SYSTEM_EXCEPTION (branch_cc_table
[ins->opcode - OP_COND_EXC_EQ], (ins->opcode < OP_COND_EXC_NE_UN),
ins->inst_p1);
break;
+ case OP_COND_EXC_IOV:
+ case OP_COND_EXC_INO:
+ case OP_COND_EXC_IC:
+ case OP_COND_EXC_INC:
+ EMIT_COND_SYSTEM_EXCEPTION (branch_cc_table
[ins->opcode - OP_COND_EXC_IEQ], (ins->opcode < OP_COND_EXC_INE_UN),
ins->inst_p1);
+ break;
case OP_IBEQ:
case OP_IBNE_UN:
case OP_IBLT:
@@ -2929,12 +3028,21 @@
x86_fild_membase (code, X86_ESP, 0, FALSE);
x86_alu_reg_imm (code, X86_ADD, X86_ESP, 4);
break;
+ case OP_ICONV_TO_R_UN:
+ x86_push_imm (code, 0);
+ x86_push_reg (code, ins->sreg1);
+ x86_fild_membase (code, X86_ESP, 0, TRUE);
+ x86_alu_reg_imm (code, X86_ADD, X86_ESP, 8);
+ break;
case OP_X86_FP_LOAD_I8:
x86_fild_membase (code, ins->inst_basereg,
ins->inst_offset, TRUE);
break;
case OP_X86_FP_LOAD_I4:
x86_fild_membase (code, ins->inst_basereg,
ins->inst_offset, FALSE);
break;
+ case OP_FCONV_TO_R4:
+ /* FIXME: nothing to do ?? */
+ break;
case OP_FCONV_TO_I1:
code = emit_float_to_int (cfg, code, ins->dreg, 1,
TRUE);
break;
@@ -3037,6 +3145,9 @@
x86_mov_reg_reg (code, ins->dreg, ins->sreg1,
4);
break;
}
+ case OP_FMOVE:
+ /* Not needed on the fp stack */
+ break;
case OP_FADD:
x86_fp_op_reg (code, X86_FADD, 1, TRUE);
break;
@@ -3111,7 +3222,10 @@
break;
case OP_X86_FPOP:
x86_fstp (code, 0);
- break;
+ break;
+ case OP_X86_FXCH:
+ x86_fxch (code, ins->inst_imm);
+ break;
case OP_FREM: {
guint8 *l1, *l2;
@@ -3616,7 +3730,7 @@
int alloc_size, pos, max_offset, i;
guint8 *code;
- cfg->code_size = MAX (mono_method_get_header (method)->code_size * 4,
1024);
+ cfg->code_size = MAX (mono_method_get_header (method)->code_size * 4,
10240);
if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
cfg->code_size += 512;
@@ -3817,6 +3931,8 @@
cfg->code_len = code - cfg->native_code;
+ g_assert (cfg->code_len < cfg->code_size);
+
return code;
}
@@ -4416,6 +4532,9 @@
else if ((code [0] >= 0x58) && (code [0] <= 0x58 + X86_NREG) && (code
[1] == 0x81))
/* pop <REG>; add <OFFSET>, <REG> */
return 3;
+ else if ((code [0] >= 0xb8) && (code [0] < 0xb8 + 8))
+ /* mov <REG>, imm */
+ return 1;
else {
g_assert_not_reached ();
return -1;
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches