NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-mips/57680: printf("%.1f") shows wrong results on R3000 mipseb
The following reply was made to PR port-mips/57680; it has been noted by GNATS.
From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: RVP <rvp%SDF.ORG@localhost>
Cc: gnats-bugs%netbsd.org@localhost, port-mips-maintainer%netbsd.org@localhost,
gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost, tsutsui%ceres.dti.ne.jp@localhost
Subject: Re: port-mips/57680: printf("%.1f") shows wrong results on R3000
mipseb
Date: Tue, 7 Nov 2023 02:13:05 +0000
> Date: Tue, 7 Nov 2023 01:29:41 +0000 (UTC)
> From: RVP <rvp%SDF.ORG@localhost>
>
> __flt_rounds() in src/lib/libc/arch/mips/gen/flt_rounds.c does:
>
> __asm(".set push; .set noat; cfc1 %0,$31; .set pop" : "=r" (x));
>
> while fegetround() -> __rfs() in src/sys/arch/mips/include/fenv.h only
> does:
>
> __asm __volatile("cfc1 %0,$31" : "=r" (__fpsr));
> [...]
> So, maybe a ".set push; ...; .set pop" is needed for older MIPS? Can you
> change __rfs() like that?
It's possible that change is correct, but I doubt it's the culprit.
In the objdump output that tsutsui@ quoted from __dtoa in the broken
libc, which I confirmed in my own build in the .o and .pico code
(although I haven't tested my build -- no hardware), there is no use
of the at register ($1, no overlap with any vN) and there is a nop in
the cfc1 load delay slot:
50: 4442f800 cfc1 v0,$31
54: 00000000 nop
58: 30420003 andi v0,v0,0x3
So while maybe we ought to set noat and noreorder, and maybe we ought
to add a nop in the asm, that doesn't seem to be the source of the
problem.
Home |
Main Index |
Thread Index |
Old Index