Author: zoltan
Date: 2008-02-05 14:26:45 -0500 (Tue, 05 Feb 2008)
New Revision: 94930
Modified:
branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.c
branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.h
branches/vargaz/mini-linear-il/mono/mono/mini/mini.c
Log:
2008-02-05 Zoltan Varga <[EMAIL PROTECTED]>
* mini.c (mono_normalize_opcodes): New pass to get rid of CEE_ opcodes.
* mini-amd64.c mini-amd64.c: Get rid of CEE_ opcodes.
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog 2008-02-05
19:26:18 UTC (rev 94929)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog 2008-02-05
19:26:45 UTC (rev 94930)
@@ -1,5 +1,9 @@
2008-02-05 Zoltan Varga <[EMAIL PROTECTED]>
+ * mini.c (mono_normalize_opcodes): New pass to get rid of CEE_ opcodes.
+
+ * mini-amd64.c mini-amd64.c: Get rid of CEE_ opcodes.
+
* cpu-amd64.md: Fix x86_mul_membase.
* inssel.brg: Pass OP_CALL to backends instead of CEE_CALL.
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.c 2008-02-05
19:26:18 UTC (rev 94929)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.c 2008-02-05
19:26:45 UTC (rev 94930)
@@ -1973,11 +1973,9 @@
*/
ins->opcode = OP_X86_LEA_MEMBASE;
ins->inst_basereg = ins->sreg1;
- /* Fall through */
}
- else
- break;
- case CEE_XOR:
+ break;
+ case OP_LXOR:
if ((ins->sreg1 == ins->sreg2) && (ins->sreg1 ==
ins->dreg)) {
MonoInst *ins2;
@@ -2156,8 +2154,6 @@
}
}
break;
- case CEE_CONV_I4:
- case CEE_CONV_U4:
case OP_MOVE:
case OP_FMOVE:
/*
@@ -2220,7 +2216,6 @@
}
else
break;
- case CEE_XOR:
case OP_LXOR:
if ((ins->sreg1 == ins->sreg2) && (ins->sreg1 ==
ins->dreg)) {
MonoInst *ins2;
@@ -2383,7 +2378,7 @@
if (last_ins && (last_ins->opcode ==
OP_STOREI1_MEMBASE_REG) &&
ins->inst_basereg ==
last_ins->inst_destbasereg &&
ins->inst_offset ==
last_ins->inst_offset) {
- ins->opcode = (ins->opcode ==
OP_LOADI1_MEMBASE) ? CEE_CONV_I1 : CEE_CONV_U1;
+ ins->opcode = (ins->opcode ==
OP_LOADI1_MEMBASE) ? OP_LCONV_TO_I1 : OP_LCONV_TO_U1;
ins->sreg1 = last_ins->sreg1;
}
break;
@@ -2399,12 +2394,10 @@
if (last_ins && (last_ins->opcode ==
OP_STOREI2_MEMBASE_REG) &&
ins->inst_basereg ==
last_ins->inst_destbasereg &&
ins->inst_offset ==
last_ins->inst_offset) {
- ins->opcode = (ins->opcode ==
OP_LOADI2_MEMBASE) ? CEE_CONV_I2 : CEE_CONV_U2;
+ ins->opcode = (ins->opcode ==
OP_LOADI2_MEMBASE) ? OP_LCONV_TO_I2 : OP_LCONV_TO_U2;
ins->sreg1 = last_ins->sreg1;
}
break;
- case CEE_CONV_I4:
- case CEE_CONV_U4:
case OP_MOVE:
case OP_FMOVE:
/*
@@ -2690,7 +2683,6 @@
/* Move return value to the target register */
/* FIXME: do this in the local reg allocator */
switch (ins->opcode) {
- case CEE_CALL:
case OP_CALL:
case OP_CALL_REG:
case OP_CALL_MEMBASE:
@@ -3045,38 +3037,30 @@
case OP_AMD64_LOADI8_MEMINDEX:
amd64_mov_reg_memindex_size (code, ins->dreg,
ins->inst_basereg, 0, ins->inst_indexreg, 0, 8);
break;
- case CEE_CONV_I1:
case OP_LCONV_TO_I1:
case OP_ICONV_TO_I1:
case OP_SEXT_I1:
amd64_widen_reg (code, ins->dreg, ins->sreg1, TRUE,
FALSE);
break;
- case CEE_CONV_I2:
case OP_LCONV_TO_I2:
case OP_ICONV_TO_I2:
case OP_SEXT_I2:
amd64_widen_reg (code, ins->dreg, ins->sreg1, TRUE,
TRUE);
break;
- case CEE_CONV_U1:
case OP_LCONV_TO_U1:
case OP_ICONV_TO_U1:
amd64_widen_reg (code, ins->dreg, ins->sreg1, FALSE,
FALSE);
break;
- case CEE_CONV_U2:
case OP_LCONV_TO_U2:
case OP_ICONV_TO_U2:
amd64_widen_reg (code, ins->dreg, ins->sreg1, FALSE,
TRUE);
break;
- case CEE_CONV_U8:
- case CEE_CONV_U:
- /* Clean out the upper word */
- amd64_mov_reg_reg_size (code, ins->dreg, ins->sreg1, 4);
- break;
- case CEE_CONV_I8:
- case CEE_CONV_I:
case OP_SEXT_I4:
amd64_movsxd_reg_reg (code, ins->dreg, ins->sreg1);
- break;
+ break;
+ case OP_ZEXT_I4:
+ amd64_mov_reg_reg_size (code, ins->dreg, ins->sreg1, 4);
+ break;
case OP_COMPARE:
case OP_LCOMPARE:
amd64_alu_reg_reg (code, X86_CMP, ins->sreg1,
ins->sreg2);
@@ -3255,7 +3239,6 @@
case OP_NOT_NULL:
break;
case OP_ADDCC:
- case CEE_ADD:
case OP_LADD:
amd64_alu_reg_reg (code, X86_ADD, ins->sreg1,
ins->sreg2);
break;
@@ -3272,7 +3255,6 @@
amd64_alu_reg_imm (code, X86_ADC, ins->dreg,
ins->inst_imm);
break;
case OP_SUBCC:
- case CEE_SUB:
case OP_LSUB:
amd64_alu_reg_reg (code, X86_SUB, ins->sreg1,
ins->sreg2);
break;
@@ -3289,7 +3271,6 @@
amd64_alu_reg_imm (code, X86_SBB, ins->dreg,
ins->inst_imm);
break;
- case CEE_MUL:
case OP_LMUL:
amd64_imul_reg_reg (code, ins->sreg1, ins->sreg2);
break;
@@ -3356,9 +3337,7 @@
}
break;
}
- case CEE_DIV:
case OP_LDIV:
- case CEE_REM:
case OP_LREM:
/* Regalloc magic makes the div/rem cases the same */
if (ins->sreg2 == AMD64_RDX) {
@@ -3370,9 +3349,7 @@
amd64_div_reg (code, ins->sreg2, TRUE);
}
break;
- case CEE_DIV_UN:
case OP_LDIV_UN:
- case CEE_REM_UN:
case OP_LREM_UN:
if (ins->sreg2 == AMD64_RDX) {
amd64_mov_membase_reg (code, AMD64_RSP, -8,
AMD64_RDX, 8);
@@ -3410,7 +3387,6 @@
EMIT_COND_SYSTEM_EXCEPTION (X86_CC_O, FALSE,
"OverflowException");
break;
- case CEE_AND:
case OP_LAND:
amd64_alu_reg_reg (code, X86_AND, ins->sreg1,
ins->sreg2);
break;
@@ -3419,7 +3395,6 @@
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_AND, ins->sreg1,
ins->inst_imm);
break;
- case CEE_OR:
case OP_LOR:
amd64_alu_reg_reg (code, X86_OR, ins->sreg1,
ins->sreg2);
break;
@@ -3428,7 +3403,6 @@
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_OR, ins->sreg1,
ins->inst_imm);
break;
- case CEE_XOR:
case OP_LXOR:
amd64_alu_reg_reg (code, X86_XOR, ins->sreg1,
ins->sreg2);
break;
@@ -3438,12 +3412,10 @@
amd64_alu_reg_imm (code, X86_XOR, ins->sreg1,
ins->inst_imm);
break;
- case CEE_SHL:
case OP_LSHL:
g_assert (ins->sreg2 == AMD64_RCX);
amd64_shift_reg (code, X86_SHL, ins->dreg);
break;
- case CEE_SHR:
case OP_LSHR:
g_assert (ins->sreg2 == AMD64_RCX);
amd64_shift_reg (code, X86_SAR, ins->dreg);
@@ -3464,10 +3436,6 @@
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_shift_reg_imm (code, X86_SHR, ins->dreg,
ins->inst_imm);
break;
- case CEE_SHR_UN:
- g_assert (ins->sreg2 == AMD64_RCX);
- amd64_shift_reg_size (code, X86_SHR, ins->dreg, 4);
- break;
case OP_LSHR_UN:
g_assert (ins->sreg2 == AMD64_RCX);
amd64_shift_reg (code, X86_SHR, ins->dreg);
@@ -3653,18 +3621,13 @@
amd64_cmov_reg (code, cc_table [mono_opcode_to_cond
(ins->opcode)], cc_signed_table [mono_opcode_to_cond (ins->opcode)], ins->dreg,
ins->sreg2);
break;
- case CEE_NOT:
case OP_LNOT:
amd64_not_reg (code, ins->sreg1);
break;
- case CEE_NEG:
case OP_LNEG:
amd64_neg_reg (code, ins->sreg1);
break;
- case OP_ZEXT_I4:
- amd64_mov_reg_reg_size (code, ins->dreg, ins->sreg1, 4);
- break;
case OP_ICONST:
case OP_I8CONST:
if ((((guint64)ins->inst_c0) >> 32) == 0)
@@ -3680,8 +3643,6 @@
mono_add_patch_info (cfg, offset,
(MonoJumpInfoType)ins->inst_i1, ins->inst_p0);
amd64_mov_reg_imm_size (code, ins->dreg, 0, 8);
break;
- case CEE_CONV_I4:
- case CEE_CONV_U4:
case OP_MOVE:
amd64_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof
(gpointer));
break;
@@ -3774,7 +3735,6 @@
case OP_VCALL:
case OP_VCALL2:
case OP_VOIDCALL:
- case CEE_CALL:
call = (MonoCallInst*)ins;
/*
* The AMD64 ABI forces callers to know about varargs.
@@ -4051,18 +4011,6 @@
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 CEE_BEQ:
- case CEE_BNE_UN:
- case CEE_BLT:
- case CEE_BLT_UN:
- case CEE_BGT:
- case CEE_BGT_UN:
- case CEE_BGE:
- case CEE_BGE_UN:
- case CEE_BLE:
- case CEE_BLE_UN:
- EMIT_COND_BRANCH (ins, cc_table [mono_opcode_to_cond
(ins->opcode)], cc_signed_table [mono_opcode_to_cond (ins->opcode)]);
- break;
/* floating point opcodes */
case OP_R8CONST: {
@@ -4145,10 +4093,8 @@
else
amd64_fld_membase (code, ins->inst_basereg,
ins->inst_offset, FALSE);
break;
- case CEE_CONV_R4: /* FIXME: change precision */
case OP_ICONV_TO_R4:
case OP_ICONV_TO_R8:
- case CEE_CONV_R8:
if (use_sse2)
amd64_sse_cvtsi2sd_reg_reg_size (code,
ins->dreg, ins->sreg1, 4);
else {
@@ -4157,10 +4103,6 @@
amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 8);
}
break;
- case CEE_CONV_R_UN:
- /* Emulated */
- g_assert_not_reached ();
- break;
case OP_LCONV_TO_R4: /* FIXME: change precision */
case OP_LCONV_TO_R8:
if (use_sse2)
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.h
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.h 2008-02-05
19:26:18 UTC (rev 94929)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-amd64.h 2008-02-05
19:26:45 UTC (rev 94930)
@@ -279,6 +279,7 @@
#define MONO_ARCH_COMMON_VTABLE_TRAMPOLINE 1
#define MONO_ARCH_HAVE_CMOV_OPS 1
#define MONO_ARCH_HAVE_NOTIFY_PENDING_EXC 1
+#define MONO_ARCH_ENABLE_NORMALIZE_OPCODES 1
#define MONO_ARCH_AOT_SUPPORTED 1
Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini.c 2008-02-05
19:26:18 UTC (rev 94929)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini.c 2008-02-05
19:26:45 UTC (rev 94930)
@@ -11663,6 +11663,84 @@
mono_mempool_destroy (cfg->state_pool);
}
+/*
+ * mono_normalize_opcodes:
+ *
+ * Replace CEE_ opcodes with the corresponding OP_I or OP_L opcodes.
+ */
+
+static gint16 *remap_table;
+
+#if SIZEOF_VOID_P == 8
+#define REMAP_OPCODE(opcode) OP_L ## opcode
+#else
+#define REMAP_OPCODE(opcode) OP_I ## opcode
+#endif
+
+static void
+mono_normalize_opcodes (MonoCompile *cfg, MonoBasicBlock *bb)
+{
+ MonoInst *ins;
+
+ if (!remap_table) {
+ remap_table = g_new0 (gint16, OP_LAST);
+
+#if SIZEOF_VOID_P == 8
+ remap_table [CEE_CONV_I1] = OP_LCONV_TO_I1;
+ remap_table [CEE_CONV_I2] = OP_LCONV_TO_I2;
+ remap_table [CEE_CONV_U1] = OP_LCONV_TO_U1;
+ remap_table [CEE_CONV_U2] = OP_LCONV_TO_U2;
+ remap_table [CEE_CONV_U8] = OP_ZEXT_I4;
+ remap_table [CEE_CONV_U] = OP_ZEXT_I4;
+ remap_table [CEE_CONV_I8] = OP_SEXT_I4;
+ remap_table [CEE_CONV_I] = OP_SEXT_I4;
+ remap_table [CEE_CONV_R4] = OP_ICONV_TO_R4;
+ remap_table [CEE_CONV_R8] = OP_ICONV_TO_R8;
+ remap_table [CEE_CONV_I4] = OP_MOVE;
+ remap_table [CEE_CONV_U4] = OP_MOVE;
+ remap_table [CEE_CONV_OVF_U4] = OP_LCONV_TO_OVF_U4;
+ remap_table [CEE_CONV_OVF_I4_UN] = OP_LCONV_TO_OVF_I4_UN;
+#else
+ g_assert_not_reached ();
+#endif
+
+ remap_table [CEE_ADD] = REMAP_OPCODE (ADD);
+ remap_table [CEE_SUB] = REMAP_OPCODE (SUB);
+ remap_table [CEE_MUL] = REMAP_OPCODE (MUL);
+ remap_table [CEE_DIV] = REMAP_OPCODE (DIV);
+ remap_table [CEE_REM] = REMAP_OPCODE (REM);
+ remap_table [CEE_DIV_UN] = REMAP_OPCODE (DIV_UN);
+ remap_table [CEE_REM_UN] = REMAP_OPCODE (REM_UN);
+ remap_table [CEE_AND] = REMAP_OPCODE (AND);
+ remap_table [CEE_OR] = REMAP_OPCODE (OR);
+ remap_table [CEE_XOR] = REMAP_OPCODE (XOR);
+ remap_table [CEE_SHL] = REMAP_OPCODE (SHL);
+ remap_table [CEE_SHR] = REMAP_OPCODE (SHR);
+ remap_table [CEE_SHR_UN] = REMAP_OPCODE (SHR_UN);
+ remap_table [CEE_NOT] = REMAP_OPCODE (NOT);
+ remap_table [CEE_NEG] = REMAP_OPCODE (NEG);
+ remap_table [CEE_CALL] = OP_CALL;
+ remap_table [CEE_BEQ] = REMAP_OPCODE (BEQ);
+ remap_table [CEE_BNE_UN] = REMAP_OPCODE (BNE_UN);
+ remap_table [CEE_BLT] = REMAP_OPCODE (BLT);
+ remap_table [CEE_BLT_UN] = REMAP_OPCODE (BLT_UN);
+ remap_table [CEE_BGT] = REMAP_OPCODE (BGT);
+ remap_table [CEE_BGT_UN] = REMAP_OPCODE (BGT_UN);
+ remap_table [CEE_BGE] = REMAP_OPCODE (BGE);
+ remap_table [CEE_BGE_UN] = REMAP_OPCODE (BGE_UN);
+ remap_table [CEE_BLE] = REMAP_OPCODE (BLE);
+ remap_table [CEE_BLE_UN] = REMAP_OPCODE (BLE_UN);
+ }
+
+#ifdef MONO_ARCH_ENABLE_NORMALIZE_OPCODES
+ MONO_BB_FOR_EACH_INS (bb, ins) {
+ int remapped = remap_table [ins->opcode];
+ if (remapped)
+ ins->opcode = remapped;
+ }
+#endif
+}
+
void
mono_codegen (MonoCompile *cfg)
{
@@ -11676,7 +11754,9 @@
/* we reuse dfn here */
/* bb->dfn = bb_count++; */
//if ((bb == cfg->bb_entry) || !(bb->region == -1 && !bb->dfn))
- mono_arch_local_regalloc (cfg, bb);
+ if (!cfg->new_ir)
+ mono_normalize_opcodes (cfg, bb);
+ mono_arch_local_regalloc (cfg, bb);
}
if (cfg->prof_options & MONO_PROFILE_COVERAGE)
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches