From 99126cace2a4a6344e45e11a64aa574a07865f5c Mon Sep 17 00:00:00 2001 From: neale Date: Tue, 23 Jun 2009 23:55:26 +0000 Subject: [PATCH] Fix LCONV_TO_xx and ICONV_TO_xx. Fix leave_method dump of returned structure. Fix formatting. Correct instruction lengths. Add new instructions. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mono@136748 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- mono/arch/s390x/ChangeLog | 4 + mono/arch/s390x/s390x-codegen.h | 8 ++ mono/mini/ChangeLog | 7 ++ mono/mini/cpu-s390x.md | 14 +-- mono/mini/mini-s390.c | 22 ++++- mono/mini/mini-s390x.c | 198 +++++++++++++++++++++++++--------------- 6 files changed, 168 insertions(+), 85 deletions(-) diff --git a/mono/arch/s390x/ChangeLog b/mono/arch/s390x/ChangeLog index e53ab6e30..d35967b02 100644 --- a/mono/arch/s390x/ChangeLog +++ b/mono/arch/s390x/ChangeLog @@ -1,3 +1,7 @@ +2009-06-24 Neale Ferguson + + * s390x-codegen.h: Add some new instructions. + 2007-04-12 Neale Ferguson * tramp.c: Add MONO_TYPE_PTR case. diff --git a/mono/arch/s390x/s390x-codegen.h b/mono/arch/s390x/s390x-codegen.h index 6ae7058e6..6af46dbf2 100644 --- a/mono/arch/s390x/s390x-codegen.h +++ b/mono/arch/s390x/s390x-codegen.h @@ -659,6 +659,7 @@ typedef struct { #define s390_lam(c, r1, r2, b, d) S390_RS_1(c, 0x9a, r1, r2, b, d) #define s390_larl(c, r, o) S390_RIL_1(c, 0xc00, r, o) #define s390_lb(c, r, x, b, d) S390_RXY(c, 0xe376, r, x, b, d) +#define s390_lbr(c, r1, r2) S390_RRE(c, 0xb926, r1, r2) #define s390_lcdbr(c, r1, r2) S390_RRE(c, 0xb313, r1, r2) #define s390_lcgr(c, r1, r2) S390_RRE(c, 0xb903, r1, r2) #define s390_lcr(c, r1, r2) S390_RR(c, 0x13, r1, r2) @@ -672,6 +673,7 @@ typedef struct { #define s390_ler(c, r1, r2) S390_RR(c, 0x38, r1, r2) #define s390_ley(c, r, x, b, d) S390_RXY(c, 0xed64, r, x, b, d) #define s390_lgb(c, r, x, b, d) S390_RXY(c, 0xe377, r, x, b, d) +#define s390_lgbr(c, r1, r2) S390_RRE(c, 0xb906, r1, r2) #define s390_lg(c, r, x, b, d) S390_RXY(c, 0xe304, r, x, b, d) #define s390_lgf(c, r, x, b, d) S390_RXY(c, 0xe314, r, x, b, d) #define s390_lgfr(c, r1, r2) S390_RRE(c, 0xb914, r1, r2) @@ -679,13 +681,19 @@ typedef struct { #define s390_lghi(c, r, v) S390_RI(c, 0xa79, r, v) #define s390_lgr(c, r1, r2) S390_RRE(c, 0xb904, r1, r2) #define s390_lh(c, r, x, b, d) S390_RX(c, 0x48, r, x, b, d) +#define s390_lhr(c, r1, r2) S390_RRE(c, 0xb927, r1, r2) #define s390_lhg(c, r, x, b, d) S390_RXY(c, 0xe315, r, x, b, d) +#define s390_lghr(c, r1, r2) S390_RRE(c, 0xb907, r1, r2) #define s390_lhi(c, r, v) S390_RI(c, 0xa78, r, v) #define s390_lhy(c, r, x, b, d) S390_RXY(c, 0xe378, r, x, b, d) +#define s390_llcr(c, r1, r2) S390_RRE(c, 0xb994, r1, r2) #define s390_llgc(c, r, x, b, d) S390_RXY(c, 0xe390, r, x, b, d) +#define s390_llgcr(c, r1, r2) S390_RRE(c, 0xb984, r1, r2) #define s390_llgf(c, r, x, b, d) S390_RXY(c, 0xe316, r, x, b, d) #define s390_llgfr(c, r1, r2) S390_RRE(c, 0xb916, r1, r2) #define s390_llgh(c, r, x, b, d) S390_RXY(c, 0xe391, r, x, b, d) +#define s390_llghr(c, r1, r2) S390_RRE(c, 0xb985, r1, r2) +#define s390_llhr(c, r1, r2) S390_RRE(c, 0xb995, r1, r2) #define s390_lm(c, r1, r2, b, d) S390_RS_1(c, 0x98, r1, r2, b, d) #define s390_lmg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb04, r1, r2, b, d) #define s390_lndbr(c, r1, r2) S390_RRE(c, 0xb311, r1, r2) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index 220a14048..ad5865a5e 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,10 @@ +2009-06-24 Neale Ferguson + + * mini-s390x.c: Correct LCONV_TO_Ix and ICONV_TO_Ix routines. Fix leave_method + dump of structure return value. Fix some formatting. + * cpu-s390x.md: Fix lengths of instruction sequences. + * mini-s390.c: Minor formatting changes. + 2009-06-24 Zoltan Varga * mini-x86.h: Applied patch from Romain Tartiere (romain@blogreen.org). diff --git a/mono/mini/cpu-s390x.md b/mono/mini/cpu-s390x.md index 262f2018e..beb01966c 100644 --- a/mono/mini/cpu-s390x.md +++ b/mono/mini/cpu-s390x.md @@ -139,7 +139,7 @@ icompare_imm: src1:i len:14 iconst: dest:i len:40 -jmp: len:40 +jmp: len:46 label: len:0 lcall: dest:o len:22 clob:c lcall_membase: dest:o src1:b len:12 clob:c @@ -296,8 +296,8 @@ long_sub_imm: dest:i src1:i len:16 long_sub_ovf: dest:i src1:i src2:i len:16 long_sub_ovf_un: dest:i src1:i src2:i len:28 -long_conv_to_i1: dest:i src1:i len:30 -long_conv_to_i2: dest:i src1:i len:36 +long_conv_to_i1: dest:i src1:i len:12 +long_conv_to_i2: dest:i src1:i len:12 long_conv_to_i4: dest:i src1:i len:4 long_conv_to_i8: dest:i src1:i len:4 long_conv_to_i: dest:i src1:i len:4 @@ -307,7 +307,7 @@ long_conv_to_ovf_u4: dest:i src1:i len:48 long_conv_to_ovf_u8_un: dest:i src1:i len:4 long_conv_to_r4: dest:f src1:i len:16 long_conv_to_r8: dest:f src1:i len:16 -long_conv_to_u1: dest:i src1:i len:14 +long_conv_to_u1: dest:i src1:i len:16 long_conv_to_u2: dest:i src1:i len:24 long_conv_to_u4: dest:i src1:i len:4 long_conv_to_u8: dest:i src1:i len:4 @@ -333,11 +333,11 @@ not_null: src1:i len:0 jump_table: dest:i len:24 -int_conv_to_i1: dest:i src1:i len:26 -int_conv_to_i2: dest:i src1:i len:26 +int_conv_to_i1: dest:i src1:i len:12 +int_conv_to_i2: dest:i src1:i len:12 int_conv_to_i4: dest:i src1:i len:2 int_conv_to_i: dest:i src1:i len:2 -int_conv_to_u1: dest:i src1:i len:8 +int_conv_to_u1: dest:i src1:i len:10 int_conv_to_u2: dest:i src1:i len:16 int_conv_to_u4: dest:i src1:i int_conv_to_r_un: dest:f src1:i len:37 diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c index 19d0f7ef9..d36cded9f 100644 --- a/mono/mini/mini-s390.c +++ b/mono/mini/mini-s390.c @@ -4978,7 +4978,7 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_emit_inst_for_method */ +/* Name - mono_arch_emit_inst_for_method */ /* */ /*------------------------------------------------------------------*/ @@ -4990,6 +4990,12 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_decompose_opts */ +/* */ +/*------------------------------------------------------------------*/ + void mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) { @@ -5015,7 +5021,7 @@ mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_decompose_long_opts */ +/* Name - mono_arch_decompose_long_opts */ /* */ /*------------------------------------------------------------------*/ @@ -5283,6 +5289,16 @@ mono_arch_get_patch_offset (guint8 *code) /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_context_get_int_reg. */ +/* */ +/* Function - Dummy entry point until s390x supports aot. */ +/* */ +/* Returns - Pointer to intreg. */ +/* */ +/*------------------------------------------------------------------*/ + gpointer mono_arch_context_get_int_reg (MonoContext *ctx, int reg) { @@ -5290,3 +5306,5 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg) g_assert_not_reached (); return NULL; } + +/*========================= End of Function ========================*/ diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c index e7a030799..623602445 100644 --- a/mono/mini/mini-s390x.c +++ b/mono/mini/mini-s390x.c @@ -474,7 +474,7 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, for (k = 0; k < param_count; k++) { if (csig->pinvoke) - size = mono_type_native_stack_size (csig->params [k], &align); + size = mono_type_native_stack_size (csig->params [k], (guint32 *) &align); else size = mini_type_stack_size (NULL, csig->params [k], &align); @@ -993,8 +993,7 @@ handle_enum: type = mono_class_enum_basetype (type->data.klass); goto handle_enum; } else { - guint8 *p = va_arg (ap, gpointer); - int j, size, align; + int size, align; info = mono_marshal_load_type_info (type->data.klass); @@ -1016,17 +1015,30 @@ handle_enum: size = mono_type_size (type, &align); switch (size) { - case 1: - case 2: - case 4: - case 8: - printf ("["); - for (j = 0; p && j < size; j++) - printf ("%02x,", p [j]); - printf ("]\n"); - break; - default: - printf ("[VALUETYPE]\n"); + case 1: { + guint32 p = va_arg (ap, guint32); + printf ("[%02x]\n",p); + break; + } + case 2: { + guint32 p = va_arg (ap, guint32); + printf ("[%04x]\n",p); + break; + } + case 4: { + guint32 p = va_arg (ap, guint32); + printf ("[%08x]\n",p); + break; + } + case 8: { + guint64 p = va_arg (ap, guint64); + printf ("[%016lx]\n",p); + break; + } + default: { + gpointer p = va_arg (ap, gpointer); + printf ("[VALUETYPE] %p\n",p); + } } } break; @@ -1743,7 +1755,7 @@ mono_arch_allocate_vars (MonoCompile *cfg) MonoMethodHeader *header; MonoInst *inst; CallInfo *cinfo; - int iParm, iVar, offset, size, align, curinst; + int iParm, iVar, offset, align, size, curinst; int frame_reg = STK_BASE; int sArg, eArg; @@ -1928,7 +1940,8 @@ mono_arch_allocate_vars (MonoCompile *cfg) /* call functions returning structure */ /*--------------------------------------------------*/ if (inst->backend.is_pinvoke && MONO_TYPE_ISSTRUCT (inst->inst_vtype)) - size = mono_class_native_size (mono_class_from_mono_type(inst->inst_vtype), &align); + size = mono_class_native_size (mono_class_from_mono_type(inst->inst_vtype), + (guint32 *) &align); else size = mono_type_size (inst->inst_vtype, &align); @@ -2089,9 +2102,9 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) } for (i = 0; i < n; ++i) { - ainfo = cinfo->args + i; MonoType *t; + ainfo = cinfo->args + i; if (i >= sig->hasthis) t = sig->params [i - sig->hasthis]; else @@ -2582,7 +2595,7 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, { /* sreg is a float, dreg is an integer reg. */ if (is_signed) { - s390_cfdbr (code, dreg, 5, sreg); + s390_cgdbr (code, dreg, 5, sreg); switch (size) { case 1: s390_lghi (code, s390_r0, 0); @@ -2625,7 +2638,17 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, /*========================= End of Function ========================*/ -static gboolean is_unsigned (MonoInst *next) +/*------------------------------------------------------------------*/ +/* */ +/* Name - gboolean_is_unsigned. */ +/* */ +/* Function - Return TRUE if next opcode is checking for un- */ +/* signed value. */ +/* */ +/*------------------------------------------------------------------*/ + +static +gboolean is_unsigned (MonoInst *next) { if ((next) && (((next->opcode >= OP_IBNE_UN) && @@ -2647,6 +2670,8 @@ static gboolean is_unsigned (MonoInst *next) return FALSE; } +/*========================= End of Function ========================*/ + /*------------------------------------------------------------------*/ /* */ /* Name - mono_arch_output_basic_block */ @@ -2798,89 +2823,90 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } break; case OP_LCONV_TO_I1: { - s390_lghi (code, s390_r0, 0x80); - if (ins->dreg != ins->sreg1) { - s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, s390_r0, ins->sreg1); - s390_jz (code, 9); - s390_lghi (code, s390_r13, -1); - s390_sllg (code, s390_r13, s390_r13, 0, 8); - s390_ogr (code, ins->dreg, s390_r13); +#if 0 + s390_lgbr (code, ins->dreg, ins->sreg1); +#else + s390_sllg (code, ins->dreg, ins->sreg1, 0, 56); + s390_srag (code, ins->dreg, ins->dreg, 0, 56); +#endif } break; case OP_LCONV_TO_I2: { - s390_lghi (code, s390_r0, 0x80); - s390_sllg (code, s390_r0, s390_r0, 0, 8); - if (ins->dreg != ins->sreg1) { - s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, s390_r0, ins->sreg1); - s390_jz (code, 9); - s390_lghi (code, s390_r13, -1); - s390_sllg (code, s390_r13, s390_r13, 0, 16); - s390_ogr (code, ins->dreg, s390_r13); +#if 0 + s390_lghr (code, ins->dreg, ins->sreg1); +#else + s390_sllg (code, ins->dreg, ins->sreg1, 0, 48); + s390_srag (code, ins->dreg, ins->dreg, 0, 48); +#endif } break; case OP_LCONV_TO_U1: { - s390_lghi (code, s390_r0, 0xff); - if (ins->dreg != ins->sreg1) { +#if 0 + s390_llghr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, ins->dreg, s390_r0); + s390_lghi (code, s390_r0, 0xff); + s390_ngr (code, ins->dreg, s390_r0); +#endif } break; case OP_LCONV_TO_U2: { - s390_lghi (code, s390_r0, -1); - s390_sllg (code, s390_r0, s390_r0, 0, 48); - s390_srlg (code, s390_r0, s390_r0, 0, 48); - if (ins->dreg != ins->sreg1) { +#if 0 + s390_llghr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, ins->dreg, s390_r0); + s390_lghi (code, s390_r0, -1); + s390_srlg (code, s390_r0, s390_r0, 0, 48); + s390_ngr (code, ins->dreg, s390_r0); +#endif } break; case OP_ICONV_TO_I1: { - s390_lhi (code, s390_r0, 0x80); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, s390_r0, ins->sreg1); - s390_jz (code, 7); - s390_lhi (code, s390_r13, -1); - s390_sll (code, s390_r13, 0, 8); - s390_or (code, ins->dreg, s390_r13); +#if 0 + s390_lbr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); + s390_sll (code, ins->dreg, 0, 24); + s390_sra (code, ins->dreg, 0, 24); + +#endif } break; case OP_ICONV_TO_I2: { - s390_lhi (code, s390_r0, 0x80); - s390_sll (code, s390_r0, 0, 8); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, s390_r0, ins->sreg1); - s390_jz (code, 7); - s390_lhi (code, s390_r13, -1); - s390_sll (code, s390_r13, 0, 16); - s390_or (code, ins->dreg, s390_r13); +#if 0 + s390_lhr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); + s390_sll (code, ins->dreg, 0, 16); + s390_sra (code, ins->dreg, 0, 16); +#endif } break; case OP_ICONV_TO_U1: { +#if 0 + s390_llcr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); s390_lhi (code, s390_r0, 0xff); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, ins->dreg, s390_r0); + s390_nr (code, ins->dreg, s390_r0); +#endif } break; case OP_ICONV_TO_U2: { +#if 0 + s390_llhr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); s390_lhi (code, s390_r0, -1); - s390_sll (code, s390_r0, 0, 16); s390_srl (code, s390_r0, 0, 16); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, ins->dreg, s390_r0); + s390_nr (code, ins->dreg, s390_r0); +#endif } break; case OP_COMPARE: @@ -5196,6 +5222,14 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_decompose_opts */ +/* */ +/* Function - Decompose opcode into a System z opcode. */ +/* */ +/*------------------------------------------------------------------*/ + void mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) { @@ -5440,6 +5474,16 @@ mono_arch_get_patch_offset (guint8 *code) /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_context_get_int_reg. */ +/* */ +/* Function - */ +/* */ +/* Returns - Offset for patch. */ +/* */ +/*------------------------------------------------------------------*/ + gpointer mono_arch_context_get_int_reg (MonoContext *ctx, int reg) { @@ -5447,3 +5491,5 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg) g_assert_not_reached (); return NULL; } + +/*========================= End of Function ========================*/ -- 2.11.4.GIT