I've been following the recent changes to better support denormal handling and
I don't think they are doing the right thing for x86.
I tried a simple program to convert a denormal float value (0x1.0p-127) to a
double. With the default of DAZ being 0 in MXCSR, x86 sets DE, but QEMU
doesn't. This is the opposite behavior of AARCH64 which sets their denormal
input flag when it flushes a denormal input to 0.
Here's what I tried:
#include <stdio.h>
#include <immintrin.h>
volatile float f = 0x1.0p-127;
int main()
{
double d = f;
printf("Converting a denormal float to a double %s the DE bit in MXCSR\n",
_mm_getcsr() & _MM_EXCEPT_DENORM ? "sets" : "does not set");
return 0;
}
When run on a native machine, it prints:
Converting a denormal float to a double sets the DE bit in MXCSR
But when run using QEMU, it prints:
Converting a denormal float to a double does not set the DE bit in MXCSR