[Mono-dev] Mono:MIPS patch

Yoichi NAKAYAMA nakayama at pixela.co.jp
Fri Oct 19 04:11:05 EDT 2007


Hello,

At Thu, 18 Oct 2007 09:41:51 +0900,
Yoichi NAKAYAMA wrote:
> With those changes, I've checked that "mono --regression basic-long.exe"
> passes except test_0_conv_to_r4 (tested on Debian-MIPS on qemu).

Then I've investigated test_0_conv_to_r4 failure.
Dump of __emul_lconv_to_r4 generated by "mono -v -v" is:

  00000000 <System_Object___icall_wrapper___emul_lconv_to_r4>:
  ...snip...
    e8:   8fc20154        lw      v0,340(s8)
    ec:   8fc30150        lw      v1,336(s8)
    f0:   00602020        add     a0,v1,zero
    f4:   00402820        add     a1,v0,zero
    f8:   3c190056        lui     t9,0x56
    fc:   27392f44        addiu   t9,t9,12100
   100:   0320f809        jalr    t9              # 0x562F44 == mono_lconv_to_r4
   104:   00000000        nop
   108:   462004a0        cvt.s.d $f18,$f0
   10c:   e7d20020        swc1    $f18,32(s8)
   110:   c7c00020        lwc1    $f0,32(s8)
   114:   46000021        cvt.d.s $f0,$f0
   118:   f7c00028        sdc1    $f0,40(s8)
  ...snip...

At 108, it assumes return value of mono_lconv_to_r4 is stored
on f0 as double precision float. Although, it is stored as single
precision float, then wrong value seems to be returned.

% objdump -r -d jit-icalls.o 
  00000234 <mono_lconv_to_r4>:
       234:       3c1c0000        lui     gp,0x0
                          234: R_MIPS_HI16        _gp_disp
       238:       279c0000        addiu   gp,gp,0
                          238: R_MIPS_LO16        _gp_disp
       23c:       0399e021        addu    gp,gp,t9
       240:       27bdffe0        addiu   sp,sp,-32
       244:       afbf0018        sw      ra,24(sp)
       248:       afbc0010        sw      gp,16(sp)
       24c:       8f990000        lw      t9,0(gp)
                          24c: R_MIPS_CALL16      __floatdisf
       250:       00000000        nop
       254:       0320f809        jalr    t9
       258:       00000000        nop
       25c:       8fbc0010        lw      gp,16(sp)
       260:       8fbf0018        lw      ra,24(sp)
       264:       00000000        nop
       268:       03e00008        jr      ra
       26c:       27bd0020        addiu   sp,sp,32

I've changed mono_lconv_to_r4's return type to double,
and confirmed that mono passes test_0_conv_to_r4 on MIPS.

Is it a correct fix? I wonder why this was not a problem on
other platforms (arm, hppa, ppc, s390 and sparc where
MONO_ARCH_EMULATE_LCONV_TO_R4 is defined).

Regards,
-- 
Yoichi NAKAYAMA
Pixela Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mono_lconv_to_r4.patch
Type: application/octet-stream
Size: 1429 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20071019/69ac4c81/attachment.obj 


More information about the Mono-devel-list mailing list