Wie is vfmaddrnd231pd??

VFMADDRND231PD – Fused Multiply-Add of Packed Double-Precision Floating-Point Values with rounding control

De immediate byte definieert verschillende bitvelden die de afronding, DAZ, FTZ en het onderdrukken van uitzonderingen (exception suppression) aansturen (zie Tabel 5-3).

Het voordeel van controle over afronding

De meeste x86 floating-point-instructies maken gebruik van de globale afrondingsmodus en -instellingen; het wijzigen hiervan is vrij traag. vfmaddrnd231pd maakt het echter mogelijk om de afrondingsmodus per instructie te beheren. Aangezien FMA optelling, aftrekking en vermenigvuldiging kan emuleren, maakt dit mechanisme het effectief mogelijk om elke rekenkundige bewerking een controleerbare afronding te geven zonder AVX-512. Dit zou bepaalde algoritmen die afhankelijk zijn van afronding ongelooflijk veel sneller maken.

De realiteit: een instructie die niet bestaat

Dat zou het zijn, als deze instructie daadwerkelijk bestond. De GNU-assembler herkent hem niet. Ook de Intel C/C++ Compiler intrinsics mmfmaddroundpd en mm256fmaddroundpd, die in de SDM worden genoemd, ontbreken niet alleen in Clang, maar ook in ICC.

Het handmatig assembleren van de instructies aan de hand van de opcode-lijst uit de SDM onthult een ander probleem:

VEX.DDS.128.66.0F3A.W1 B8 /r /ib

VEX is het VEX-prefix, maar wat is DDS? Deze opcode is de enige vermelding van DDS in de SDM. Een antwoord op Stack Overflow stelt dat DDS enkel voor documentatie wordt gebruikt en in latere versies van de SDM is verwijderd, maar het feit dat het hier nog steeds staat is verdacht. Wanneer de instructie daadwerkelijk wordt uitgevoerd op een CPU die de FMA-instructieset ondersteunt, zoals mijn Haswell, resulteert dit in een #UD ("UnDefined instruction") fout!

Inconsistenties in de documentatie

Ik vond het al vreemd dat de SDM alleen vfmaddrnd231pd vermeldt en niet de andere varianten (zoals het gebruik van pd/ps/sd/ss of 132/213/231) die andere FMA-instructies wel hebben, maar dit bevestigt mijn vermoedens. Op dat moment downloadde ik een recentere versie van de SDM en merkte op dat deze instructie ontbreekt in de editie van 2026, ondanks dat hij wel aanwezig was in de versie van 2024.

Conclusie

Ik ben ongelooflijk in verwarring. Deze instructie lijkt niet op een typfout in de documentatie, aangezien de documenten unieke tabellen en pseudocode bevatten die niet lijken op die van enige andere instructie.

Mijn beste hypothese is dat Intel de vfmaddrnd*-set wilde toevoegen, op het laatste moment een probleem ontdekte en deze uit de CPU verwijderde, maar de SDM niet correct heeft aangepast. Er is echter geen manier om dit te bevestigen. Mocht iemand die dit leest een connectie hebben bij Intel, dan zou ik graag het antwoord willen weten.