From 208a76248336ddeb3cf8685c95a7923eb040f8ad Mon Sep 17 00:00:00 2001 From: neale Date: Fri, 9 Jun 2006 19:08:15 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mono@61602 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- mono/io-layer/atomic.h | 64 ++++++++++++++++++++++++++++++++++++++++++--- mono/mini/ChangeLog | 10 +++++++ mono/mini/cpu-s390x.md | 10 +++---- mono/mini/mini-exceptions.c | 4 +-- mono/mini/mini-s390x.c | 36 ++++++++++++------------- mono/mini/mini-s390x.h | 2 +- 6 files changed, 97 insertions(+), 29 deletions(-) diff --git a/mono/io-layer/atomic.h b/mono/io-layer/atomic.h index 5b749bf8e..8269b665a 100644 --- a/mono/io-layer/atomic.h +++ b/mono/io-layer/atomic.h @@ -339,7 +339,7 @@ InterlockedCompareExchangePointer(volatile gpointer *dest, 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 @@ InterlockedCompareExchangePointer(volatile gpointer *dest, } # endif - +# ifndef __s390x__ static inline gint32 InterlockedIncrement(volatile gint32 *val) { @@ -371,7 +371,27 @@ InterlockedIncrement(volatile gint32 *val) 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 @@ InterlockedDecrement(volatile gint32 *val) 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 @@ InterlockedExchangePointer(volatile gpointer *val, gpointer new_val) 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 @@ InterlockedExchangePointer(volatile gpointer *val, gpointer new_val) } # endif +# ifndef __s390x__ static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add) { @@ -458,6 +497,25 @@ InterlockedExchangeAdd(volatile gint32 *val, gint32 add) 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 diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index 1f8cd18fa..2c20a58f1 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,13 @@ +2006-06-09 Neale Ferguson + + * 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 * mini-exceptions.c: Minor fix for building mono in Visual Studio. diff --git a/mono/mini/cpu-s390x.md b/mono/mini/cpu-s390x.md index 2fb2dcb2c..fe5d7f3f2 100644 --- a/mono/mini/cpu-s390x.md +++ b/mono/mini/cpu-s390x.md @@ -60,12 +60,12 @@ and_imm: dest:i src1:i len:24 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_imm: dest:a src1:i len:24 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 diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c index 4831250b0..18ff15488 100644 --- a/mono/mini/mini-exceptions.c +++ b/mono/mini/mini-exceptions.c @@ -349,9 +349,9 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info, /* * 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 diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c index becb840bc..ea8084d42 100644 --- a/mono/mini/mini-s390x.c +++ b/mono/mini/mini-s390x.c @@ -4107,18 +4107,18 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) 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 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } 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: { diff --git a/mono/mini/mini-s390x.h b/mono/mini/mini-s390x.h index 0a2e2169c..69f522a29 100644 --- a/mono/mini/mini-s390x.h +++ b/mono/mini/mini-s390x.h @@ -265,7 +265,7 @@ typedef struct #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); \ -- 2.11.4.GIT