The following testcase:

extern void abort(void);

long long smod16(long long x)
{
  return x % 16;
}

int main(void)
{
  if (smod16 (0xFFFFFFFF) != 0xF)
    abort ();

  return 0;
}

distilled from ada/uintp.adb:UI_From_Dint is miscompiled on i486 because of

2004-06-27  Roger Sayle  <[EMAIL PROTECTED]>

        * expmed.c (expand_smod_pow2): New function to expand signed
        remainder by a constant power of 2, such as "x % 16".
        (expand_divmod): Call new expand_smod_pow2 when appropriate.
        Minor corrections to comments, e.g. splitting long lines.


The second part of expand_smod_pow2 cannot handle modes whose size is greater
than that of HOST_WIDE_INT.

-- 
           Summary: Wrong code for signed integer remainder
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: critical
          Priority: P2
         Component: middle-end
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ebotcazou at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i486-*-*
  GCC host triplet: i486-*-*
GCC target triplet: i486-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18045

Reply via email to