Play-/Source/X86Assembler_Fpu.cpp
2008-06-23 01:35:05 +00:00

86 lines
2.1 KiB
C++

#include "X86Assembler.h"
using namespace std;
void CX86Assembler::FldEd(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xD9, 0x00, false, address);
}
void CX86Assembler::FildEd(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xDB, 0x00, false, address);
}
void CX86Assembler::FstpEd(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xD9, 0x03, false, address);
}
void CX86Assembler::FistpEd(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xDB, 0x03, false, address);
}
void CX86Assembler::FisttpEd(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xDB, 0x01, false, address);
}
void CX86Assembler::FaddpSt(uint8 stackId)
{
WriteStOp(0xDE, 0x00, stackId);
}
void CX86Assembler::FsubpSt(uint8 stackId)
{
WriteStOp(0xDE, 0x05, stackId);
}
void CX86Assembler::FmulpSt(uint8 stackId)
{
WriteStOp(0xDE, 0x01, stackId);
}
void CX86Assembler::FdivpSt(uint8 stackId)
{
WriteStOp(0xDE, 0x07, stackId);
}
void CX86Assembler::Fwait()
{
WriteByte(0x9B);
}
void CX86Assembler::Fsin()
{
WriteByte(0xD9);
WriteByte(0xFE);
}
void CX86Assembler::FnstcwEw(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xD9, 0x07, false, address);
}
void CX86Assembler::FldcwEw(const CAddress& address)
{
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
WriteEvOp(0xD9, 0x05, false, address);
}
void CX86Assembler::WriteStOp(uint8 opcode, uint8 subOpcode, uint8 stackId)
{
CAddress address;
address.ModRm.nMod = 3;
address.ModRm.nFnReg = subOpcode;
address.ModRm.nRM = stackId;
WriteByte(opcode);
WriteByte(address.ModRm.nByte);
}