Author: neale
Date: 2006-06-09 15:08:15 -0400 (Fri, 09 Jun 2006)
New Revision: 61602

Modified:
   trunk/mono/mono/io-layer/atomic.h
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/cpu-s390x.md
   trunk/mono/mono/mini/mini-exceptions.c
   trunk/mono/mono/mini/mini-s390x.c
   trunk/mono/mono/mini/mini-s390x.h
Log:
* mini-exceptions.c (ves_icall_get_frame_info): Fix this function on s390/s390x.
* mono/io-layer/atomic.h: Fix atomic operations for s390x (not really broken 
but changed to use full 64-bit opcodes).
* mono/mini/mini-s390x.c: Correct ATOMIC operations (incorrect register for CS
instruction).
* mono/mini/mini-s390x.h: Simplify MCONTEXT_GET_BP.
* mono/mini/cpu-s390x.md: Fix max. length values for a couple of instructions.


Modified: trunk/mono/mono/io-layer/atomic.h
===================================================================
--- trunk/mono/mono/io-layer/atomic.h   2006-06-09 18:31:40 UTC (rev 61601)
+++ trunk/mono/mono/io-layer/atomic.h   2006-06-09 19:08:15 UTC (rev 61602)
@@ -339,7 +339,7 @@
        gpointer old;
 
        __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "0:\tLG\t%1,%0\n"
+                             "0:\tLGF\t%1,%0\n"
                              "\tCGR\t%1,%3\n"
                              "\tJNE\t1f\n"
                              "\tCSG\t%1,%2,0(1)\n"
@@ -353,7 +353,7 @@
 }
 # endif
 
-
+# ifndef __s390x__
 static inline gint32 
 InterlockedIncrement(volatile gint32 *val)
 {
@@ -371,7 +371,27 @@
 
        return(tmp);
 }
+# else
+static inline gint32 
+InterlockedIncrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tLGF\t%0,%1\n"
+                             "\tLGFR\t1,%0\n"
+                             "\tAGHI\t1,1\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b\n"
+                             "\tLGFR\t%0,1"
+                             : "=r" (tmp), "+m" (*val)
+                             : : "1", "2", "cc");
 
+       return(tmp);
+}
+# endif
+
+# ifndef __s390x__
 static inline gint32 
 InterlockedDecrement(volatile gint32 *val)
 {
@@ -389,7 +409,25 @@
 
        return(tmp);
 }
+# else
+static inline gint32 
+InterlockedDecrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tLGF\t%0,%1\n"
+                             "\tLGFR\t1,%0\n"
+                             "\tAGHI\t1,-1\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b\n"
+                             "\tLGFR\t%0,1"
+                             : "=r" (tmp), "+m" (*val)
+                             : : "1", "2", "cc");
 
+       return(tmp);
+}
+# endif
 
 static inline gint32 
 InterlockedExchange(volatile gint32 *val, gint32 new_val)
@@ -430,7 +468,7 @@
        gpointer ret;
        
        __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "0:\tLG\t%1,%0\n"
+                             "0:\tLGF\t%1,%0\n"
                              "\tCSG\t%1,%2,0(1)\n"
                              "\tJNZ\t0b"
                              : "+m" (*val), "=r" (ret)
@@ -441,6 +479,7 @@
 }
 # endif
 
+# ifndef __s390x__
 static inline gint32 
 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
 {
@@ -458,7 +497,26 @@
        
        return(ret);
 }
+# else
+static inline gint32 
+InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+{
+       gint32 ret;
 
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tLGF\t%0,%1\n"
+                             "\tLGFR\t1,%0\n"
+                             "\tAGR\t1,%2\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b"
+                             : "=r" (ret), "+m" (*val)
+                             : "r" (add) 
+                             : "1", "2", "cc");
+       
+       return(ret);
+}
+# endif
+
 #elif defined(__ppc__) || defined (__powerpc__)
 #define WAPI_ATOMIC_ASM
 

Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2006-06-09 18:31:40 UTC (rev 61601)
+++ trunk/mono/mono/mini/ChangeLog      2006-06-09 19:08:15 UTC (rev 61602)
@@ -1,3 +1,13 @@
+2006-06-09  Neale Ferguson <[EMAIL PROTECTED]>
+
+       * mini-exceptions.c (ves_icall_get_frame_info): Fix this function on 
s390/s390x.
+       * mono/io-layer/atomic.h: Fix atomic operations for s390x (not really 
broken 
+       but changed to use full 64-bit opcodes).
+       * mono/mini/mini-s390x.c: Correct ATOMIC operations (incorrect register 
for CS
+       instruction).
+       * mono/mini/mini-s390x.h: Simplify MCONTEXT_GET_BP.
+       * mono/mini/cpu-s390x.md: Fix max. length values for a couple of 
instructions.
+
 2006-06-09  Jonathan Chambers  <[EMAIL PROTECTED]>
 
        * mini-exceptions.c: Minor fix for building mono in Visual Studio.

Modified: trunk/mono/mono/mini/cpu-s390x.md
===================================================================
--- trunk/mono/mono/mini/cpu-s390x.md   2006-06-09 18:31:40 UTC (rev 61601)
+++ trunk/mono/mono/mini/cpu-s390x.md   2006-06-09 19:08:15 UTC (rev 61602)
@@ -60,12 +60,12 @@
 aot_const: dest:i len:8
 arg:
 arglist:
-atomic_add_i4: src1:b src2:i dest:i len:20
+atomic_add_i4: src1:b src2:i dest:i len:28
 atomic_add_i8: src1:b src2:i dest:i len:30
-atomic_add_new_i4: src1:b src2:i dest:i len:20
+atomic_add_new_i4: src1:b src2:i dest:i len:28
 atomic_add_new_i8: src1:b src2:i dest:i len:30
-atomic_exchange_i4: src1:b src2:i dest:i len:14
-atomic_exchange_i8: src1:b src2:i dest:i len:20
+atomic_exchange_i4: src1:b src2:i dest:i len:18
+atomic_exchange_i8: src1:b src2:i dest:i len:24
 beq.s:
 beq: len:8
 bge.s:
@@ -269,7 +269,7 @@
 int_div_un: dest:a src1:i src2:i len:16
 int_div_un_imm: dest:a src1:i len:24
 int_mul: dest:i src1:i src2:i len:16
-int_mul_imm: dest:i src1:i len:20
+int_mul_imm: dest:i src1:i len:24
 int_mul_ovf: dest:i src1:i src2:i len:44
 int_mul_ovf_un: dest:i src1:i src2:i len:22
 int_neg: dest:i src1:i len:12

Modified: trunk/mono/mono/mini/mini-exceptions.c
===================================================================
--- trunk/mono/mono/mini/mini-exceptions.c      2006-06-09 18:31:40 UTC (rev 
61601)
+++ trunk/mono/mono/mini/mini-exceptions.c      2006-06-09 19:08:15 UTC (rev 
61602)
@@ -349,9 +349,9 @@
        /* 
         * FIXME: This is needed because of the LMF stuff which doesn't exist 
on ia64.
         * Probably the whole mono_find_jit_info () stuff needs to be fixed so 
this isn't
-        * needed even on other platforms.
+        * needed even on other platforms. This is also true for s390/s390x.
         */
-#ifndef __ia64__
+#if    !defined(__ia64__) && !defined(__s390__) && !defined(__s390x__)
        skip++;
 #endif
 

Modified: trunk/mono/mono/mini/mini-s390x.c
===================================================================
--- trunk/mono/mono/mini/mini-s390x.c   2006-06-09 18:31:40 UTC (rev 61601)
+++ trunk/mono/mono/mini/mini-s390x.c   2006-06-09 19:08:15 UTC (rev 61602)
@@ -4107,18 +4107,18 @@
                case OP_ATOMIC_ADD_I8: {
                        s390_lgr (code, s390_r1, ins->sreg2);
                        s390_lg  (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_ag  (code, s390_r1, 0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_csg (code, s390_r0, s390_r0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_jnz (code, -11);
+                       s390_agr (code, s390_r1, s390_r0);
+                       s390_csg (code, s390_r0, s390_r1, ins->inst_basereg, 
ins->inst_offset);
+                       s390_jnz (code, -10);
                        s390_lgr (code, ins->dreg, s390_r1);
                }
                        break;  
                case OP_ATOMIC_ADD_NEW_I8: {
                        s390_lgr (code, s390_r1, ins->sreg2);
                        s390_lg  (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_ag  (code, s390_r1, 0, ins->inst_basereg, 
ins->inst_offset);
+                       s390_agr (code, s390_r1, s390_r0);
                        s390_csg (code, s390_r0, s390_r1, ins->inst_basereg, 
ins->inst_offset);
-                       s390_jnz (code, -11);
+                       s390_jnz (code, -10);
                        s390_lgr (code, ins->dreg, s390_r1);
                }
                        break;  
@@ -4130,28 +4130,28 @@
                }
                        break;  
                case OP_ATOMIC_ADD_I4: {
-                       s390_lr  (code, s390_r1, ins->sreg2);
-                       s390_l   (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_a   (code, s390_r1, 0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_cs  (code, s390_r0, s390_r0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_jnz (code, -7);
-                       s390_lr  (code, ins->dreg, s390_r1);
+                       s390_lgfr(code, s390_r1, ins->sreg2);
+                       s390_lgf (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
+                       s390_agr (code, s390_r1, s390_r0);
+                       s390_cs  (code, s390_r0, s390_r1, ins->inst_basereg, 
ins->inst_offset);
+                       s390_jnz (code, -9);
+                       s390_lgfr(code, ins->dreg, s390_r1);
                }
                        break;  
                case OP_ATOMIC_ADD_NEW_I4: {
-                       s390_lr  (code, s390_r1, ins->sreg2);
-                       s390_l   (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
-                       s390_a   (code, s390_r1, 0, ins->inst_basereg, 
ins->inst_offset);
+                       s390_lgfr(code, s390_r1, ins->sreg2);
+                       s390_lgf (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
+                       s390_agr (code, s390_r1, s390_r0);
                        s390_cs  (code, s390_r0, s390_r1, ins->inst_basereg, 
ins->inst_offset);
-                       s390_jnz (code, -7);
-                       s390_lr  (code, ins->dreg, s390_r1);
+                       s390_jnz (code, -9);
+                       s390_lgfr(code, ins->dreg, s390_r1);
                }
                        break;  
                case OP_ATOMIC_EXCHANGE_I4: {
-                       s390_l   (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
+                       s390_lg  (code, s390_r0, 0, ins->inst_basereg, 
ins->inst_offset);
                        s390_cs  (code, s390_r0, ins->sreg2, ins->inst_basereg, 
ins->inst_offset);
                        s390_jnz (code, -4);
-                       s390_lr  (code, ins->dreg, s390_r0);
+                       s390_lgfr(code, ins->dreg, s390_r0);
                }
                        break;  
                case OP_S390_BKCHAIN: {

Modified: trunk/mono/mono/mini/mini-s390x.h
===================================================================
--- trunk/mono/mono/mini/mini-s390x.h   2006-06-09 18:31:40 UTC (rev 61601)
+++ trunk/mono/mono/mini/mini-s390x.h   2006-06-09 19:08:15 UTC (rev 61602)
@@ -265,7 +265,7 @@
 
 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do {                     \
                MonoS390StackFrame *sframe;                             \
-               __asm__ volatile("lg    %0,0(15)" : "=r" (sframe));     \
+               __asm__ volatile("lgr   %0,15" : "=r" (sframe));        \
                MONO_CONTEXT_SET_BP ((ctx), sframe->prev);              \
                sframe = (MonoS390StackFrame*)sframe->prev;             \
                MONO_CONTEXT_SET_IP ((ctx), sframe->return_address);    \

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

Reply via email to