project64/Source/RSP/X86.h

268 lines
14 KiB
C

/*
* RSP Compiler plug in for Project 64 (A Nintendo 64 emulator).
*
* (c) Copyright 2001 jabo (jabo@emulation64.com) and
* zilmar (zilmar@emulation64.com)
*
* pj64 homepage: www.pj64.net
*
* Permission to use, copy, modify and distribute Project64 in both binary and
* source form, for non-commercial purposes, is hereby granted without fee,
* providing that this license information and copyright notice appear with
* all copies and any derived work.
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event shall the authors be held liable for any damages
* arising from the use of this software.
*
* Project64 is freeware for PERSONAL USE only. Commercial users should
* seek permission of the copyright holders first. Commercial use includes
* charging money for Project64 or software derived from Project64.
*
* The copyright holders request that bug fixes and improvements to the code
* should be forwarded to them so if they want them.
*
*/
enum x86RegValues {
x86_EAX = 0, x86_EBX = 1, x86_ECX = 2, x86_EDX = 3,
x86_ESI = 4, x86_EDI = 5, x86_EBP = 6, x86_ESP = 7
};
enum mmxRegValues {
x86_MM0 = 0, x86_MM1 = 1, x86_MM2 = 2, x86_MM3 = 3,
x86_MM4 = 4, x86_MM5 = 5, x86_MM6 = 6, x86_MM7 = 7
};
enum sseRegValues {
x86_XMM0 = 0, x86_XMM1 = 1, x86_XMM2 = 2, x86_XMM3 = 3,
x86_XMM4 = 4, x86_XMM5 = 5, x86_XMM6 = 6, x86_XMM7 = 7
};
void AdcX86RegToX86Reg ( int Destination, int Source );
void AdcX86regToVariable ( int x86reg, void * Variable, char * VariableName );
void AdcX86regHalfToVariable ( int x86reg, void * Variable, char * VariableName );
void AdcConstToX86reg ( BYTE Constant, int x86reg );
void AdcConstToVariable ( void *Variable, char *VariableName, BYTE Constant );
void AdcConstHalfToVariable ( void *Variable, char *VariableName, BYTE Constant );
void AddConstToVariable ( DWORD Const, void *Variable, char *VariableName );
void AddConstToX86Reg ( int x86Reg, DWORD Const );
void AddVariableToX86reg ( int x86reg, void * Variable, char * VariableName );
void AddX86regToVariable ( int x86reg, void * Variable, char * VariableName );
void AddX86regHalfToVariable ( int x86reg, void * Variable, char * VariableName );
void AddX86RegToX86Reg ( int Destination, int Source );
void AndConstToVariable ( DWORD Const, void *Variable, char *VariableName );
void AndConstToX86Reg ( int x86Reg, DWORD Const );
void AndVariableToX86Reg ( void * Variable, char * VariableName, int x86Reg );
void AndVariableToX86regHalf ( void * Variable, char * VariableName, int x86Reg );
void AndX86RegToVariable ( void * Variable, char * VariableName, int x86Reg );
void AndX86RegToX86Reg ( int Destination, int Source );
void AndX86RegHalfToX86RegHalf ( int Destination, int Source );
void X86BreakPoint ( LPCSTR FileName, int LineNumber );
void Call_Direct ( void * FunctAddress, char * FunctName );
void Call_Indirect ( void * FunctAddress, char * FunctName );
void CondMoveEqual ( int Destination, int Source );
void CondMoveNotEqual ( int Destination, int Source );
void CondMoveGreater ( int Destination, int Source );
void CondMoveGreaterEqual ( int Destination, int Source );
void CondMoveLess ( int Destination, int Source );
void CondMoveLessEqual ( int Destination, int Source );
void CompConstToVariable ( DWORD Const, void * Variable, char * VariableName );
void CompConstHalfToVariable ( WORD Const, void * Variable, char * VariableName );
void CompConstToX86reg ( int x86Reg, DWORD Const );
void CompX86regToVariable ( int x86Reg, void * Variable, char * VariableName );
void CompVariableToX86reg ( int x86Reg, void * Variable, char * VariableName );
void CompX86RegToX86Reg ( int Destination, int Source );
void Cwd ( void );
void Cwde ( void );
void DecX86reg ( int x86Reg );
void DivX86reg ( int x86reg );
void idivX86reg ( int x86reg );
void imulX86reg ( int x86reg );
void ImulX86RegToX86Reg ( int Destination, int Source );
void IncX86reg ( int x86Reg );
void JaeLabel32 ( char * Label, DWORD Value );
void JaLabel8 ( char * Label, BYTE Value );
void JaLabel32 ( char * Label, DWORD Value );
void JbLabel8 ( char * Label, BYTE Value );
void JbLabel32 ( char * Label, DWORD Value );
void JeLabel8 ( char * Label, BYTE Value );
void JeLabel32 ( char * Label, DWORD Value );
void JgeLabel8 ( char * Label, BYTE Value );
void JgeLabel32 ( char * Label, DWORD Value );
void JgLabel8 ( char * Label, BYTE Value );
void JgLabel32 ( char * Label, DWORD Value );
void JleLabel8 ( char * Label, BYTE Value );
void JleLabel32 ( char * Label, DWORD Value );
void JlLabel8 ( char * Label, BYTE Value );
void JlLabel32 ( char * Label, DWORD Value );
void JumpX86Reg ( int x86reg );
void JmpLabel8 ( char * Label, BYTE Value );
void JmpLabel32 ( char * Label, DWORD Value );
void JneLabel8 ( char * Label, BYTE Value );
void JneLabel32 ( char * Label, DWORD Value );
void JnsLabel8 ( char * Label, BYTE Value );
void JnsLabel32 ( char * Label, DWORD Value );
void JsLabel32 ( char * Label, DWORD Value );
void LeaSourceAndOffset ( int x86DestReg, int x86SourceReg, int offset );
void MoveConstByteToN64Mem ( BYTE Const, int AddrReg );
void MoveConstHalfToN64Mem ( WORD Const, int AddrReg );
void MoveConstByteToVariable ( BYTE Const,void *Variable, char *VariableName );
void MoveConstHalfToVariable ( WORD Const, void *Variable, char *VariableName );
void MoveConstToN64Mem ( DWORD Const, int AddrReg );
void MoveConstToN64MemDisp ( DWORD Const, int AddrReg, BYTE Disp );
void MoveConstToVariable ( DWORD Const, void *Variable, char *VariableName );
void MoveConstToX86reg ( DWORD Const, int x86reg );
void MoveOffsetToX86reg ( DWORD Const, char * VariableName, int x86reg );
void MoveX86regByteToX86regPointer ( int Source, int AddrReg );
void MoveX86regHalfToX86regPointer ( int Source, int AddrReg );
void MoveX86regHalfToX86regPointerDisp ( int Source, int AddrReg, BYTE Disp);
void MoveX86regToX86regPointer ( int Source, int AddrReg );
void MoveX86RegToX86regPointerDisp ( int Source, int AddrReg, BYTE Disp );
void MoveX86regPointerToX86regByte ( int Destination, int AddrReg );
void MoveX86regPointerToX86regHalf ( int Destination, int AddrReg );
void MoveX86regPointerToX86reg ( int Destination, int AddrReg );
void MoveN64MemDispToX86reg ( int x86reg, int AddrReg, BYTE Disp );
void MoveN64MemToX86reg ( int x86reg, int AddrReg );
void MoveN64MemToX86regByte ( int x86reg, int AddrReg );
void MoveN64MemToX86regHalf ( int x86reg, int AddrReg );
void MoveX86regByteToN64Mem ( int x86reg, int AddrReg );
void MoveX86regByteToVariable ( int x86reg, void * Variable, char * VariableName );
void MoveX86regHalfToN64Mem ( int x86reg, int AddrReg );
void MoveX86regHalfToVariable ( int x86reg, void * Variable, char * VariableName );
void MoveX86regToN64Mem ( int x86reg, int AddrReg );
void MoveX86regToN64MemDisp ( int x86reg, int AddrReg, BYTE Disp );
void MoveX86regToVariable ( int x86reg, void * Variable, char * VariableName );
void MoveX86RegToX86Reg ( int Source, int Destination );
void MoveVariableToX86reg ( void *Variable, char *VariableName, int x86reg );
void MoveVariableToX86regByte ( void *Variable, char *VariableName, int x86reg );
void MoveVariableToX86regHalf ( void *Variable, char *VariableName, int x86reg );
void MoveSxX86RegHalfToX86Reg ( int Source, int Destination );
void MoveSxX86RegPtrDispToX86RegHalf( int AddrReg, BYTE Disp, int Destination );
void MoveSxN64MemToX86regByte ( int x86reg, int AddrReg );
void MoveSxN64MemToX86regHalf ( int x86reg, int AddrReg );
void MoveSxVariableToX86regHalf ( void *Variable, char *VariableName, int x86reg );
void MoveZxX86RegHalfToX86Reg ( int Source, int Destination );
void MoveZxX86RegPtrDispToX86RegHalf( int AddrReg, BYTE Disp, int Destination );
void MoveZxN64MemToX86regByte ( int x86reg, int AddrReg );
void MoveZxN64MemToX86regHalf ( int x86reg, int AddrReg );
void MoveZxVariableToX86regHalf ( void *Variable, char *VariableName, int x86reg );
void MulX86reg ( int x86reg );
void NegateX86reg ( int x86reg );
void NotX86reg ( int x86reg );
void OrConstToVariable ( DWORD Const, void * Variable, char * VariableName );
void OrConstToX86Reg ( DWORD Const, int x86Reg );
void OrVariableToX86Reg ( void * Variable, char * VariableName, int x86Reg );
void OrVariableToX86regHalf ( void * Variable, char * VariableName, int x86Reg );
void OrX86RegToVariable ( void * Variable, char * VariableName, int x86Reg );
void OrX86RegToX86Reg ( int Destination, int Source );
void Popad ( void );
void Pushad ( void );
void Push ( int x86reg );
void Pop ( int x86reg );
void PushImm32 ( char * String, DWORD Value );
void Ret ( void );
void Seta ( int x86reg );
void Setae ( int x86reg );
void Setl ( int x86reg );
void Setb ( int x86reg );
void Setg ( int x86reg );
void Setz ( int x86reg );
void Setnz ( int x86reg );
void SetlVariable ( void * Variable, char * VariableName );
void SetleVariable ( void * Variable, char * VariableName );
void SetgVariable ( void * Variable, char * VariableName );
void SetgeVariable ( void * Variable, char * VariableName );
void SetbVariable ( void * Variable, char * VariableName );
void SetaVariable ( void * Variable, char * VariableName );
void SetzVariable ( void * Variable, char * VariableName );
void SetnzVariable ( void * Variable, char * VariableName );
void ShiftLeftSign ( int x86reg );
void ShiftLeftSignImmed ( int x86reg, BYTE Immediate );
void ShiftLeftSignVariableImmed ( void *Variable, char *VariableName, BYTE Immediate );
void ShiftRightSignImmed ( int x86reg, BYTE Immediate );
void ShiftRightSignVariableImmed ( void *Variable, char *VariableName, BYTE Immediate );
void ShiftRightUnsign ( int x86reg );
void ShiftRightUnsignImmed ( int x86reg, BYTE Immediate );
void ShiftRightUnsignVariableImmed ( void *Variable, char *VariableName, BYTE Immediate );
void ShiftLeftDoubleImmed ( int Destination, int Source, BYTE Immediate );
void ShiftRightDoubleImmed ( int Destination, int Source, BYTE Immediate );
void SubConstFromVariable ( DWORD Const, void *Variable, char *VariableName );
void SubConstFromX86Reg ( int x86Reg, DWORD Const );
void SubVariableFromX86reg ( int x86reg, void * Variable, char * VariableName );
void SubX86RegToX86Reg ( int Destination, int Source );
void SubX86regFromVariable ( int x86reg, void * Variable, char * VariableName );
void SbbX86RegToX86Reg ( int Destination, int Source );
void TestConstToVariable ( DWORD Const, void * Variable, char * VariableName );
void TestConstToX86Reg ( DWORD Const, int x86reg );
void TestX86RegToX86Reg ( int Destination, int Source );
void XorConstToX86Reg ( int x86Reg, DWORD Const );
void XorX86RegToX86Reg ( int Source, int Destination );
void XorVariableToX86reg ( void *Variable, char *VariableName, int x86reg );
void XorX86RegToVariable ( void *Variable, char *VariableName, int x86reg );
void XorConstToVariable ( void *Variable, char *VariableName, DWORD Const );
#define _MMX_SHUFFLE(a, b, c, d) \
((BYTE)(((a) << 6) | ((b) << 4) | ((c) << 2) | (d)))
void MmxMoveRegToReg ( int Dest, int Source );
void MmxMoveQwordRegToVariable ( int Dest, void *Variable, char *VariableName );
void MmxMoveQwordVariableToReg ( int Dest, void *Variable, char *VariableName );
void MmxPandRegToReg ( int Dest, int Source );
void MmxPandnRegToReg ( int Dest, int Source );
void MmxPandVariableToReg ( void * Variable, char * VariableName, int Dest );
void MmxPorRegToReg ( int Dest, int Source );
void MmxPorVariableToReg ( void * Variable, char * VariableName, int Dest );
void MmxXorRegToReg ( int Dest, int Source );
void MmxShuffleMemoryToReg ( int Dest, void * Variable, char * VariableName, BYTE Immed );
void MmxPcmpeqwRegToReg ( int Dest, int Source );
void MmxPmullwRegToReg ( int Dest, int Source );
void MmxPmullwVariableToReg ( int Dest, void * Variable, char * VariableName );
void MmxPmulhuwRegToReg ( int Dest, int Source );
void MmxPmulhwRegToReg ( int Dest, int Source );
void MmxPmulhwRegToVariable ( int Dest, void * Variable, char * VariableName );
void MmxPsrlwImmed ( int Dest, BYTE Immed );
void MmxPsrawImmed ( int Dest, BYTE Immed );
void MmxPsllwImmed ( int Dest, BYTE Immed );
void MmxPaddswRegToReg ( int Dest, int Source );
void MmxPaddswVariableToReg ( int Dest, void * Variable, char * VariableName );
void MmxPaddwRegToReg ( int Dest, int Source );
void MmxPsubswVariableToReg ( int Dest, void * Variable, char * VariableName );
void MmxPsubswRegToReg ( int Dest, int Source );
void MmxPackSignedDwords ( int Dest, int Source );
void MmxUnpackLowWord ( int Dest, int Source );
void MmxUnpackHighWord ( int Dest, int Source );
void MmxCompareGreaterWordRegToReg ( int Dest, int Source );
void MmxEmptyMultimediaState ( void );
void SseMoveAlignedVariableToReg ( void *Variable, char *VariableName, int sseReg );
void SseMoveAlignedRegToVariable ( int sseReg, void *Variable, char *VariableName );
void SseMoveAlignedN64MemToReg ( int sseReg, int AddrReg );
void SseMoveAlignedRegToN64Mem ( int sseReg, int AddrReg );
void SseMoveUnalignedVariableToReg ( void *Variable, char *VariableName, int sseReg );
void SseMoveUnalignedRegToVariable ( int sseReg, void *Variable, char *VariableName );
void SseMoveUnalignedN64MemToReg ( int sseReg, int AddrReg );
void SseMoveUnalignedRegToN64Mem ( int sseReg, int AddrReg );
void SseMoveRegToReg ( int Dest, int Source );
void SseXorRegToReg ( int Dest, int Source );
#pragma warning(push)
#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
typedef union {
struct {
unsigned Reg0 : 2;
unsigned Reg1 : 2;
unsigned Reg2 : 2;
unsigned Reg3 : 2;
};
unsigned UB:8;
} SHUFFLE;
#pragma warning(pop)
void SseShuffleReg ( int Dest, int Source, BYTE Immed );
void x86_SetBranch32b(void * JumpByte, void * Destination);
void x86_SetBranch8b(void * JumpByte, void * Destination);