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 R3000mipseb



Hi Tsutsui,

Izumi Tsutsui wrote:

> The following reply was made to PR port-mips/57680; it has been noted by GNATS.
>
> From: Izumi Tsutsui <tsutsui%ceres.dti.ne.jp@localhost>
> To: campbell%mumble.net@localhost
> Cc: riastradh%NetBSD.org@localhost, gnats-bugs%netbsd.org@localhost, tsutsui%ceres.dti.ne.jp@localhost
> Subject: Re: port-mips/57680: printf("%.1f") shows wrong results on R3000mipseb
> Date: Thu, 16 Nov 2023 23:40:07 +0900
>
>  I wrote:
>  > I'll check binutils diff between netbsd-7 and 8.
>  
>  Okay, I think I've got it.
>  
>  Index: gas/config/tc-mips.c
>  ===================================================================
>  RCS file: /cvsroot/src/external/gpl3/binutils/dist/gas/config/tc-mips.c,v
>  retrieving revision 1.21
>  diff -u -p -d -U 20 -r1.21 tc-mips.c
>  --- gas/config/tc-mips.c	7 Nov 2018 01:13:53 -0000	1.21
>  +++ gas/config/tc-mips.c	16 Nov 2023 14:18:10 -0000
>  @@ -6423,42 +6423,42 @@ insns_between (const struct mips_cl_insn
>     if (!HAVE_CODE_COMPRESSION)
>       {
>         /* Check for GPR or coprocessor load delays.  All such delays
>   	 are on the RT register.  */
>         /* Itbl support may require additional care here.  */
>       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY))
>   	  || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC)))
>   	{
>   	  if (insn2 == NULL || (gpr_read_mask (insn2) & gpr_write_mask (insn1)))
>   	    return 1;
>   	}
>   
>         /* Check for generic coprocessor hazards.
>   
>   	 This case is not handled very well.  There is no special
>   	 knowledge of CP0 handling, and the coprocessors other than
>   	 the floating point unit are not distinguished at all.  */
>         /* Itbl support may require additional care here. FIXME!
>   	 Need to modify this to include knowledge about
>   	 user specified delays!  */
>  -      else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE))
>  -	       || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
>  +      if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE))
>  +	  || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
>   	{

>  
>  ---
>  
>  The pinfo field has been changed between binutils 2.23.2 and 2.27.
>  After the change, INSN_LOAD_MEMORY can be defined both GPR and FPR.
>  Actually on binutils 2.27 pinfo of lwc1 is 01020811, i.e.
>  (FP_S|INSN_COPROC_MEMORY_DELAY|INSN_LOAD_MEMORY|INSN_READ_3|INSN_WRITE_1),
>  but tc-mips.c still uses "else if" after an INSN_LOAD_MEMORY check
>  against GPR as above.
>  
>  ---

Good catch!  This seems to be correct from inspecting the above.  Also
the code layout of:

	if ....
	{
	  ...
	}
	/* big multi-line comments */
	else if ....
	{
	  ...
	}

doesn't help readability here.

I would guess that there's not much MIPS1 + FPU coverage with Linux.
It's likely that most 32-bit is things like OpenWRT that likely use
MIPS32 without an FPU.

Cheers,
Simon.


Home | Main Index | Thread Index | Old Index