Setting the FPU control word?
Bill Baxter
dnewsgroup at billbaxter.com
Mon Mar 10 19:04:18 PDT 2008
Here's a more cleaned up version. If you see anything that could be
improved, let me know. This is my first asm{}.
module fpctrl;
//import std.c.fenv;
import std.stdio;
enum FPPrecision : short
{
Single = 0x0000,
Double = 0x0200,
Real = 0x0300,
Mask = 0x0300,
InvMask = ~Mask
}
version(X86) { version = DO_FPU_CONTROL; }
version(X86_64) { version = DO_FPU_CONTROL; }
FPPrecision setFPControlWord(FPPrecision precision)
{
FPPrecision oldcw;
version(DO_FPU_CONTROL) {
FPPrecision newcw;
asm
{
fstcw oldcw;
fwait;
mov AX, oldcw;
and AX,FPPrecision.InvMask;
or AX,precision;
mov newcw,AX;
fldcw newcw;
}
debug
{
writefln("oldcw was: 0x%x", oldcw);
asm
{
fstcw newcw;
}
writefln("new is: 0x%x", newcw);
}
oldcw &= FPPrecision.Mask;
}
return oldcw;
}
void main()
{
auto orig = setFPControlWord(FPPrecision.Double);
setFPControlWord(FPPrecision.Single);
setFPControlWord(orig);
}
More information about the Digitalmars-d-learn
mailing list