Author: zoltan
Date: 2008-02-14 09:01:02 -0500 (Thu, 14 Feb 2008)
New Revision: 95629
Modified:
trunk/mono/mono/mini/ChangeLog
trunk/mono/mono/mini/mini-amd64.c
trunk/mono/mono/mini/mini-ops.h
trunk/mono/mono/mini/mini.c
trunk/mono/mono/mini/mini.h
Log:
2008-02-14 Zoltan Varga <[EMAIL PROTECTED]>
* mini-amd64.c (mono_arch_output_basic_block): Sync with the version on
the
linear IR branch.
* mini.c (mono_op_imm_to_op): New helper function.
* mini-ops.h: Add some opcodes from linear IR branch.
Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog 2008-02-14 13:59:24 UTC (rev 95628)
+++ trunk/mono/mono/mini/ChangeLog 2008-02-14 14:01:02 UTC (rev 95629)
@@ -1,3 +1,12 @@
+2008-02-14 Zoltan Varga <[EMAIL PROTECTED]>
+
+ * mini-amd64.c (mono_arch_output_basic_block): Sync with the version on
the
+ linear IR branch.
+
+ * mini.c (mono_op_imm_to_op): New helper function.
+
+ * mini-ops.h: Add some opcodes from linear IR branch.
+
2008-02-13 Zoltan Varga <[EMAIL PROTECTED]>
* mini-alpha.h mini-alpha.c tramp-alpha.c: Alpha port updates from
Sergey Tikhonov
Modified: trunk/mono/mono/mini/mini-amd64.c
===================================================================
--- trunk/mono/mono/mini/mini-amd64.c 2008-02-14 13:59:24 UTC (rev 95628)
+++ trunk/mono/mono/mini/mini-amd64.c 2008-02-14 14:01:02 UTC (rev 95629)
@@ -85,7 +85,8 @@
*/
const char*
-mono_arch_regname (int reg) {
+mono_arch_regname (int reg)
+{
switch (reg) {
case AMD64_RAX: return "%rax";
case AMD64_RBX: return "%rbx";
@@ -1663,6 +1664,7 @@
}
break;
case OP_COMPARE_IMM:
+ case OP_LCOMPARE_IMM:
/* OP_COMPARE_IMM (reg, 0)
* -->
* OP_AMD64_TEST_NULL (reg)
@@ -2113,26 +2115,16 @@
case OP_REM_IMM:
case OP_IDIV_IMM:
case OP_IREM_IMM:
+ case OP_IDIV_UN_IMM:
+ case OP_IREM_UN_IMM:
NEW_INS (cfg, ins, temp, OP_ICONST);
temp->inst_c0 = ins->inst_imm;
temp->dreg = mono_regstate_next_int (cfg->rs);
- switch (ins->opcode) {
- case OP_DIV_IMM:
- ins->opcode = OP_LDIV;
- break;
- case OP_REM_IMM:
- ins->opcode = OP_LREM;
- break;
- case OP_IDIV_IMM:
- ins->opcode = OP_IDIV;
- break;
- case OP_IREM_IMM:
- ins->opcode = OP_IREM;
- break;
- }
+ ins->opcode = mono_op_imm_to_op (ins->opcode);
ins->sreg2 = temp->dreg;
break;
case OP_COMPARE_IMM:
+ case OP_LCOMPARE_IMM:
if (!amd64_is_imm32 (ins->inst_imm)) {
NEW_INS (cfg, ins, temp, OP_I8CONST);
temp->inst_c0 = ins->inst_imm;
@@ -2585,10 +2577,32 @@
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_mov_membase_imm (code, ins->inst_destbasereg,
ins->inst_offset, ins->inst_imm, 8);
break;
+ case OP_LOAD_MEM:
+ case OP_LOADI8_MEM:
+ // FIXME: Decompose this earlier
+ if (amd64_is_imm32 (ins->inst_imm))
+ amd64_mov_reg_mem (code, ins->dreg,
ins->inst_imm, sizeof (gpointer));
+ else {
+ amd64_mov_reg_imm (code, ins->dreg,
ins->inst_imm);
+ amd64_mov_reg_membase (code, ins->dreg,
ins->dreg, 0, 8);
+ }
+ break;
+ case OP_LOADI4_MEM:
+ amd64_mov_reg_imm (code, ins->dreg, ins->inst_imm);
+ amd64_movsxd_reg_membase (code, ins->dreg, ins->dreg,
0);
+ break;
case OP_LOADU4_MEM:
amd64_mov_reg_imm (code, ins->dreg, ins->inst_p0);
amd64_mov_reg_membase (code, ins->dreg, ins->dreg, 0,
4);
break;
+ case OP_LOADU1_MEM:
+ amd64_mov_reg_imm (code, ins->dreg, ins->inst_imm);
+ amd64_widen_membase (code, ins->dreg, ins->dreg, 0,
FALSE, FALSE);
+ break;
+ case OP_LOADU2_MEM:
+ amd64_mov_reg_imm (code, ins->dreg, ins->inst_imm);
+ amd64_widen_membase (code, ins->dreg, ins->dreg, 0,
FALSE, TRUE);
+ break;
case OP_LOAD_MEMBASE:
case OP_LOADI8_MEMBASE:
g_assert (amd64_is_imm32 (ins->inst_offset));
@@ -2616,17 +2630,21 @@
amd64_mov_reg_memindex_size (code, ins->dreg,
ins->inst_basereg, 0, ins->inst_indexreg, 0, 8);
break;
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 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 OP_LCONV_TO_U1:
+ case OP_ICONV_TO_U1:
amd64_widen_reg (code, ins->dreg, ins->sreg1, FALSE,
FALSE);
break;
case OP_LCONV_TO_U2:
+ case OP_ICONV_TO_U2:
amd64_widen_reg (code, ins->dreg, ins->sreg1, FALSE,
TRUE);
break;
case OP_ZEXT_I4:
@@ -2635,12 +2653,13 @@
break;
case OP_SEXT_I4:
amd64_movsxd_reg_reg (code, ins->dreg, ins->sreg1);
- break;
+ break;
case OP_COMPARE:
case OP_LCOMPARE:
amd64_alu_reg_reg (code, X86_CMP, ins->sreg1,
ins->sreg2);
break;
case OP_COMPARE_IMM:
+ case OP_LCOMPARE_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_CMP, ins->sreg1,
ins->inst_imm);
break;
@@ -2653,20 +2672,64 @@
case OP_AMD64_TEST_NULL:
amd64_test_reg_reg (code, ins->sreg1, ins->sreg1);
break;
+
+ case OP_X86_ADD_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_ADD, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
+ case OP_X86_SUB_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_SUB, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
+ case OP_X86_AND_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_AND, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
+ case OP_X86_OR_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_OR, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
+ case OP_X86_XOR_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_XOR, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
+
+ case OP_X86_ADD_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_ADD, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
+ case OP_X86_SUB_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_SUB, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ break;
case OP_X86_ADD_MEMBASE_IMM:
/* FIXME: Make a 64 version too */
amd64_alu_membase_imm_size (code, X86_ADD,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
break;
- case OP_X86_ADD_MEMBASE:
- amd64_alu_reg_membase_size (code, X86_ADD, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
- break;
case OP_X86_SUB_MEMBASE_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_membase_imm_size (code, X86_SUB,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
break;
- case OP_X86_SUB_MEMBASE:
- amd64_alu_reg_membase_size (code, X86_SUB, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
+ case OP_X86_AND_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_AND,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
break;
+ case OP_X86_OR_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_OR,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
+ break;
+ case OP_X86_XOR_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_XOR,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
+ break;
+ case OP_X86_ADD_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_ADD,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 4);
+ break;
+ case OP_X86_SUB_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_SUB,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 4);
+ break;
+ case OP_X86_AND_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_AND,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 4);
+ break;
+ case OP_X86_OR_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_OR,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 4);
+ break;
+ case OP_X86_XOR_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_XOR,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 4);
+ break;
case OP_X86_INC_MEMBASE:
amd64_inc_membase_size (code, ins->inst_basereg,
ins->inst_offset, 4);
break;
@@ -2680,6 +2743,7 @@
amd64_dec_reg_size (code, ins->dreg, 4);
break;
case OP_X86_MUL_MEMBASE:
+ case OP_X86_MUL_MEMBASE_REG:
amd64_imul_reg_membase_size (code, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
break;
case OP_AMD64_ICOMPARE_MEMBASE_REG:
@@ -2688,12 +2752,85 @@
case OP_AMD64_ICOMPARE_MEMBASE_IMM:
amd64_alu_membase_imm_size (code, X86_CMP,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
break;
+ case OP_AMD64_COMPARE_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_CMP,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 8);
+ break;
+ case OP_AMD64_COMPARE_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_CMP,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 8);
+ break;
+ case OP_X86_COMPARE_MEMBASE8_IMM:
+ amd64_alu_membase8_imm_size (code, X86_CMP,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 4);
+ break;
case OP_AMD64_ICOMPARE_REG_MEMBASE:
amd64_alu_reg_membase_size (code, X86_CMP, ins->sreg1,
ins->sreg2, ins->inst_offset, 4);
break;
+ case OP_AMD64_COMPARE_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_CMP, ins->sreg1,
ins->sreg2, ins->inst_offset, 8);
+ break;
+
+ case OP_AMD64_ADD_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_ADD, ins->sreg1,
ins->sreg2, ins->inst_offset, 8);
+ break;
+ case OP_AMD64_SUB_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_SUB, ins->sreg1,
ins->sreg2, ins->inst_offset, 8);
+ break;
+ case OP_AMD64_AND_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_AND, ins->sreg1,
ins->sreg2, ins->inst_offset, 8);
+ break;
+ case OP_AMD64_OR_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_OR, ins->sreg1,
ins->sreg2, ins->inst_offset, 8);
+ break;
+ case OP_AMD64_XOR_REG_MEMBASE:
+ amd64_alu_reg_membase_size (code, X86_XOR, ins->sreg1,
ins->sreg2, ins->inst_offset, 8);
+ break;
+
+ case OP_AMD64_ADD_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_ADD,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 8);
+ break;
+ case OP_AMD64_SUB_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_SUB,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 8);
+ break;
+ case OP_AMD64_AND_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_AND,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 8);
+ break;
+ case OP_AMD64_OR_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_OR,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 8);
+ break;
+ case OP_AMD64_XOR_MEMBASE_REG:
+ amd64_alu_membase_reg_size (code, X86_XOR,
ins->inst_basereg, ins->inst_offset, ins->sreg2, 8);
+ break;
+
+ case OP_AMD64_ADD_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_ADD,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 8);
+ break;
+ case OP_AMD64_SUB_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_SUB,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 8);
+ break;
+ case OP_AMD64_AND_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_AND,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 8);
+ break;
+ case OP_AMD64_OR_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_OR,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 8);
+ break;
+ case OP_AMD64_XOR_MEMBASE_IMM:
+ g_assert (amd64_is_imm32 (ins->inst_imm));
+ amd64_alu_membase_imm_size (code, X86_XOR,
ins->inst_basereg, ins->inst_offset, ins->inst_imm, 8);
+ break;
+
case OP_BREAK:
amd64_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_LADD:
amd64_alu_reg_reg (code, X86_ADD, ins->sreg1,
ins->sreg2);
@@ -2702,6 +2839,7 @@
amd64_alu_reg_reg (code, X86_ADC, ins->sreg1,
ins->sreg2);
break;
case OP_ADD_IMM:
+ case OP_LADD_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_ADD, ins->dreg,
ins->inst_imm);
break;
@@ -2717,6 +2855,7 @@
amd64_alu_reg_reg (code, X86_SBB, ins->sreg1,
ins->sreg2);
break;
case OP_SUB_IMM:
+ case OP_LSUB_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_SUB, ins->dreg,
ins->inst_imm);
break;
@@ -2728,6 +2867,7 @@
amd64_alu_reg_reg (code, X86_AND, ins->sreg1,
ins->sreg2);
break;
case OP_AND_IMM:
+ case OP_LAND_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_AND, ins->sreg1,
ins->inst_imm);
break;
@@ -2850,6 +2990,7 @@
amd64_alu_reg_reg (code, X86_OR, ins->sreg1,
ins->sreg2);
break;
case OP_OR_IMM:
+ case OP_LOR_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_OR, ins->sreg1,
ins->inst_imm);
break;
@@ -2857,6 +2998,7 @@
amd64_alu_reg_reg (code, X86_XOR, ins->sreg1,
ins->sreg2);
break;
case OP_XOR_IMM:
+ case OP_LXOR_IMM:
g_assert (amd64_is_imm32 (ins->inst_imm));
amd64_alu_reg_imm (code, X86_XOR, ins->sreg1,
ins->inst_imm);
break;
@@ -3026,13 +3168,24 @@
case OP_IBGT:
case OP_IBGE:
case OP_IBLE:
+ case OP_LBEQ:
+ case OP_LBLT:
+ case OP_LBGT:
+ case OP_LBGE:
+ case OP_LBLE:
case OP_IBNE_UN:
case OP_IBLT_UN:
case OP_IBGT_UN:
case OP_IBGE_UN:
case OP_IBLE_UN:
+ case OP_LBNE_UN:
+ case OP_LBLT_UN:
+ case OP_LBGT_UN:
+ case OP_LBGE_UN:
+ case OP_LBLE_UN:
EMIT_COND_BRANCH (ins, cc_table [mono_opcode_to_cond
(ins->opcode)], cc_signed_table [mono_opcode_to_cond (ins->opcode)]);
break;
+
case OP_LNOT:
amd64_not_reg (code, ins->sreg1);
break;
@@ -3269,6 +3422,23 @@
code = mono_emit_stack_alloc (code, ins);
amd64_mov_reg_reg (code, ins->dreg, AMD64_RSP, 8);
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 */
+ amd64_mov_reg_imm (code, ins->dreg, size);
+ ins->sreg1 = ins->dreg;
+
+ code = mono_emit_stack_alloc (code, ins);
+ amd64_mov_reg_reg (code, ins->dreg, AMD64_RSP,
8);
+ } else {
+ amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP,
size);
+ amd64_mov_reg_reg (code, ins->dreg, AMD64_RSP,
8);
+ }
+ break;
+ }
case OP_THROW: {
amd64_mov_reg_reg (code, AMD64_ARG_REG1, ins->sreg1, 8);
code = emit_call (cfg, code,
MONO_PATCH_INFO_INTERNAL_METHOD,
@@ -3311,8 +3481,6 @@
case OP_LABEL:
ins->inst_c0 = code - cfg->native_code;
break;
- case OP_NOP:
- break;
case OP_BR:
if (ins->flags & MONO_INST_BRLABEL) {
if (ins->inst_i0->inst_c0) {
@@ -3342,14 +3510,19 @@
amd64_jump_reg (code, ins->sreg1);
break;
case OP_CEQ:
+ case OP_LCEQ:
case OP_ICEQ:
case OP_CLT:
+ case OP_LCLT:
case OP_ICLT:
case OP_CGT:
case OP_ICGT:
+ case OP_LCGT:
case OP_CLT_UN:
+ case OP_LCLT_UN:
case OP_ICLT_UN:
case OP_CGT_UN:
+ case OP_LCGT_UN:
case OP_ICGT_UN:
amd64_set_reg (code, cc_table [mono_opcode_to_cond
(ins->opcode)], ins->dreg, cc_signed_table [mono_opcode_to_cond (ins->opcode)]);
amd64_widen_reg (code, ins->dreg, ins->dreg, FALSE,
FALSE);
@@ -3364,6 +3537,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:
@@ -3374,22 +3557,12 @@
(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_LBEQ:
- case OP_LBLT:
- case OP_LBGT:
- case OP_LBGE:
- case OP_LBLE:
- case OP_LBNE_UN:
- case OP_LBLT_UN:
- case OP_LBGT_UN:
- case OP_LBGE_UN:
- case OP_LBLE_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: {
@@ -3502,6 +3675,9 @@
g_assert_not_reached ();
amd64_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,
ins->sreg1, 1, TRUE);
break;
@@ -3514,6 +3690,9 @@
case OP_FCONV_TO_U2:
code = emit_float_to_int (cfg, code, ins->dreg,
ins->sreg1, 2, FALSE);
break;
+ case OP_FCONV_TO_U4:
+ code = emit_float_to_int (cfg, code, ins->dreg,
ins->sreg1, 4, FALSE);
+ break;
case OP_FCONV_TO_I4:
case OP_FCONV_TO_I:
code = emit_float_to_int (cfg, code, ins->dreg,
ins->sreg1, 4, TRUE);
@@ -4094,7 +4273,7 @@
amd64_alu_reg_imm (code, X86_CMP, AMD64_RAX, X86_FP_C0);
EMIT_COND_BRANCH (ins, X86_CC_NE, FALSE);
break;
- case OP_CKFINITE: {
+ case OP_CKFINITE:
if (use_sse2) {
/* Transfer value to the fp stack */
amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP,
16);
@@ -4114,7 +4293,6 @@
if (use_sse2)
amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP,
16);
break;
- }
case OP_TLS_GET: {
code = emit_tls_get (code, ins->dreg, ins->inst_offset);
break;
Modified: trunk/mono/mono/mini/mini-ops.h
===================================================================
--- trunk/mono/mono/mini/mini-ops.h 2008-02-14 13:59:24 UTC (rev 95628)
+++ trunk/mono/mono/mini/mini-ops.h 2008-02-14 14:01:02 UTC (rev 95629)
@@ -12,6 +12,7 @@
MINI_OP(OP_LCOMPARE, "lcompare")
MINI_OP(OP_ICOMPARE, "icompare")
MINI_OP(OP_ICOMPARE_IMM, "icompare_imm")
+MINI_OP(OP_LCOMPARE_IMM, "lcompare_imm")
MINI_OP(OP_LOCAL, "local")
MINI_OP(OP_ARG, "arg")
MINI_OP(OP_ARGLIST, "oparglist")
@@ -29,6 +30,7 @@
MINI_OP(OP_SETRET, "setret")
MINI_OP(OP_SETFRET, "setfret")
MINI_OP(OP_SETLRET, "setlret")
+MINI_OP(OP_LOCALLOC_IMM, "localloc_imm")
MINI_OP(OP_CHECK_THIS, "checkthis")
MINI_OP(OP_VOIDCALL, "voidcall")
MINI_OP(OP_VOIDCALLVIRT, "voidcallvirt")
@@ -111,6 +113,13 @@
MINI_OP(OP_STORER4_MEMINDEX,"storer4_memindex")
MINI_OP(OP_STORER8_MEMINDEX,"storer8_memindex")
+/* Loads from an absolute address */
+MINI_OP(OP_LOAD_MEM, "load_mem")
+MINI_OP(OP_LOADI8_MEM, "loadi8_mem")
+MINI_OP(OP_LOADI4_MEM, "loadi4_mem")
+MINI_OP(OP_LOADU1_MEM, "loadu1_mem")
+MINI_OP(OP_LOADU2_MEM, "loadu2_mem")
+
MINI_OP(OP_LOADR8_SPILL_MEMBASE,"loadr8_spill_membase")
MINI_OP(OP_LOADU4_MEM,"loadu4_mem")
MINI_OP(OP_MOVE, "move")
@@ -228,6 +237,10 @@
MINI_OP(OP_LCONV_TO_OVF_I8,"long_conv_to_ovf_i8")
MINI_OP(OP_LCONV_TO_OVF_U8,"long_conv_to_ovf_u8")
+MINI_OP(OP_LAND_IMM, "long_and_imm")
+MINI_OP(OP_LOR_IMM, "long_or_imm")
+MINI_OP(OP_LXOR_IMM, "long_xor_imm")
+
MINI_OP(OP_LCEQ, "long_ceq")
MINI_OP(OP_LCGT, "long_cgt")
MINI_OP(OP_LCGT_UN,"long_cgt_un")
@@ -516,6 +529,7 @@
MINI_OP(OP_DUMMY_USE, "dummy_use")
MINI_OP(OP_DUMMY_STORE, "dummy_store")
MINI_OP(OP_NOT_REACHED, "not_reached")
+MINI_OP(OP_NOT_NULL, "not_null")
/* Atomic specific
@@ -558,6 +572,21 @@
MINI_OP(OP_X86_AND_MEMBASE_IMM, "x86_and_membase_imm")
MINI_OP(OP_X86_OR_MEMBASE_IMM, "x86_or_membase_imm")
MINI_OP(OP_X86_XOR_MEMBASE_IMM, "x86_xor_membase_imm")
+
+MINI_OP(OP_X86_ADD_MEMBASE_REG, "x86_add_membase_reg")
+MINI_OP(OP_X86_SUB_MEMBASE_REG, "x86_sub_membase_reg")
+MINI_OP(OP_X86_AND_MEMBASE_REG, "x86_and_membase_reg")
+MINI_OP(OP_X86_OR_MEMBASE_REG, "x86_or_membase_reg")
+MINI_OP(OP_X86_XOR_MEMBASE_REG, "x86_xor_membase_reg")
+MINI_OP(OP_X86_MUL_MEMBASE_REG, "x86_mul_membase_reg")
+
+MINI_OP(OP_X86_ADD_REG_MEMBASE, "x86_add_reg_membase")
+MINI_OP(OP_X86_SUB_REG_MEMBASE, "x86_sub_reg_membase")
+MINI_OP(OP_X86_MUL_REG_MEMBASE, "x86_mul_reg_membase")
+MINI_OP(OP_X86_AND_REG_MEMBASE, "x86_and_reg_membase")
+MINI_OP(OP_X86_OR_REG_MEMBASE, "x86_or_reg_membase")
+MINI_OP(OP_X86_XOR_REG_MEMBASE, "x86_xor_reg_membase")
+
MINI_OP(OP_X86_PUSH_MEMBASE, "x86_push_membase")
MINI_OP(OP_X86_PUSH_IMM, "x86_push_imm")
MINI_OP(OP_X86_PUSH, "x86_push")
@@ -587,6 +616,31 @@
MINI_OP(OP_AMD64_ICOMPARE_MEMBASE_REG, "amd64_icompare_membase_reg")
MINI_OP(OP_AMD64_ICOMPARE_MEMBASE_IMM, "amd64_icompare_membase_imm")
MINI_OP(OP_AMD64_ICOMPARE_REG_MEMBASE, "amd64_icompare_reg_membase")
+MINI_OP(OP_AMD64_COMPARE_MEMBASE_REG, "amd64_compare_membase_reg")
+MINI_OP(OP_AMD64_COMPARE_MEMBASE_IMM, "amd64_compare_membase_imm")
+MINI_OP(OP_AMD64_COMPARE_REG_MEMBASE, "amd64_compare_reg_membase")
+
+MINI_OP(OP_AMD64_ADD_MEMBASE_REG, "amd64_add_membase_reg")
+MINI_OP(OP_AMD64_SUB_MEMBASE_REG, "amd64_sub_membase_reg")
+MINI_OP(OP_AMD64_AND_MEMBASE_REG, "amd64_and_membase_reg")
+MINI_OP(OP_AMD64_OR_MEMBASE_REG, "amd64_or_membase_reg")
+MINI_OP(OP_AMD64_XOR_MEMBASE_REG, "amd64_xor_membase_reg")
+MINI_OP(OP_AMD64_MUL_MEMBASE_REG, "amd64_mul_membase_reg")
+
+MINI_OP(OP_AMD64_ADD_MEMBASE_IMM, "amd64_add_membase_imm")
+MINI_OP(OP_AMD64_SUB_MEMBASE_IMM, "amd64_sub_membase_imm")
+MINI_OP(OP_AMD64_AND_MEMBASE_IMM, "amd64_and_membase_imm")
+MINI_OP(OP_AMD64_OR_MEMBASE_IMM, "amd64_or_membase_imm")
+MINI_OP(OP_AMD64_XOR_MEMBASE_IMM, "amd64_xor_membase_imm")
+MINI_OP(OP_AMD64_MUL_MEMBASE_IMM, "amd64_mul_membase_imm")
+
+MINI_OP(OP_AMD64_ADD_REG_MEMBASE, "amd64_add_reg_membase")
+MINI_OP(OP_AMD64_SUB_REG_MEMBASE, "amd64_sub_reg_membase")
+MINI_OP(OP_AMD64_AND_REG_MEMBASE, "amd64_and_reg_membase")
+MINI_OP(OP_AMD64_OR_REG_MEMBASE, "amd64_or_reg_membase")
+MINI_OP(OP_AMD64_XOR_REG_MEMBASE, "amd64_xor_reg_membase")
+MINI_OP(OP_AMD64_MUL_REG_MEMBASE, "amd64_mul_reg_membase")
+
MINI_OP(OP_AMD64_OUTARG_ALIGN_STACK, "amd64_outarg_align_stack")
MINI_OP(OP_AMD64_LOADI8_MEMINDEX, "amd64_loadi8_memindex")
MINI_OP(OP_AMD64_SAVE_SP_TO_LMF, "amd64_save_sp_to_lmf")
Modified: trunk/mono/mono/mini/mini.c
===================================================================
--- trunk/mono/mono/mini/mini.c 2008-02-14 13:59:24 UTC (rev 95628)
+++ trunk/mono/mono/mini/mini.c 2008-02-14 14:01:02 UTC (rev 95629)
@@ -1672,6 +1672,92 @@
return mono_type_to_stind (type);
}
+int
+mono_op_imm_to_op (int opcode)
+{
+ switch (opcode) {
+ case OP_ADD_IMM:
+ return OP_PADD;
+ case OP_IADD_IMM:
+ return OP_IADD;
+ case OP_LADD_IMM:
+ return OP_LADD;
+ case OP_ISUB_IMM:
+ return OP_ISUB;
+ case OP_LSUB_IMM:
+ return OP_LSUB;
+ case OP_AND_IMM:
+#if SIZEOF_VOID_P == 4
+ return OP_IAND;
+#else
+ return OP_LAND;
+#endif
+ case OP_IAND_IMM:
+ return OP_IAND;
+ case OP_LAND_IMM:
+ return OP_LAND;
+ case OP_IOR_IMM:
+ return OP_IOR;
+ case OP_LOR_IMM:
+ return OP_LOR;
+ case OP_IXOR_IMM:
+ return OP_IXOR;
+ case OP_LXOR_IMM:
+ return OP_LXOR;
+ case OP_ISHL_IMM:
+ return OP_ISHL;
+ case OP_LSHL_IMM:
+ return OP_LSHL;
+ case OP_ISHR_IMM:
+ return OP_ISHR;
+ case OP_LSHR_IMM:
+ return OP_LSHR;
+ case OP_ISHR_UN_IMM:
+ return OP_ISHR_UN;
+ case OP_LSHR_UN_IMM:
+ return OP_LSHR_UN;
+ case OP_IDIV_IMM:
+ return OP_IDIV;
+ case OP_IDIV_UN_IMM:
+ return OP_IDIV_UN;
+ case OP_IREM_UN_IMM:
+ return OP_IREM_UN;
+ case OP_IREM_IMM:
+ return OP_IREM;
+ case OP_DIV_IMM:
+#if SIZEOF_VOID_P == 4
+ return OP_IDIV;
+#else
+ return OP_LDIV;
+#endif
+ case OP_REM_IMM:
+#if SIZEOF_VOID_P == 4
+ return OP_IREM;
+#else
+ return OP_LREM;
+#endif
+ case OP_ADDCC_IMM:
+ return OP_ADDCC;
+ case OP_ADC_IMM:
+ return OP_ADC;
+ case OP_SUBCC_IMM:
+ return OP_SUBCC;
+ case OP_SBB_IMM:
+ return OP_SBB;
+ case OP_IADC_IMM:
+ return OP_IADC;
+ case OP_ISBB_IMM:
+ return OP_ISBB;
+ case OP_COMPARE_IMM:
+ return OP_COMPARE;
+ case OP_ICOMPARE_IMM:
+ return OP_ICOMPARE;
+ default:
+ printf ("%s\n", mono_inst_name (opcode));
+ g_assert_not_reached ();
+ }
+}
+
/*
* When we need a pointer to the current domain many times in a method, we
* call mono_domain_get() once and we store the result in a local variable.
Modified: trunk/mono/mono/mini/mini.h
===================================================================
--- trunk/mono/mono/mini/mini.h 2008-02-14 13:59:24 UTC (rev 95628)
+++ trunk/mono/mono/mini/mini.h 2008-02-14 14:01:02 UTC (rev 95629)
@@ -1168,6 +1168,7 @@
gboolean mono_is_regsize_var (MonoType *t) MONO_INTERNAL;
CompRelation mono_opcode_to_cond (int opcode) MONO_INTERNAL;
CompType mono_opcode_to_type (int opcode, int cmp_opcode)
MONO_INTERNAL;
+int mono_op_imm_to_op (int opcode) MONO_INTERNAL;
/* methods that must be provided by the arch-specific port */
void mono_arch_init (void) MONO_INTERNAL;
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches