https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79540

--- Comment #17 from John David Anglin <danglin at gcc dot gnu.org> ---
   0x7adcb864 <build_float_string+2820>:        cmpclr,> r21,r3,r0
   0x7adcb868 <build_float_string+2824>:        copy r21,r3
   0x7adcb86c <build_float_string+2828>:        stw r20,-8c(sp)
   0x7adcb870 <build_float_string+2832>:        stw r21,-90(sp)
   0x7adcb874 <build_float_string+2836>:        copy r19,r4
   0x7adcb878 <build_float_string+2840>:        copy r5,r25
   0x7adcb87c <build_float_string+2844>:        b,l 0x7adab298 <memcpy>,rp
   0x7adcb880 <build_float_string+2848>:        copy r3,r24
=> 0x7adcb884 <build_float_string+2852>:        add,l r6,r3,ret0

(gdb) p/x $r21
$12 = 0x1
(gdb) p nafter
$13 = 1
(gdb) p ndigits
No symbol "ndigits" in current context.
(gdb) p/x $r3
$14 = 0xfffffffd

The cmpclr does a signed compare between $r21 and $r3.  The following
instruction is nullified because $r21 > $r3.  Presumably, $r3 is supposed to
contain ndigits.

  /* Set digits after the decimal point, padding with zeros.  */
  if (nafter > 0)
    {
      if (nafter > ndigits)
        i = ndigits;
      else
        i = nafter;

      memcpy (put, digits, i);
      while (i < nafter)
        put[i++] = '0';

      digits += i;
      ndigits -= i;
      put += nafter;
    }

Reply via email to