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