Author: miguel
Date: 2006-06-15 18:38:50 -0400 (Thu, 15 Jun 2006)
New Revision: 61783

Modified:
   branches/mono-1-1-13/mono/mono/arch/s390x/ChangeLog
   branches/mono-1-1-13/mono/mono/io-layer/ChangeLog
   branches/mono-1-1-13/mono/mono/io-layer/atomic.h
   branches/mono-1-1-13/mono/mono/mini/cpu-s390.md
   branches/mono-1-1-13/mono/mono/mini/cpu-s390x.md
   branches/mono-1-1-13/mono/mono/mini/mini-exceptions.c
   branches/mono-1-1-13/mono/mono/mini/mini-s390.c
   branches/mono-1-1-13/mono/mono/mini/mini-s390.h
   branches/mono-1-1-13/mono/mono/mini/mini-s390x.c
   branches/mono-1-1-13/mono/mono/mini/mini-s390x.h
Log:
Backport of s390 code from trunk revisions:

57902-e  57911-e  57914  58042  58087  61602  61603

It includes two additional patches from Neale for the interlocked 
compare and exchange routines.




Modified: branches/mono-1-1-13/mono/mono/arch/s390x/ChangeLog
===================================================================
--- branches/mono-1-1-13/mono/mono/arch/s390x/ChangeLog 2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/arch/s390x/ChangeLog 2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -1,3 +1,7 @@
+2006-03-13     Neale Ferguson <[EMAIL PROTECTED]>
+
+       * s390x-codegen.h: Fix immediate checks.
+
 2006-01-06     Neale Ferguson <[EMAIL PROTECTED]>
 
        * s390x-codegen.h: Add lpdbr instruction (OP_ABS).

Modified: branches/mono-1-1-13/mono/mono/io-layer/ChangeLog
===================================================================
--- branches/mono-1-1-13/mono/mono/io-layer/ChangeLog   2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/io-layer/ChangeLog   2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -1,3 +1,9 @@
+2006-06-14 Neale Ferguson <[EMAIL PROTECTED]>
+
+       * atomic.h: Fix atomic exchange pointer operations for s390x - these
+       were broken as they used 32-bit instructions rather than their 64-bit
+       versions.
+
 2006-06-14  Dick Porter  <[EMAIL PROTECTED]>
 
        * processes.c: Don't run the atexit handlers when bailing out
@@ -7,6 +13,11 @@
 
        * wait.c: Fix stupid typo shown up by gcc 4.1.1, = not ==
 
+2006-06-09 Neale Ferguson <[EMAIL PROTECTED]>
+ 
+       * atomic.h: Fix atomic operations for s390x (not really broken 
+       but changed to use full 64-bit opcodes).
+       
 2006-05-24  Dick Porter  <[EMAIL PROTECTED]>
 
        * processes.c (process_set_current): Don't take an extra reference

Modified: branches/mono-1-1-13/mono/mono/io-layer/atomic.h
===================================================================
--- branches/mono-1-1-13/mono/mono/io-layer/atomic.h    2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/io-layer/atomic.h    2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -326,21 +326,17 @@
        gpointer old;
 
        __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "0:\tLG\t%1,%0\n"
-                             "\tCGR\t%1,%3\n"
-                             "\tJNE\t1f\n"
-                             "\tCSG\t%1,%2,0(1)\n"
-                             "\tJNZ\t0b\n"
-                             "1:\n"
-                             : "+m" (*dest), "=r" (old)
-                             : "r" (exch), "r" (comp)
-                             : "1", "cc");
+                               "\tLGR\t%1,%3\n"
+                               "\tCSG\t%1,%2,0(1)\n"
+                               : "+m" (*dest), "=r" (old)
+                               : "r" (exch), "r" (comp)
+                               : "1", "cc");
 
        return(old);
 }
 # endif
 
-
+# ifndef __s390x__
 static inline gint32 
 InterlockedIncrement(volatile gint32 *val)
 {
@@ -358,7 +354,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)
 {
@@ -376,7 +392,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)
@@ -428,6 +462,7 @@
 }
 # endif
 
+# ifndef __s390x__
 static inline gint32 
 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
 {
@@ -445,7 +480,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: branches/mono-1-1-13/mono/mono/mini/cpu-s390.md
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/cpu-s390.md     2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/cpu-s390.md     2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -152,7 +152,7 @@
 conv.r4: dest:f src1:i len:4
 conv.r8: dest:f src1:i len:4
 conv.u1: dest:i src1:i len:8
-conv.u2: dest:i src1:i len:14
+conv.u2: dest:i src1:i len:16
 conv.u4: dest:i src1:i
 conv.u8:
 conv.u: dest:i src1:i len:4

Modified: branches/mono-1-1-13/mono/mono/mini/cpu-s390x.md
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/cpu-s390x.md    2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/cpu-s390x.md    2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -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: branches/mono-1-1-13/mono/mono/mini/mini-exceptions.c
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/mini-exceptions.c       2006-06-15 
22:27:20 UTC (rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/mini-exceptions.c       2006-06-15 
22:38:50 UTC (rev 61783)
@@ -361,9 +361,20 @@
 
        mono_arch_flush_register_windows ();
 
+#ifdef MONO_INIT_CONTEXT_FROM_CURRENT
+       MONO_INIT_CONTEXT_FROM_CURRENT (&ctx);
+#else
        MONO_INIT_CONTEXT_FROM_FUNC (&ctx, ves_icall_get_frame_info);
+#endif
 
+       /* 
+        * 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. This is also true for s390/s390x.
+        */
+#if    !defined(__ia64__) && !defined(__s390__) && !defined(__s390x__)
        skip++;
+#endif
 
        do {
                ji = mono_find_jit_info (domain, jit_tls, &rji, NULL, &ctx, 
&new_ctx, NULL, &lmf, native_offset, NULL);

Modified: branches/mono-1-1-13/mono/mono/mini/mini-s390.c
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/mini-s390.c     2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/mini-s390.c     2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -239,7 +239,6 @@
 /*                   P r o t o t y p e s                            */
 /*------------------------------------------------------------------*/
 
-static guint8 * emit_memcpy (guint8 *, int, int, int, int, int);
 static void indent (int);
 static guint8 * backUpStackPtr(MonoCompile *, guint8 *, gint);
 static void decodeParm (MonoType *, void *, int);
@@ -342,56 +341,6 @@
 
 /*------------------------------------------------------------------*/
 /*                                                                  */
-/* Name                - emit_memcpy                                       */
-/*                                                                  */
-/* Function    - Emit code to move from memory-to-memory based on  */
-/*               the size of the variable. r0 is overwritten.      */
-/*                                                                  */
-/*------------------------------------------------------------------*/
-
-static guint8 *
-emit_memcpy (guint8 *code, int size, int dreg, int doffset, int sreg, int 
soffset)
-{
-       switch (size) {
-               case 4 :
-                       s390_l  (code, s390_r0, 0, sreg, soffset);
-                       s390_st (code, s390_r0, 0, dreg, doffset);
-                       break;
-
-               case 3 : 
-                       s390_icm  (code, s390_r0, 14, sreg, soffset);
-                       s390_stcm (code, s390_r0, 14, dreg, doffset);
-                       break;
-
-               case 2 : 
-                       s390_lh  (code, s390_r0, 0, sreg, soffset);
-                       s390_sth (code, s390_r0, 0, dreg, doffset);
-                       break;
-
-               case 1 : 
-                       s390_ic  (code, s390_r0, 0, sreg, soffset);
-                       s390_stc (code, s390_r0, 0, dreg, doffset);
-                       break;
-       
-               default : 
-                       while (size > 0) {
-                               int len;
-
-                               if (size > 256) 
-                                       len = 256;
-                               else
-                                       len = size;
-                               s390_mvc (code, len, dreg, doffset, sreg, 
soffset);
-                               size -= len;
-                       }
-       }
-       return code;
-}
-
-/*========================= End of Function ========================*/
-
-/*------------------------------------------------------------------*/
-/*                                                                  */
 /* Name                - arch_get_argument_info                            */
 /*                                                                  */
 /* Function    - Gathers information on parameters such as size,   */
@@ -2735,10 +2684,6 @@
                        }
                }
                        break;
-               case OP_X86_TEST_NULL: {
-                       s390_ltr (code, ins->sreg1, ins->sreg1);
-               }
-                       break;
                case CEE_BREAK: {
                        mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_ABS, 
mono_arch_break);
                         s390_brasl (code, s390_r14, 0);
@@ -3984,7 +3929,7 @@
                        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_cs  (code, s390_r0, s390_r1, ins->inst_basereg, 
ins->inst_offset);
                        s390_jnz (code, -7);
                        s390_lr  (code, ins->dreg, s390_r1);
                }

Modified: branches/mono-1-1-13/mono/mono/mini/mini-s390.h
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/mini-s390.h     2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/mini-s390.h     2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -254,7 +254,7 @@
 
 #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do {                     \
                MonoS390StackFrame *sframe;                             \
-               __asm__ volatile("l     %0,0(15)" : "=r" (sframe));     \
+               __asm__ volatile("lr    %0,15" : "=r" (sframe));        \
                MONO_CONTEXT_SET_BP ((ctx), sframe->prev);              \
                sframe = (MonoS390StackFrame*)sframe->prev;             \
                MONO_CONTEXT_SET_IP ((ctx), sframe->return_address);    \

Modified: branches/mono-1-1-13/mono/mono/mini/mini-s390x.c
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/mini-s390x.c    2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/mini-s390x.c    2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -599,7 +599,7 @@
                                        printf("%p [%p] ",obj,curParm);
                                        if (class == 
mono_defaults.string_class) {
                                                printf("[STRING:%p:%s]", 
-                                                      *obj, 
mono_string_to_utf8 (obj));
+                                                      obj, mono_string_to_utf8 
(obj));
                                        } else if (class == 
mono_defaults.int32_class) { 
                                                printf("[INT32:%p:%d]", 
                                                        obj, *(gint32 *)((char 
*)obj + sizeof (MonoObject)));
@@ -4111,18 +4111,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;  
@@ -4134,28 +4134,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: branches/mono-1-1-13/mono/mono/mini/mini-s390x.h
===================================================================
--- branches/mono-1-1-13/mono/mono/mini/mini-s390x.h    2006-06-15 22:27:20 UTC 
(rev 61782)
+++ branches/mono-1-1-13/mono/mono/mini/mini-s390x.h    2006-06-15 22:38:50 UTC 
(rev 61783)
@@ -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