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