Author: zoltan
Date: 2008-02-15 06:52:35 -0500 (Fri, 15 Feb 2008)
New Revision: 95734

Modified:
   branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
   branches/vargaz/mini-linear-il/mono/mono/mini/cpu-ia64.md
   branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c
   branches/vargaz/mini-linear-il/mono/mono/mini/mini-ia64.c
   branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h
Log:
2008-02-15  Zoltan Varga  <[EMAIL PROTECTED]>

        * method-to-ir.c (mini_emit_inst_for_method): Fix 64 bit issues in 
array access
        implementation.
        (mini_emit_ldelema_1_ins): Ditto.

        * mini-ia64.c cpu-ia64.md: Fix ia64 build.


Modified: branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog     2008-02-15 
11:50:15 UTC (rev 95733)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog     2008-02-15 
11:52:35 UTC (rev 95734)
@@ -1,3 +1,11 @@
+2008-02-15  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * method-to-ir.c (mini_emit_inst_for_method): Fix 64 bit issues in 
array access
+       implementation.
+       (mini_emit_ldelema_1_ins): Ditto.
+
+       * mini-ia64.c cpu-ia64.md: Fix ia64 build.
+
 2008-02-14  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * cpu-sparc.md mini-sparc.c: Fix sparc build.

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/cpu-ia64.md
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/cpu-ia64.md   2008-02-15 
11:50:15 UTC (rev 95733)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/cpu-ia64.md   2008-02-15 
11:52:35 UTC (rev 95734)
@@ -8,65 +8,23 @@
 break: len:48
 jmp: len:48
 br: len:48
-<<<<<<< .working
-jump_table: dest:i len:48
-
-nop: len:0
-dummy_use: len:0
-dummy_store: len:0
-not_reached: len:0
-not_null: src1:i len:0
-
-long_add: dest:i src1:i src2:i len:48
-long_sub: dest:i src1:i src2:i len:48
-long_and: dest:i src1:i src2:i len:48
-long_or: dest:i src1:i src2:i len:48
-long_xor: dest:i src1:i src2:i len:48
-long_shl: dest:i src1:i src2:s len:48
-long_shr: dest:i src1:i src2:s len:48
-long_shr_un: dest:i src1:i src2:s len:48
-
-long_neg: dest:i src1:i len:48
-long_not: dest:i src1:i len:48
-long_conv_to_i1: dest:i src1:i len:48
-long_conv_to_u1: dest:i src1:i len:48
-long_conv_to_i2: dest:i src1:i len:48
-long_conv_to_u2: dest:i src1:i len:48
-long_conv_to_i4: dest:i src1:i len:48
-long_conv_to_u4: dest:i src1:i len:48
-long_conv_to_i8: dest:i src1:i len:48
-long_conv_to_u8: dest:i src1:i len:112
-long_conv_to_r4: dest:f src1:i len:112
-long_conv_to_r8: dest:f src1:i len:112
-long_conv_to_r_un: dest:f src1:i len:48
-long_conv_to_ovf_i4_un: dest:i src1:i len:96
-long_conv_to_ovf_u4: dest:i src1:i len:48
-
-=======
->>>>>>> .merge-right.r95529
 throw: src1:i len:96
 rethrow: src1:i len:48
 ckfinite: dest:f src1:f len:48
-<<<<<<< .working
-
-=======
 mul.ovf: dest:i src1:i src2:i len:48
 # this opcode is handled specially in the code generator
 mul.ovf.un: dest:i src1:i src2:i len:48
 conv.u: dest:i src1:i len:48
->>>>>>> .merge-right.r95529
 ceq: dest:c len:48
 cgt: dest:c len:48
 cgt.un: dest:c len:48
 clt: dest:c len:48
 clt.un: dest:c len:48
 localloc: dest:i src1:i len:92
-localloc_imm: dest:i len:92
 compare: src1:i src2:i len:48
 lcompare: src1:i src2:i len:48
 icompare: src1:i src2:i len:48
 compare_imm: src1:i len:48
-lcompare_imm: src1:i len:48
 icompare_imm: src1:i len:48
 fcompare: src1:f src2:f clob:a len:48
 oparglist: src1:b len:48
@@ -75,10 +33,7 @@
 setret: dest:r src1:i len:48
 setlret: dest:r src1:i src2:i len:48
 checkthis: src1:b len:48
-
 call: dest:r clob:c len:80
-call_reg: dest:r src1:i len:80 clob:c
-call_membase: dest:r src1:b len:80 clob:c
 voidcall: clob:c len:80
 voidcall_reg: src1:i clob:c len:80
 voidcall_membase: src1:b clob:c len:80
@@ -91,10 +46,8 @@
 vcall: len:80 clob:c
 vcall_reg: src1:i len:80 clob:c
 vcall_membase: src1:b len:80 clob:c
-vcall2: len:80 clob:c
-vcall2_reg: src1:i len:80 clob:c
-vcall2_membase: src1:b len:80 clob:c
-
+call_reg: dest:r src1:i len:80 clob:c
+call_membase: dest:r src1:b len:80 clob:c
 iconst: dest:i len:48
 i8const: dest:i len:48
 r4const: dest:f len:48
@@ -156,21 +109,6 @@
 cond_exc_nc: len:48
 cond_exc_iov: len:48
 cond_exc_ic: len:48
-<<<<<<< .working
-
-long_mul: dest:i src1:i src2:i len:48
-long_mul_imm: dest:i src1:i src2:i len:48
-long_div: dest:a src1:a src2:i len:48 clob:d
-long_div_un: dest:a src1:a src2:i len:48 clob:d
-long_rem: dest:d src1:a src2:i len:48 clob:a
-long_rem_un: dest:d src1:a src2:i len:48 clob:a
-long_conv_to_ovf_i: dest:i src1:i src2:i len:48
-long_mul_ovf: dest:i src1:i src2:i len:48
-long_mul_ovf_un: dest:i src1:i src2:i len:48
-long_conv_to_r_un: dest:f src1:i src2:i len:48 
-
-=======
->>>>>>> .merge-right.r95529
 float_beq: len:48
 float_bne_un: len:48
 float_blt: len:48
@@ -195,6 +133,7 @@
 float_conv_to_i4: dest:i src1:f len:112
 float_conv_to_i8: dest:i src1:f len:112
 float_conv_to_r4: dest:f src1:f len:112
+float_conv_to_r8: dest:f src1:f len:112
 float_conv_to_u4: dest:i src1:f len:112
 float_conv_to_u8: dest:i src1:f len:112
 float_conv_to_u2: dest:i src1:f len:112
@@ -215,12 +154,10 @@
 float_clt_un_membase: dest:i src1:f src2:b len:48
 float_conv_to_u: dest:i src1:f len:48
 fmove: dest:f src1:f len:48
-
 call_handler: len:96
 start_handler: len:96
 endfilter: len:96
 endfinally: len:96
-
 aot_const: dest:i len:48
 tls_get: dest:i len:48
 atomic_add_i4: src1:b src2:i dest:i len:48
@@ -309,28 +246,6 @@
 int_conv_to_r4: dest:f src1:i len:112
 int_conv_to_r8: dest:f src1:i len:112
 
-<<<<<<< .working
-int_conv_to_i1: dest:i src1:i len:48
-int_conv_to_u1: dest:i src1:i len:48
-int_conv_to_i2: dest:i src1:i len:48
-int_conv_to_u2: dest:i src1:i len:48
-int_conv_to_i4: dest:i src1:i len:48
-int_conv_to_u4: dest:i src1:i len:48
-int_conv_to_i8: dest:i src1:i len:48
-int_conv_to_u8: dest:i src1:i len:48
-int_conv_to_r4: dest:f src1:i len:48
-int_conv_to_r8: dest:f src1:i len:48
-
-long_add_imm: dest:i src1:i len:48
-long_sub_imm: dest:i src1:i len:48
-long_and_imm: dest:i src1:i len:48
-long_or_imm: dest:i src1:i len:48
-long_xor_imm: dest:i src1:i len:48
-long_shl_imm: dest:i src1:i len:48
-long_shr_imm: dest:i src1:i len:48
-long_shr_un_imm: dest:i src1:i len:48
-
-=======
 # 64 bit opcodes
 long_add: dest:i src1:i src2:i len:48
 long_sub: dest:i src1:i src2:i len:48
@@ -381,7 +296,6 @@
 long_ble_un: len:48
 long_blt_un: len:48
 
->>>>>>> .merge-right.r95529
 ia64_cmp4_eq: src1:i src2:i len:48
 ia64_cmp4_ne: src1:i src2:i len:48
 ia64_cmp4_le: src1:i src2:i len:48
@@ -457,18 +371,33 @@
 ia64_loadr4_membase_inc: dest:b src1:i len:48
 ia64_loadr8_membase_inc: dest:b src1:i len:48
 
-long_ceq: dest:c len:64
-long_cgt: dest:c len:64
-long_cgt_un: dest:c len:64
-long_clt: dest:c len:64
-long_clt_un: dest:c len:64
-long_beq: len:64
-long_bne_un: len:64
-long_blt: len:64
-long_blt_un: len:64
-long_bgt: len:64
-long_bgt_un: len:64
-long_bge: len:64
-long_bge_un: len:64
-long_ble: len:64
-long_ble_un: len:64
+# Linear IR opcodes
+nop: len:0
+dummy_use: len:0
+dummy_store: len:0
+not_reached: len:0
+not_null: src1:i len:0
+
+jump_table: dest:i len:48
+
+localloc_imm: dest:i len:92
+
+vcall2: len:80 clob:c
+vcall2_reg: src1:i len:80 clob:c
+vcall2_membase: src1:b len:80 clob:c
+
+int_conv_to_i1: dest:i src1:i len:48
+int_conv_to_u1: dest:i src1:i len:48
+int_conv_to_i2: dest:i src1:i len:48
+int_conv_to_u2: dest:i src1:i len:48
+int_conv_to_i4: dest:i src1:i len:48
+int_conv_to_u4: dest:i src1:i len:48
+int_conv_to_i8: dest:i src1:i len:48
+int_conv_to_u8: dest:i src1:i len:48
+
+long_add_imm: dest:i src1:i len:48
+long_sub_imm: dest:i src1:i len:48
+long_and_imm: dest:i src1:i len:48
+long_or_imm: dest:i src1:i len:48
+long_xor_imm: dest:i src1:i len:48
+

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c        
2008-02-15 11:50:15 UTC (rev 95733)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/method-to-ir.c        
2008-02-15 11:52:35 UTC (rev 95734)
@@ -3010,7 +3010,7 @@
                        guint32 imt_slot = mono_method_get_imt_slot (method);
                        emit_imt_argument (cfg, call);
                        slot_reg = vtable_reg;
-                       call->inst.inst_offset = (imt_slot - MONO_IMT_SIZE) * 
SIZEOF_VOID_P;
+                       call->inst.inst_offset = ((gint32)imt_slot - 
MONO_IMT_SIZE) * SIZEOF_VOID_P;
 #else
                        slot_reg = alloc_preg (cfg);
                        mini_emit_load_intf_reg_vtable (cfg, slot_reg, 
vtable_reg, method->klass);
@@ -3747,7 +3747,7 @@
 {
        MonoInst *ins;
        guint32 size;
-       int mult_reg, add_reg, array_reg, index_reg;
+       int mult_reg, add_reg, array_reg, index_reg, index2_reg;
 
        mono_class_init (klass);
        size = mono_class_array_element_size (klass);
@@ -3757,8 +3757,16 @@
        array_reg = arr->dreg;
        index_reg = index->dreg;
 
-       MONO_EMIT_BOUNDS_CHECK (cfg, array_reg, MonoArray, max_length, 
index_reg);
+#if SIZEOF_VOID_P == 8
+       /* The array reg is 64 bits but the index reg is only 32 */
+       index2_reg = alloc_preg (cfg);
+       MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, index2_reg, index_reg);
+#else
+       index2_reg = index_reg;
+#endif
 
+       MONO_EMIT_BOUNDS_CHECK (cfg, array_reg, MonoArray, max_length, 
index2_reg);
+
 #ifdef __i386__
        if (size == 1 || size == 2 || size == 4 || size == 8) {
                static const int fast_log2 [] = { 1, 0, 1, -1, 2, -1, -1, -1, 3 
};
@@ -3778,12 +3786,7 @@
 #ifdef __x86_64__
        if (size == 1 || size == 2 || size == 4 || size == 8) {
                static const int fast_log2 [] = { 1, 0, 1, -1, 2, -1, -1, -1, 3 
};
-               int index2_reg;
 
-               /* The array reg is 64 bits but the index reg is only 32 */
-               index2_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, index2_reg, index_reg);
-
                MONO_INST_NEW (cfg, ins, OP_X86_LEA);
                ins->dreg = add_reg;
                ins->sreg1 = array_reg;
@@ -3797,7 +3800,7 @@
        }
 #endif         
 
-       MONO_EMIT_NEW_BIALU_IMM (cfg, OP_MUL_IMM, mult_reg, index_reg, size);
+       MONO_EMIT_NEW_BIALU_IMM (cfg, OP_MUL_IMM, mult_reg, index2_reg, size);
        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, array_reg, mult_reg);
        NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, G_STRUCT_OFFSET 
(MonoArray, vector));
        ins->type = STACK_PTR;
@@ -3921,11 +3924,18 @@
        if (cmethod->klass == mono_defaults.string_class) {
                if (strcmp (cmethod->name, "get_Chars") == 0) {
                        int dreg = alloc_ireg (cfg);
+                       int index_reg = alloc_preg (cfg);
                        int mult_reg = alloc_preg (cfg);
                        int add_reg = alloc_preg (cfg);
-       
-                       MONO_EMIT_BOUNDS_CHECK (cfg, args [0]->dreg, 
MonoString, length, args [1]->dreg);
-                       MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ISHL_IMM, mult_reg, 
args [1]->dreg, 1);
+
+#if SIZEOF_VOID_P == 8
+                       /* The array reg is 64 bits but the index reg is only 
32 */
+                       MONO_EMIT_NEW_UNALU (cfg, OP_SEXT_I4, index_reg, args 
[1]->dreg);
+#else
+                       index_reg = args [1]->dreg;
+#endif 
+                       MONO_EMIT_BOUNDS_CHECK (cfg, args [0]->dreg, 
MonoString, length, index_reg);
+                       MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SHL_IMM, mult_reg, 
index_reg, 1);
                        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, mult_reg, 
args [0]->dreg);
                        EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADU2_MEMBASE, 
dreg, 
                                                                   add_reg, 
G_STRUCT_OFFSET (MonoString, chars));

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-ia64.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-ia64.c   2008-02-15 
11:50:15 UTC (rev 95733)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-ia64.c   2008-02-15 
11:52:35 UTC (rev 95734)
@@ -1036,6 +1036,12 @@
 
                mono_call_inst_add_outarg_reg (cfg, call, arg->dreg, reg, TRUE);
                break;
+       case ArgInFloatRegR4:
+               arg->opcode = OP_FCONV_TO_R4;
+               arg->dreg = mono_alloc_freg (cfg);
+
+               mono_call_inst_add_outarg_reg (cfg, call, arg->dreg, reg, TRUE);
+               break;
        default:
                g_assert_not_reached ();
        }
@@ -1123,8 +1129,8 @@
                } else {
                        MonoType *arg_type;
 
-                       in = call->args [i];
                        MONO_INST_NEW (cfg, arg, OP_OUTARG);
+                       in = call->args [i];
                        arg->cil_code = in->cil_code;
                        arg->inst_left = in;
                        arg->type = in->type;
@@ -1165,15 +1171,6 @@
 
                                        vtaddr = mono_compile_create_var (cfg, 
&mono_defaults.int_class->byval_arg, OP_LOCAL);
 
-                                       /* Trees can't be shared so make a copy 
*/
-                                       MONO_INST_NEW (cfg, arg, CEE_STIND_I);
-                                       arg->cil_code = in->cil_code;
-                                       arg->ssa_op = MONO_SSA_STORE;
-                                       arg->inst_left = vtaddr;
-                                       arg->inst_right = in;
-                                       arg->type = in->type;
-                                       MONO_INST_LIST_ADD_TAIL (&arg->node, 
&call->out_args);
-
                                        /* 
                                         * Part of the structure is passed in 
registers.
                                         */
@@ -1211,7 +1208,10 @@
                                                MONO_INST_NEW (cfg, load, 
load_op);
                                                load->inst_left = load2;
 
-                                               MONO_INST_NEW (cfg, set_reg, 
OP_OUTARG_REG);
+                                               if (j == 0)
+                                                       set_reg = arg;
+                                               else
+                                                       MONO_INST_NEW (cfg, 
set_reg, OP_OUTARG_REG);
                                                add_outarg_reg (cfg, call, 
set_reg, arg_storage, dest_reg, load);
                                                if (set_reg != call->out_args) {
                                                        set_reg->next = 
call->out_args;
@@ -1239,7 +1239,10 @@
                                                MONO_INST_NEW (cfg, load, 
CEE_LDIND_I);
                                                load->inst_left = load2;
 
-                                               MONO_INST_NEW (cfg, outarg, 
OP_OUTARG);
+                                               if (j == 0)
+                                                       outarg = arg;
+                                               else
+                                                       MONO_INST_NEW (cfg, 
outarg, OP_OUTARG);
                                                outarg->inst_left = load;
                                                outarg->inst_imm = 16 + 
ainfo->offset + (slot - 8) * 8;
 
@@ -1269,7 +1272,6 @@
 
                                        arg->opcode = OP_OUTARG_VT;
                                        arg->inst_right = stack_addr;
-                                       MONO_INST_LIST_ADD_TAIL (&arg->node, 
&call->out_args);
                                }
                        }
                        else {
@@ -1278,7 +1280,6 @@
                                        add_outarg_reg (cfg, call, arg, 
ainfo->storage, cfg->arch.reg_out0 + ainfo->reg, in);
                                        break;
                                case ArgInFloatReg:
-                               case ArgInFloatRegR4:
                                        add_outarg_reg (cfg, call, arg, 
ainfo->storage, ainfo->reg, in);
                                        break;
                                case ArgOnStack:
@@ -1292,7 +1293,6 @@
                                default:
                                        g_assert_not_reached ();
                                }
-                               MONO_INST_LIST_ADD_TAIL (&arg->node, 
&call->out_args);
                        }
                }
        }
@@ -1439,6 +1439,7 @@
                                add_outarg_reg2 (cfg, call, ainfo->storage, 
cfg->arch.reg_out0 + ainfo->reg, in);
                                break;
                        case ArgInFloatReg:
+                       case ArgInFloatRegR4:
                                add_outarg_reg2 (cfg, call, ainfo->storage, 
ainfo->reg, in);
                                break;
                        case ArgOnStack:
@@ -1686,11 +1687,8 @@
                                NEW_INS (cfg, temp, OP_I8CONST);
                                temp->inst_c0 = ins->inst_offset;
                                temp->dreg = mono_regstate_next_int (cfg->rs);
-<<<<<<< .working
+
                                NEW_INS (cfg, temp2, OP_LADD);
-=======
-                               NEW_INS (cfg, ins, temp2, OP_LADD);
->>>>>>> .merge-right.r95529
                                temp2->sreg1 = ins->inst_destbasereg;
                                temp2->sreg2 = temp->dreg;
                                temp2->dreg = mono_regstate_next_int (cfg->rs);
@@ -1748,11 +1746,7 @@
                                NEW_INS (cfg, temp, OP_I8CONST);
                                temp->inst_c0 = ins->inst_offset;
                                temp->dreg = mono_regstate_next_int (cfg->rs);
-<<<<<<< .working
                                NEW_INS (cfg, temp2, OP_LADD);
-=======
-                               NEW_INS (cfg, ins, temp2, OP_LADD);
->>>>>>> .merge-right.r95529
                                temp2->sreg1 = ins->inst_destbasereg;
                                temp2->sreg2 = temp->dreg;
                                temp2->dreg = mono_regstate_next_int (cfg->rs);
@@ -1791,11 +1785,7 @@
                                NEW_INS (cfg, temp, OP_I8CONST);
                                temp->inst_c0 = ins->inst_offset;
                                temp->dreg = mono_regstate_next_int (cfg->rs);
-<<<<<<< .working
                                NEW_INS (cfg, temp2, OP_LADD);
-=======
-                               NEW_INS (cfg, ins, temp2, OP_LADD);
->>>>>>> .merge-right.r95529
                                temp2->sreg1 = ins->inst_basereg;
                                temp2->sreg2 = temp->dreg;
                                temp2->dreg = mono_regstate_next_int (cfg->rs);
@@ -2027,11 +2017,7 @@
                                                if (sum_reg == 0)
                                                        sum_reg = temp->dreg;
                                                else {
-<<<<<<< .working
                                                        NEW_INS (cfg, temp2, 
OP_LADD);
-=======
-                                                       NEW_INS (cfg, ins, 
temp2, OP_LADD);
->>>>>>> .merge-right.r95529
                                                        temp2->dreg = 
mono_regstate_next_int (cfg->rs);
                                                        temp2->sreg1 = sum_reg;
                                                        temp2->sreg2 = 
temp->dreg;
@@ -2044,13 +2030,8 @@
                        }
                        break;
                }
-<<<<<<< .working
                case OP_LCONV_TO_OVF_U4:
                        NEW_INS (cfg, temp, OP_IA64_CMP4_LT);
-=======
-               case OP_LCONV_TO_OVF_U4:
-                       NEW_INS (cfg, ins, temp, OP_IA64_CMP4_LT);
->>>>>>> .merge-right.r95529
                        temp->sreg1 = ins->sreg1;
                        temp->sreg2 = IA64_R0;
 
@@ -2059,13 +2040,8 @@
 
                        ins->opcode = OP_MOVE;
                        break;
-<<<<<<< .working
                case OP_LCONV_TO_OVF_I4_UN:
                        NEW_INS (cfg, temp, OP_ICONST);
-=======
-               case OP_LCONV_TO_OVF_I4_UN:
-                       NEW_INS (cfg, ins, temp, OP_ICONST);
->>>>>>> .merge-right.r95529
                        temp->inst_c0 = 0x7fffffff;
                        temp->dreg = mono_regstate_next_int (cfg->rs);
 
@@ -2467,16 +2443,9 @@
                        ia64_zxt4 (code, GP_SCRATCH_REG, ins->sreg1);
                        ia64_shr_u (code, ins->dreg, GP_SCRATCH_REG, 
ins->sreg2);
                        break;
-               case OP_LSHL:
-                       ia64_shl (code, ins->dreg, ins->sreg1, ins->sreg2);
-                       break;
                case OP_LSHR_UN:
                        ia64_shr_u (code, ins->dreg, ins->sreg1, ins->sreg2);
                        break;
-               case OP_LSUB:
-               case OP_ISUB:
-                       ia64_sub (code, ins->dreg, ins->sreg1, ins->sreg2);
-                       break;
                case OP_IADDCC:
                        /* p6 and p7 is set if there is signed/unsigned 
overflow */
                        
@@ -2976,23 +2945,11 @@
                        ia64_fnorm_s_sf (code, ins->dreg, ins->dreg, 0);
                        break;
                case OP_ICONV_TO_R8:
-                       ia64_setf_sig (code, ins->dreg, ins->sreg1);
-                       ia64_fcvt_xf (code, ins->dreg, ins->dreg);
-                       ia64_fnorm_d_sf (code, ins->dreg, ins->dreg, 0);
-                       break;
-                       /* FIXME: Difference with OP_ICONV_TO_R8 ? */
-               case OP_ICONV_TO_R8:
                case OP_LCONV_TO_R8:
                        ia64_setf_sig (code, ins->dreg, ins->sreg1);
                        ia64_fcvt_xf (code, ins->dreg, ins->dreg);
                        ia64_fnorm_d_sf (code, ins->dreg, ins->dreg, 0);
                        break;
-               case OP_LCONV_TO_R4:
-                       /* FIXME: Difference with OP_ICONV_TO_R4 ? */
-                       ia64_setf_sig (code, ins->dreg, ins->sreg1);
-                       ia64_fcvt_xf (code, ins->dreg, ins->dreg);
-                       ia64_fnorm_s_sf (code, ins->dreg, ins->dreg, 0);
-                       break;
                case OP_FCONV_TO_R4:
                        ia64_fnorm_s_sf (code, ins->dreg, ins->sreg1, 0);
                        break;
@@ -3102,6 +3059,7 @@
                        if (ia64_is_imm14 (ins->inst_offset))
                                ia64_adds_imm (code, IA64_R8, ins->inst_offset, 
ins->sreg1);
                        else {
+                               printf ("A: %lx\n", ins->inst_offset);
                                ia64_movl (code, GP_SCRATCH_REG, 
ins->inst_offset);
                                ia64_add (code, IA64_R8, GP_SCRATCH_REG, 
ins->sreg1);
                        }
@@ -3386,8 +3344,15 @@
                        /* Signal to endfilter that we are called by 
call_filter */
                        ia64_mov (code, GP_SCRATCH_REG, IA64_R0);
 
-                       /* Save the return address */
-                       ia64_adds_imm (code, GP_SCRATCH_REG2, 
spvar->inst_offset, cfg->frame_reg);
+                       /* Branch target: */
+                       if (ia64_is_imm14 (spvar->inst_offset)) 
+                               ia64_adds_imm (code, GP_SCRATCH_REG2, 
spvar->inst_offset, cfg->frame_reg);
+                       else {
+                               ia64_movl (code, GP_SCRATCH_REG2, 
spvar->inst_offset);
+                               ia64_add (code, GP_SCRATCH_REG2, 
cfg->frame_reg, GP_SCRATCH_REG2);
+                       }
+
+                       /* Save the return address */                           
                        ia64_st8_hint (code, GP_SCRATCH_REG2, GP_SCRATCH_REG, 
0);
                        ia64_codegen_set_one_ins_per_bundle (code, FALSE);
 
@@ -3399,7 +3364,12 @@
                        MonoInst *spvar = mono_find_spvar_for_region (cfg, 
bb->region);
 
                        /* Load the return address */
-                       ia64_adds_imm (code, GP_SCRATCH_REG, 
spvar->inst_offset, cfg->frame_reg);
+                       if (ia64_is_imm14 (spvar->inst_offset)) {
+                               ia64_adds_imm (code, GP_SCRATCH_REG, 
spvar->inst_offset, cfg->frame_reg);
+                       } else {
+                               ia64_movl (code, GP_SCRATCH_REG, 
spvar->inst_offset);
+                               ia64_add (code, GP_SCRATCH_REG, cfg->frame_reg, 
GP_SCRATCH_REG);
+                       }
                        ia64_ld8_hint (code, GP_SCRATCH_REG, GP_SCRATCH_REG, 0);
 
                        /* Test caller */

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h    2008-02-15 
11:50:15 UTC (rev 95733)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h    2008-02-15 
11:52:35 UTC (rev 95734)
@@ -22,6 +22,7 @@
 MINI_OP(OP_OUTARG,     "outarg", NONE, NONE, NONE)
 MINI_OP(OP_OUTARG_REG, "outarg_reg", NONE, NONE, NONE)
 MINI_OP(OP_OUTARG_FREG,        "outarg_freg", NONE, NONE, NONE)
+MINI_OP(OP_OUTARG_FREG_R4,     "outarg_freg_r4", NONE, NONE, NONE)
 MINI_OP(OP_OUTARG_IMM, "outarg_imm", NONE, NONE, NONE)
 MINI_OP(OP_OUTARG_R4,  "outarg_r4", NONE, NONE, NONE)
 MINI_OP(OP_OUTARG_R8,  "outarg_r8", NONE, NONE, NONE)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to