AltiVec assist for subnormal floats in vectors
authorgkoehler <gkoehler@openbsd.org>
Sat, 22 Oct 2022 00:58:56 +0000 (00:58 +0000)
committergkoehler <gkoehler@openbsd.org>
Sat, 22 Oct 2022 00:58:56 +0000 (00:58 +0000)
commit6ea8ccc79462aa3499e3835e392b1d8f285c3698
tree03d6a9846648fd130a1d91668d16e75a53ae0c98
parentc1cc27a74adfab431ed95c467b02b6c4875726e1
AltiVec assist for subnormal floats in vectors

The old CPU in a macppc traps AltiVec instructions when they encounter
denormal or subnormal floats.  Emulate most of them.  They operate on
vectors of 4 single-precision floats.  The emulations either use
scalar operations (so vmaddfp becomes 4 of fmadds) or a formula (like
vrsqrtefp's 1 / sqrt(b) = 1 / sqrt(b * 2**126) * 2**63).

I am forgetting to emulate some instructions (at least vrfin, vrfiz,
vrfip, vrfim).  If I don't emulate it, it will still cause SIGFPE.

Mac OS never emulated these instructions, but set AltiVec's "non-Java"
NJ bit (which changes all subnormal floats to zero).  FreeBSD also
sets NJ; NetBSD does SIGFPE; Linux emulates them.  The POWER9 running
OpenBSD/powerpc64 does them in hardware (without trapping).

ok kettenis@ miod@
sys/arch/powerpc/conf/files.powerpc
sys/arch/powerpc/include/trap.h
sys/arch/powerpc/powerpc/trap.c
sys/arch/powerpc/powerpc/vecast.S [new file with mode: 0644]