diff --git a/src/mono/mono/mini/cpu-s390x.md b/src/mono/mono/mini/cpu-s390x.md index 2c896b90bdea9..f3196485c13a3 100644 --- a/src/mono/mono/mini/cpu-s390x.md +++ b/src/mono/mono/mini/cpu-s390x.md @@ -96,7 +96,7 @@ fcall_membase: dest:g src1:b len:14 clob:c fcall_reg: dest:g src1:i len:10 clob:c fcompare: src1:f src2:f len:14 rcompare: src1:f src2:f len:14 -float_add: dest:f src1:f src2:f len:6 +float_add: dest:f src1:f src2:f len:8 float_beq: len:10 float_bge: len:10 @@ -129,14 +129,14 @@ float_conv_to_u2: dest:i src1:f len:72 float_conv_to_u4: dest:i src1:f len:72 float_conv_to_u8: dest:i src1:f len:72 float_conv_to_u: dest:i src1:f len:36 -float_div: dest:f src1:f src2:f len:6 -float_div_un: dest:f src1:f src2:f len:6 -float_mul: dest:f src1:f src2:f len:6 -float_neg: dest:f src1:f len:6 -float_not: dest:f src1:f len:6 -float_rem: dest:f src1:f src2:f len:16 -float_rem_un: dest:f src1:f src2:f len:16 -float_sub: dest:f src1:f src2:f len:6 +float_div: dest:f src1:f src2:f len:24 +float_div_un: dest:f src1:f src2:f len:30 +float_mul: dest:f src1:f src2:f len:8 +float_neg: dest:f src1:f len:8 +float_not: dest:f src1:f len:8 +float_rem: dest:f src1:f src2:f len:24 +float_rem_un: dest:f src1:f src2:f len:30 +float_sub: dest:f src1:f src2:f len:24 # R4 opcodes r4_conv_to_i1: dest:i src1:f len:32 @@ -144,16 +144,17 @@ r4_conv_to_u1: dest:i src1:f len:32 r4_conv_to_i2: dest:i src1:f len:32 r4_conv_to_u2: dest:i src1:f len:32 r4_conv_to_i4: dest:i src1:f len:16 +r4_conv_to_i: dest:i src1:f len:16 r4_conv_to_u4: dest:i src1:f len:32 r4_conv_to_i8: dest:i src1:f len:32 r4_conv_to_r8: dest:f src1:f len:17 r4_conv_to_u8: dest:i src1:f len:17 r4_conv_to_r4: dest:f src1:f len:17 -r4_add: dest:f src1:f src2:f clob:1 len:5 -r4_sub: dest:f src1:f src2:f clob:1 len:5 -r4_mul: dest:f src1:f src2:f clob:1 len:5 -r4_div: dest:f src1:f src2:f clob:1 len:5 -r4_rem: dest:f src1:f src2:f clob:1 len:12 +r4_add: dest:f src1:f src2:f clob:1 len:8 +r4_sub: dest:f src1:f src2:f clob:1 len:20 +r4_mul: dest:f src1:f src2:f clob:1 len:8 +r4_div: dest:f src1:f src2:f clob:1 len:20 +r4_rem: dest:f src1:f src2:f clob:1 len:24 r4_neg: dest:f src1:f clob:1 len:23 r4_ceq: dest:i src1:f src2:f len:35 r4_cgt: dest:i src1:f src2:f len:35 @@ -163,6 +164,7 @@ r4_clt_un: dest:i src1:f src2:f len:42 r4_cneq: dest:i src1:f src2:f len:42 r4_cge: dest:i src1:f src2:f len:35 r4_cle: dest:i src1:f src2:f len:35 +rmove: dest:f src1:f len:4 fmove: dest:f src1:f len:4 move_f_to_i4: dest:i src1:f len:14 diff --git a/src/mono/mono/mini/mini-s390x.c b/src/mono/mono/mini/mini-s390x.c index 4f0a400673a10..5ad3edbef2c4a 100644 --- a/src/mono/mono/mini/mini-s390x.c +++ b/src/mono/mono/mini/mini-s390x.c @@ -3453,9 +3453,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_ldebr (code, ins->dreg, ins->sreg1); break; case OP_FMOVE: - if (ins->dreg != ins->sreg1) { + if (ins->dreg != ins->sreg1) + s390_ldr (code, ins->dreg, ins->sreg1); + break; + case OP_RMOVE: + if (ins->dreg != ins->sreg1) s390_ldr (code, ins->dreg, ins->sreg1); - } break; case OP_MOVE_F_TO_I8: s390_lgdr (code, ins->dreg, ins->sreg1); @@ -3696,46 +3699,45 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->flags & MONO_INST_INIT) s390_lgr (code, s390_r0, s390_r1); - s390_lgr (code, s390_r0, s390_r1); - s390_risbg (code, s390_r2, s390_r1, 0, 0xb3, 0); - s390_sgrk (code, s390_r2, STK_BASE, s390_r2); + s390_risbg (code, ins->dreg, s390_r1, 0, 0xb3, 0); + s390_sgrk (code, ins->dreg, STK_BASE, ins->dreg); - s390_cgr (code, STK_BASE, s390_r2); /* L0: */ + s390_cgr (code, STK_BASE, ins->dreg); /* L0: */ s390_je (code, 9); /* je L1 */ s390_aghi (code, STK_BASE, -4096); s390_mvghi (code, s390_r15, 0, 0); s390_j (code, -9); /* j L0 */ - s390_risbg (code, s390_r2, s390_r1, 0x34, 0xbf, 0); /* L1: */ - s390_ltgr (code, s390_r2, s390_r2); + s390_risbg (code, ins->dreg, s390_r1, 0x34, 0xbf, 0); /* L1: */ + s390_ltgr (code, ins->dreg, ins->dreg); s390_jz (code, 13); /* jz L2: */ - s390_sgr (code, STK_BASE, s390_r2); + s390_sgr (code, STK_BASE, ins->dreg); s390_risbg (code, s390_r1, s390_r1, 0x34, 0xbf, 0); s390_lay (code, s390_r1, s390_r1, STK_BASE, -8); s390_mvghi (code, s390_r1, 0, 0); /* L2: */ } else { - s390_lgr (code, s390_r2, s390_r1); - s390_nill (code, s390_r2, 0xf000); + s390_lgr (code, ins->dreg, s390_r1); + s390_nill (code, ins->dreg, 0xf000); s390_lgr (code, s390_r0, STK_BASE); - s390_sgr (code, s390_r0, s390_r2); - s390_lgr (code, s390_r2, s390_r0); + s390_sgr (code, s390_r0, ins->dreg); + s390_lgr (code, ins->dreg, s390_r0); - s390_cgr (code, STK_BASE, s390_r2); /* L0: */ + s390_cgr (code, STK_BASE, ins->dreg); /* L0: */ s390_je (code, 11); /* je L1 */ s390_aghi (code, STK_BASE, -4096); s390_lghi (code, s390_r0, 0); s390_stg (code, s390_r0, 0, STK_BASE, 4088); s390_j (code, -11); /* j L0 */ - s390_lghi (code, s390_r2, 4095); /* L1: */ - s390_ngr (code, s390_r2, s390_r1); - s390_ltgr (code, s390_r2, s390_r2); + s390_lghi (code, ins->dreg, 4095); /* L1: */ + s390_ngr (code, ins->dreg, s390_r1); + s390_ltgr (code, ins->dreg, ins->dreg); s390_jz (code, 7); /* jz L2 */ - s390_sgr (code, STK_BASE, s390_r2); - s390_stg (code, s390_r2, s390_r1, STK_BASE, -8); + s390_sgr (code, STK_BASE, ins->dreg); + s390_stg (code, ins->dreg, s390_r1, STK_BASE, -8); /* L2: */ if (ins->flags & MONO_INST_INIT) s390_lgr (code, s390_r0, s390_r1); @@ -4337,11 +4339,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_RCONV_TO_I4: case OP_RCONV_TO_I: - s390_cgebr (code, ins->dreg, 5, ins->sreg1); + s390_cfebr (code, ins->dreg, 5, ins->sreg1); break; case OP_RCONV_TO_U4: if (mono_hwcap_s390x_has_fpe) { - s390_clgebr (code, ins->dreg, 5, ins->sreg1, 0); + s390_clfebr (code, ins->dreg, 5, ins->sreg1, 0); } else { code = emit_float_to_int (cfg, code, ins->dreg, ins->sreg1, 4, FALSE); } @@ -5706,7 +5708,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) cfg->rgctx_var->inst_offset); } -#if 1 +#if 0 char *methodName = getenv("MONO_TRACE_METHOD"); if (methodName != NULL) { printf("ns: %s k: %s m: %s\n",method->klass->name_space,method->klass->name,method->name);fflush(stdout);