On Tuesday 03 February 2026 12:11:47 LIU Hao wrote:
> 在 2025-12-26 07:33, Pali Rohár 写道:
> > diff --git a/mingw-w64-crt/testcases/t_sigfpe.c 
> > b/mingw-w64-crt/testcases/t_sigfpe.c
> > new file mode 100644
> > index 000000000000..eda858d373f9
> > --- /dev/null
> > +++ b/mingw-w64-crt/testcases/t_sigfpe.c
> > @@ -0,0 +1,31 @@
> > +#include <stdio.h>
> > +#include <setjmp.h>
> > +#include <signal.h>
> > +#include <assert.h>
> > +#include <limits.h>
> > +
> > +static jmp_buf buf;
> > +
> > +static void __attribute__((noreturn)) catch_sigfpe(int signum)
> > +{
> > +  printf("SIGFPE exception catched\n");
> 
>                               ^^^ caught
> 
> English is nonsense, but meh.

I spotted this after I send email and created local git fixup commit.

> 
> > +  assert(signum == SIGFPE);
> > +  longjmp(buf, 1);
> > +}
> > +
> > +int main(void)
> > +{
> > +  signal(SIGFPE, catch_sigfpe);
> > +  if (!setjmp(buf))
> > +  {
> > +    puts("execute: INT_MIN/-1");
> > +    volatile int a = INT_MIN;
> > +    volatile int b = -1;
> > +    volatile int c = a / b;
> 
> On ARM, the overflow of signed division is ignored, so this test must be 
> skipped for ARM.
> 
> (https://developer.arm.com/documentation/ddi0406/c/Application-Level-Architecture/Instruction-Details/Alphabetical-list-of-instructions/SDIV#id19835678)

Ok. I did not know this. In this case it for sure needs to be skipped on ARM 
systems.

When I worked with ARM Cortex processors in past, none of them had
support for sdiv and udiv instructions (they were optional) and gcc
replaced division by libgcc function call.

> 
> 
> diff --git a/mingw-w64-crt/testcases/t_sigfpe.c 
> b/mingw-w64-crt/testcases/t_sigfpe.c
> index eda858d37..61e0e2296 100644
> --- a/mingw-w64-crt/testcases/t_sigfpe.c
> +++ b/mingw-w64-crt/testcases/t_sigfpe.c
> @@ -8,13 +8,17 @@ static jmp_buf buf;
> 
>  static void __attribute__((noreturn)) catch_sigfpe(int signum)
>  {
> -  printf("SIGFPE exception catched\n");
> +  printf("SIGFPE exception caught\n");
>    assert(signum == SIGFPE);
>    longjmp(buf, 1);
>  }
> 
>  int main(void)
>  {
> +#if defined(__arm__) || defined(__aarch64__) || defined(__arm64ec__)
> +  puts("Division overflow is ignored on ARM");
> +  return 77;
> +#else
>    signal(SIGFPE, catch_sigfpe);
>    if (!setjmp(buf))
>    {
> @@ -28,4 +32,5 @@ int main(void)
>    }
>    puts("PASSED, program recovered");
>    return 0;
> +#endif
>  }

That is fine.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to