Skip to content

Commit

Permalink
s390x: Additional float32 fixes (#56360)
Browse files Browse the repository at this point in the history
- Add rmove specification in cpu-s390x.md
    - OP_RMOVE implementation in mini-s390x.c
    - Correct float instruction lengths
    - Disable debug code
    - Correct RCONV_TO_I4/RCONV_TO_U4
  • Loading branch information
nealef authored Jul 30, 2021
1 parent 38071bf commit 727bc6c
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 36 deletions.
30 changes: 16 additions & 14 deletions src/mono/mono/mini/cpu-s390x.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -129,31 +129,32 @@ 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
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
Expand All @@ -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
Expand Down
46 changes: 24 additions & 22 deletions src/mono/mono/mini/mini-s390x.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 727bc6c

Please sign in to comment.