* mini-s390.c, mini-s390.h, inssel-s390.brg, cpu-s390.md: Fix r8 to unsigned int
authorNeale Ferguson <neale@mono-cvs.ximian.com>
Fri, 6 Jan 2006 02:31:37 +0000 (02:31 -0000)
committerNeale Ferguson <neale@mono-cvs.ximian.com>
Fri, 6 Jan 2006 02:31:37 +0000 (02:31 -0000)
conversion and implement LADD/LSUB.

* exceptions-s390.c: Standardize mono_arch_find_jit_info to match other
architectures.

svn path=/trunk/mono/; revision=55125

mono/mini/ChangeLog
mono/mini/cpu-s390.md
mono/mini/exceptions-s390.c
mono/mini/inssel-s390.brg
mono/mini/mini-s390.c
mono/mini/mini-s390.h

index 15d9a237808f42b5a9a8101b7a2af9bcbead2f66..341a86753fda5c2b45727de536960c231b302dda 100644 (file)
@@ -1,3 +1,11 @@
+2006-01-05 Neale Ferguson <neale@sinenomine.net>
+
+       * mini-s390.c, mini-s390.h, inssel-s390.brg, cpu-s390.md: Fix r8 to unsigned int 
+       conversion and implement LADD/LSUB.
+
+       * exceptions-s390.c: Standardize mono_arch_find_jit_info to match other
+       architectures.
+
 2006-01-05 Neale Ferguson <neale@sinenomine.net>
 
        * mini-s390x.c, mini-s390x.h: Fix r8 to unsigned int conversion.
index 67f9cf05bd8b78be009511b310d516ebbc389e2b..add887b0786aed57e11b25b0a34f5b6c5294b5e9 100644 (file)
@@ -327,7 +327,7 @@ loadu4_mem: dest:i len:8
 loadu4_membase: dest:i src1:b len:18
 local:
 localloc: dest:i src1:i len:62
-long_add:
+long_add: len: 18 dest:l src1:l src2:i clob:1
 long_add_imm:
 long_add_ovf_un: len:22 dest:l src1:l src2:i clob:1
 long_add_ovf: len:28 dest:l src1:l src2:i clob:1
@@ -396,7 +396,7 @@ long_shr:
 long_shr_imm:
 long_shr_un:
 long_shr_un_imm:
-long_sub:
+long_sub: len: 18 dest:l src1:l src2:i clob:1
 long_sub_imm:
 long_sub_ovf_un: len:22 dest:l src1:l src2:i clob:1
 long_sub_ovf: len:36 dest:l src1:l src2:i clob:1
index f7f464ad787cafc351f372ea0cdb99fe2b3f9a97..1aad39a1b33a70247bf2eb456682d3e336cc4cb0 100644 (file)
@@ -460,8 +460,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
                *managed = FALSE;
 
        if (ji != NULL) {
-               char *source_location, *tmpaddr, *fname;
-               gint32 address, iloffset;
+               gint32 address;
 
                *new_ctx = *ctx;
 
@@ -479,26 +478,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
                        if (!ji->method->wrapper_type)
                                *managed = TRUE;
 
-               if (trace) {
-                       source_location = mono_debug_source_location_from_address (ji->method, address, NULL, domain);
-                       iloffset = mono_debug_il_offset_from_address (ji->method, address, domain);
-
-                       if (iloffset < 0)
-                               tmpaddr = g_strdup_printf ("<0x%08x>", address);
-                       else
-                               tmpaddr = g_strdup_printf ("[0x%08x]", iloffset);
-               
-                       fname = mono_method_full_name (ji->method, TRUE);
-
-                       if (source_location)
-                               *trace = g_strdup_printf ("in %s (at %s) %s", tmpaddr, source_location, fname);
-                       else
-                               *trace = g_strdup_printf ("in %s %s", tmpaddr, fname);
-
-                       g_free (fname);
-                       g_free (source_location);
-                       g_free (tmpaddr);
-               }
                sframe = (MonoS390StackFrame *) MONO_CONTEXT_GET_SP (ctx);
                MONO_CONTEXT_SET_BP (new_ctx, sframe->prev);
                sframe = (MonoS390StackFrame *) sframe->prev;
@@ -512,9 +491,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
                if (!(*lmf)->method)
                        return (gpointer)-1;
 
-               if (trace)
-                       *trace = g_strdup_printf ("in (unmanaged) %s", mono_method_full_name ((*lmf)->method, TRUE));
-               
                if ((ji = mono_jit_info_table_find (domain, (gpointer)(*lmf)->eip))) {
                } else {
                        memset (res, 0, sizeof (MonoJitInfo));
index 778b048390e8be6d4f9b6ac60f4d84d4acc52236..32c09fa569bc8184311b74f4a989c5906c767104 100644 (file)
@@ -30,8 +30,10 @@ stmt: OP_ENDFILTER (reg) {
        mono_bblock_add_inst (s->cbb, tree);
 }
 
+lreg: OP_LADD (lreg, lreg),
 lreg: OP_LADD_OVF (lreg, lreg),
 lreg: OP_LADD_OVF_UN (lreg, lreg),
+lreg: OP_LSUB (lreg, lreg),
 lreg: OP_LSUB_OVF (lreg, lreg),
 lreg: OP_LSUB_OVF_UN (lreg, lreg) "0" {
        MONO_EMIT_NEW_UNALU (s, OP_SETREG, s390_r0, state->left->reg1);
@@ -42,6 +44,30 @@ lreg: OP_LSUB_OVF_UN (lreg, lreg) "0" {
        mono_bblock_add_inst (s->cbb, tree);
 }
 
+lreg: OP_LADD (lreg, i8con) "0" {
+       MONO_EMIT_NEW_ICONST (s, s390_r0, state->right->tree->inst_ls_word);
+       MONO_EMIT_NEW_ICONST (s, s390_r1, state->right->tree->inst_ms_word);
+       tree->dreg    = state->reg1;
+       tree->sreg1   = state->left->reg1;
+       tree->sreg2   = state->left->reg2;
+       mono_bblock_add_inst (s->cbb, tree);
+}
+
+lreg: OP_LSUB (lreg, i8con) "0" {
+       int rh,rl;
+
+       MONO_EMIT_NEW_UNALU (s, OP_SETREG, s390_r0, state->left->reg1);
+       MONO_EMIT_NEW_UNALU (s, OP_SETREG, s390_r1, state->left->reg2);
+       rh = mono_regstate_next_int (s->rs);
+       MONO_EMIT_NEW_ICONST (s, rh, state->right->tree->inst_ls_word);
+       rl = mono_regstate_next_int (s->rs);
+       MONO_EMIT_NEW_ICONST (s, rl, state->right->tree->inst_ms_word);
+       tree->dreg    = state->reg1;
+       tree->sreg1   = rh;
+       tree->sreg2   = rl;
+       mono_bblock_add_inst (s->cbb, tree);
+}
+
 reg: CEE_ADD_OVF (reg, reg) "0" {
        MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
 }
@@ -528,9 +554,9 @@ stmt: OP_OUTARG_VT (reg) {
                if (start_reg != STK_BASE) {
                        MONO_OUTPUT_VTR (s, size, start_reg, STK_BASE, soffset);
                } else {
+                       treg = mono_regstate_next_int (s->rs);
                        MONO_OUTPUT_VTS (s, size, STK_BASE, soffset, treg,
                                         state->left->tree->inst_offset);
-                       treg = mono_regstate_next_int (s->rs);
                        MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, treg, STK_BASE, 
                                                 s->stack_offset);
                }
index 8b269a84f2ce1e20ef07f5f2e1f5ed66e5657428..58abba9995b4ff8061c85a3d16c36baea067a306 100644 (file)
@@ -2369,16 +2369,18 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size,
                                break;
                }
        } else {
+               short *o[1];
                s390_basr   (code, s390_r13, 0);
                s390_j      (code, 10);
                s390_llong  (code, 0x41e0000000000000);
                s390_llong  (code, 0x41f0000000000000);
                s390_ldr    (code, s390_f15, sreg);
-               s390_cdb    (code, s390_f15, 0, s390_r13, 0);
-               s390_jl     (code, 10);
-               s390_sdb    (code, s390_f15, 0, s390_r13, 8);
+               s390_cdb    (code, s390_f15, 0, s390_r13, 4);
+               s390_jl     (code, 0); CODEPTR(code, o[0]);
+               s390_sdb    (code, s390_f15, 0, s390_r13, 12);
                s390_cfdbr  (code, dreg, 7, s390_f15);
                s390_j      (code, 4);
+               PTRSLOT(code, o[0]);
                s390_cfdbr  (code, dreg, 5, sreg);
                switch (size) {
                        case 1: 
@@ -2821,6 +2823,16 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_CY, "OverflowException");
                }
                        break;
+               case OP_LADD: {
+                       short int *o[1];
+                       s390_alr  (code, s390_r0, ins->sreg1);
+                       s390_jnc  (code, 4);
+                       s390_ahi  (code, s390_r1, 1);
+                       s390_ar   (code, s390_r1, ins->sreg2);
+                       s390_lr   (code, ins->dreg, s390_r0);
+                       s390_lr   (code, ins->dreg+1, s390_r1);
+               }
+                       break;
                case OP_LADD_OVF: {
                        short int *o[1];
                        s390_alr  (code, s390_r0, ins->sreg1);
@@ -2936,8 +2948,18 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_NC, "OverflowException");
                }
                        break;
+               case OP_LSUB: {
+                       s390_lr   (code, s390_r14, ins->sreg2);
+                       s390_slr  (code, s390_r0, ins->sreg1);
+                       s390_jnl  (code, 4);
+                       s390_ahi  (code, s390_r14, 1);
+                       s390_sr   (code, s390_r1, s390_r14);
+                       s390_lr   (code, ins->dreg, s390_r0);
+                       s390_lr   (code, ins->dreg+1, s390_r1);
+               }
+                       break;
                case OP_LSUB_OVF: {
-                       short int *o[3];
+                       short int *o[1];
                        s390_lr   (code, s390_r14, ins->sreg2);
                        s390_slr  (code, s390_r0, ins->sreg1);
                        s390_jnl  (code, 0); CODEPTR(code, o[0]);
index 47b5a7c0b6d676b7f5344ffc76129d0ed3a862cd..cc29d1d508abb366b50589888ddd3d7aa5c0f362 100644 (file)
@@ -163,7 +163,7 @@ typedef struct
 #define MONO_ARCH_USE_SIGACTION        1
 // #define CUSTOM_STACK_WALK           1
 // #define CUSTOM_EXCEPTION_HANDLING   1
-#define mono_find_jit_info             mono_arch_find_jit_info
+// #define mono_find_jit_info          mono_arch_find_jit_info
 
 #define S390_STACK_ALIGNMENT            8
 #define S390_FIRST_ARG_REG             s390_r2