For https://gitlab.com/qemu-project/qemu/-/issues/1547 the case is well testable and visible.
If you couldn't spit it, min/max goes nuts in those tests, like:
farr[11] = 4.318749e+04, farr[3] = 1.468766e+00
-C MIN(farr[11],farr[3]) = 1.468766e+00, MAX(farr[11],farr[3]) = 4.318749e+04
+C MIN(farr[11],farr[3]) = 4.318749e+04, MAX(farr[11],farr[3]) = 4.318749e+04
While executing code like this:
#define RT_MIN(a, b) ((a) < (b) ? (a) : (b))
#define RT_MAX(a, b) ((a) > (b) ? (a) : (b))
Optimization makes it use some feature which is broken in emulation.
I see the issue happening with -O1 and higher on the case that was described.
Looking at the assembly I see that the bad code used xsmincdp and xsmaxcdp.
The fix that should be in:
201fc774e0e target/ppc: Fix xs{max, min}[cj]dp to use VSX registers
I have again asked on the upstream case if anyone knows better.
Rechecking there in a few days would be great.
For https:/ /gitlab. com/qemu- project/ qemu/-/ issues/ 1547 the case is well testable and visible. 11],farr[ 3]) = 1.468766e+00, MAX(farr[ 11],farr[ 3]) = 4.318749e+04 11],farr[ 3]) = 4.318749e+04, MAX(farr[ 11],farr[ 3]) = 4.318749e+04
If you couldn't spit it, min/max goes nuts in those tests, like:
farr[11] = 4.318749e+04, farr[3] = 1.468766e+00
-C MIN(farr[
+C MIN(farr[
While executing code like this:
#define RT_MIN(a, b) ((a) < (b) ? (a) : (b))
#define RT_MAX(a, b) ((a) > (b) ? (a) : (b))
Optimization makes it use some feature which is broken in emulation.
I see the issue happening with -O1 and higher on the case that was described.
Looking at the assembly I see that the bad code used xsmincdp and xsmaxcdp.
The fix that should be in:
201fc774e0e target/ppc: Fix xs{max, min}[cj]dp to use VSX registers
I have again asked on the upstream case if anyone knows better.
Rechecking there in a few days would be great.