; // test for oddball values fstsw AX ; sahf ; jc trigerr ; // C0 = 1: x is NAN, infinity, or empty // 387's can handle denormals SC18: fptan ; fstp ST(0) ; // dump X, which is always 1 fstsw AX ; sahf ; // if (!(fp_status & 0x20)) goto Lret jnp Lret ; // C2 = 1: x is out of range, do argument reduction fldpi ; // load pi fxch ; SC17: fprem1 ; // reminder (partial) fstsw AX ; sahf ; jp SC17 ; // C2 = 1: partial reminder, need to loop fstp ST(1) ; // remove pi from stack jmp SC18 ; } trigerr: return real.nan; Lret: // No need to manually return anything as the value is already on FP stack ; } For readers unfamiliar with x87 programming, the followed by conditional jump idiom is used to access the x87 FPU status word bits C0 and C2. stores the status in a general-purpose register; sahf sets the FLAGS register to the higher 8 bits of the register; and the jump is used to judge on whatever flag bit that happens to correspond to the FPU status bit. References External links GCC-Inline-Assembly-HOWTO Clang Inline assembly GNAT Inline Assembler GCC Inline Assembler Reference Compiler Explorer Assembly languages