From ef79bbde537d6b9c745a7d86cb9df1d04c35590d Mon Sep 17 00:00:00 2001 From: PCSX* teams Date: Tue, 16 Nov 2010 14:15:22 +0200 Subject: pcsxr-1.9.92 --- libpcsxcore/ix86/ix86.h | 673 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 673 insertions(+) create mode 100644 libpcsxcore/ix86/ix86.h (limited to 'libpcsxcore/ix86/ix86.h') diff --git a/libpcsxcore/ix86/ix86.h b/libpcsxcore/ix86/ix86.h new file mode 100644 index 0000000..2b60dff --- /dev/null +++ b/libpcsxcore/ix86/ix86.h @@ -0,0 +1,673 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* + * ix86 definitions v0.5.1 + * Authors: linuzappz + * alexey silinov + */ + +#ifndef __IX86_H__ +#define __IX86_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// include basic types +#include "../psxcommon.h" +#include "../r3000a.h" +#include "../psxhle.h" + +// x86Flags defines +#define X86FLAG_FPU 0x00000001 +#define X86FLAG_VME 0x00000002 +#define X86FLAG_DEBUGEXT 0x00000004 +#define X86FLAG_4MPAGE 0x00000008 +#define X86FLAG_TSC 0x00000010 +#define X86FLAG_MSR 0x00000020 +#define X86FLAG_PAE 0x00000040 +#define X86FLAG_MCHKXCP 0x00000080 +#define X86FLAG_CMPXCHG8B 0x00000100 +#define X86FLAG_APIC 0x00000200 +#define X86FLAG_SYSENTER 0x00000800 +#define X86FLAG_MTRR 0x00001000 +#define X86FLAG_GPE 0x00002000 +#define X86FLAG_MCHKARCH 0x00004000 +#define X86FLAG_CMOV 0x00008000 +#define X86FLAG_PAT 0x00010000 +#define X86FLAG_PSE36 0x00020000 +#define X86FLAG_PN 0x00040000 +#define X86FLAG_MMX 0x00800000 +#define X86FLAG_FXSAVE 0x01000000 +#define X86FLAG_SSE 0x02000000 + +// x86EFlags defines + +#define X86EFLAG_MMXEXT 0x00400000 +#define X86EFLAG_3DNOWEXT 0x40000000 +#define X86EFLAG_3DNOW 0x80000000 + +/* general defines */ +#define write8(val) *(u8 *)x86Ptr = val; x86Ptr++; +#define write16(val) *(u16*)x86Ptr = val; x86Ptr+=2; +#define write32(val) *(u32*)x86Ptr = val; x86Ptr+=4; +#define write64(val) *(u64*)x86Ptr = val; x86Ptr+=8; + +#define EAX 0 +#define EBX 3 +#define ECX 1 +#define EDX 2 +#define ESI 6 +#define EDI 7 +#define EBP 5 +#define ESP 4 + +#define MM0 0 +#define MM1 1 +#define MM2 2 +#define MM3 3 +#define MM4 4 +#define MM5 5 +#define MM6 6 +#define MM7 7 + +#define XMM0 0 +#define XMM1 1 +#define XMM2 2 +#define XMM3 3 +#define XMM4 4 +#define XMM5 5 +#define XMM6 6 +#define XMM7 7 + +extern s8 *x86Ptr; +extern u8 *j8Ptr[32]; +extern u32 *j32Ptr[32]; + +void x86Init(); +void x86SetPtr(char *ptr); +void x86Shutdown(); + +void x86SetJ8(u8 *j8); +void x86SetJ32(u32 *j32); +void x86Align(int bytes); + + +/********************/ +/* IX86 intructions */ +/********************/ + +/* + * scale values: + * 0 - *1 + * 1 - *2 + * 2 - *4 + * 3 - *8 + */ + +//////////////////////////////////// +// mov instructions / +//////////////////////////////////// + +/* mov r32 to r32 */ +void MOV32RtoR(int to, int from); +/* mov r32 to m32 */ +void MOV32RtoM(u32 to, int from); +/* mov m32 to r32 */ +void MOV32MtoR(int to, u32 from); +/* mov [r32] to r32 */ +void MOV32RmtoR(int to, int from); +/* mov [r32][r32*scale] to r32 */ +void MOV32RmStoR(int to, int from, int from2, int scale); +/* mov r32 to [r32] */ +void MOV32RtoRm(int to, int from); +/* mov r32 to [r32][r32*scale] */ +void MOV32RtoRmS(int to, int to2, int scale, int from); +/* mov imm32 to r32 */ +void MOV32ItoR(int to, u32 from); +/* mov imm32 to m32 */ +void MOV32ItoM(u32 to, u32 from); + +/* mov r16 to m16 */ +void MOV16RtoM(u32 to, int from); +/* mov m16 to r16 */ +void MOV16MtoR(int to, u32 from); +/* mov imm16 to m16 */ +void MOV16ItoM(u32 to, u16 from); + +/* mov r8 to m8 */ +void MOV8RtoM(u32 to, int from); +/* mov m8 to r8 */ +void MOV8MtoR(int to, u32 from); +/* mov imm8 to m8 */ +void MOV8ItoM(u32 to, u8 from); + +/* movsx r8 to r32 */ +void MOVSX32R8toR(int to, int from); +/* movsx m8 to r32 */ +void MOVSX32M8toR(int to, u32 from); +/* movsx r16 to r32 */ +void MOVSX32R16toR(int to, int from); +/* movsx m16 to r32 */ +void MOVSX32M16toR(int to, u32 from); + +/* movzx r8 to r32 */ +void MOVZX32R8toR(int to, int from); +/* movzx m8 to r32 */ +void MOVZX32M8toR(int to, u32 from); +/* movzx r16 to r32 */ +void MOVZX32R16toR(int to, int from); +/* movzx m16 to r32 */ +void MOVZX32M16toR(int to, u32 from); + +/* cmovne r32 to r32 */ +void CMOVNE32RtoR(int to, int from); +/* cmovne m32 to r32*/ +void CMOVNE32MtoR(int to, u32 from); +/* cmove r32 to r32*/ +void CMOVE32RtoR(int to, int from); +/* cmove m32 to r32*/ +void CMOVE32MtoR(int to, u32 from); +/* cmovg r32 to r32*/ +void CMOVG32RtoR(int to, int from); +/* cmovg m32 to r32*/ +void CMOVG32MtoR(int to, u32 from); +/* cmovge r32 to r32*/ +void CMOVGE32RtoR(int to, int from); +/* cmovge m32 to r32*/ +void CMOVGE32MtoR(int to, u32 from); +/* cmovl r32 to r32*/ +void CMOVL32RtoR(int to, int from); +/* cmovl m32 to r32*/ +void CMOVL32MtoR(int to, u32 from); +/* cmovle r32 to r32*/ +void CMOVLE32RtoR(int to, int from); +/* cmovle m32 to r32*/ +void CMOVLE32MtoR(int to, u32 from); + +//////////////////////////////////// +// arithmetic instructions / +//////////////////////////////////// + +/* add imm32 to r32 */ +void ADD32ItoR(int to, u32 from); +/* add imm32 to m32 */ +void ADD32ItoM(u32 to, u32 from); +/* add r32 to r32 */ +void ADD32RtoR(int to, int from); +/* add r32 to m32 */ +void ADD32RtoM(u32 to, int from); +/* add m32 to r32 */ +void ADD32MtoR(int to, u32 from); + +/* adc imm32 to r32 */ +void ADC32ItoR(int to, u32 from); +/* adc r32 to r32 */ +void ADC32RtoR(int to, int from); +/* adc m32 to r32 */ +void ADC32MtoR(int to, u32 from); + +/* inc r32 */ +void INC32R(int to); +/* inc m32 */ +void INC32M(u32 to); + +/* sub imm32 to r32 */ +void SUB32ItoR(int to, u32 from); +/* sub r32 to r32 */ +void SUB32RtoR(int to, int from); +/* sub m32 to r32 */ +void SUB32MtoR(int to, u32 from); + +/* sbb imm32 to r32 */ +void SBB32ItoR(int to, u32 from); +/* sbb r32 to r32 */ +void SBB32RtoR(int to, int from); +/* sbb m32 to r32 */ +void SBB32MtoR(int to, u32 from); + +/* dec r32 */ +void DEC32R(int to); +/* dec m32 */ +void DEC32M(u32 to); + +/* mul eax by r32 to edx:eax */ +void MUL32R(int from); +/* mul eax by m32 to edx:eax */ +void MUL32M(u32 from); + +/* imul eax by r32 to edx:eax */ +void IMUL32R(int from); +/* imul eax by m32 to edx:eax */ +void IMUL32M(u32 from); +/* imul r32 by r32 to r32 */ +void IMUL32RtoR(int to, int from); + +/* div eax by r32 to edx:eax */ +void DIV32R(int from); +/* div eax by m32 to edx:eax */ +void DIV32M(u32 from); + +/* idiv eax by r32 to edx:eax */ +void IDIV32R(int from); +/* idiv eax by m32 to edx:eax */ +void IDIV32M(u32 from); + +//////////////////////////////////// +// shifting instructions / +//////////////////////////////////// + +/* shl imm8 to r32 */ +void SHL32ItoR(int to, u8 from); +/* shl cl to r32 */ +void SHL32CLtoR(int to); + +/* shr imm8 to r32 */ +void SHR32ItoR(int to, u8 from); +/* shr cl to r32 */ +void SHR32CLtoR(int to); + +/* sar imm8 to r32 */ +void SAR32ItoR(int to, u8 from); +/* sar cl to r32 */ +void SAR32CLtoR(int to); + +/* sal imm8 to r32 */ +#define SAL32ItoR SHL32ItoR +/* sal cl to r32 */ +#define SAL32CLtoR SHL32CLtoR + +// logical instructions + +/* or imm32 to r32 */ +void OR32ItoR(int to, u32 from); +/* or imm32 to m32 */ +void OR32ItoM(u32 to, u32 from); +/* or r32 to r32 */ +void OR32RtoR(int to, int from); +/* or r32 to m32 */ +void OR32RtoM(u32 to, int from); +/* or m32 to r32 */ +void OR32MtoR(int to, u32 from); + +/* xor imm32 to r32 */ +void XOR32ItoR(int to, u32 from); +/* xor imm32 to m32 */ +void XOR32ItoM(u32 to, u32 from); +/* xor r32 to r32 */ +void XOR32RtoR(int to, int from); +/* xor r32 to m32 */ +void XOR32RtoM(u32 to, int from); +/* xor m32 to r32 */ +void XOR32MtoR(int to, u32 from); + +/* and imm32 to r32 */ +void AND32ItoR(int to, u32 from); +/* and imm32 to m32 */ +void AND32ItoM(u32 to, u32 from); +/* and r32 to r32 */ +void AND32RtoR(int to, int from); +/* and r32 to m32 */ +void AND32RtoM(u32 to, int from); +/* and m32 to r32 */ +void AND32MtoR(int to, u32 from); + +/* not r32 */ +void NOT32R(int from); +/* neg r32 */ +void NEG32R(int from); + +//////////////////////////////////// +// jump instructions / +//////////////////////////////////// + +/* jmp rel8 */ +u8* JMP8(u8 to); + +/* jmp rel32 */ +u32* JMP32(u32 to); +/* jmp r32 */ +void JMP32R(int to); + +/* je rel8 */ +u8* JE8(u8 to); +/* jz rel8 */ +u8* JZ8(u8 to); +/* jg rel8 */ +u8* JG8(u8 to); +/* jge rel8 */ +u8* JGE8(u8 to); +/* jl rel8 */ +u8* JL8(u8 to); +/* jle rel8 */ +u8* JLE8(u8 to); +/* jne rel8 */ +u8* JNE8(u8 to); +/* jnz rel8 */ +u8* JNZ8(u8 to); +/* jng rel8 */ +u8* JNG8(u8 to); +/* jnge rel8 */ +u8* JNGE8(u8 to); +/* jnl rel8 */ +u8* JNL8(u8 to); +/* jnle rel8 */ +u8* JNLE8(u8 to); +/* jo rel8 */ +u8* JO8(u8 to); +/* jno rel8 */ +u8* JNO8(u8 to); + +/* je rel32 */ +u32* JE32(u32 to); +/* jz rel32 */ +u32* JZ32(u32 to); +/* jg rel32 */ +u32* JG32(u32 to); +/* jge rel32 */ +u32* JGE32(u32 to); +/* jl rel32 */ +u32* JL32(u32 to); +/* jle rel32 */ +u32* JLE32(u32 to); +/* jne rel32 */ +u32* JNE32(u32 to); +/* jnz rel32 */ +u32* JNZ32(u32 to); +/* jng rel32 */ +u32* JNG32(u32 to); +/* jnge rel32 */ +u32* JNGE32(u32 to); +/* jnl rel32 */ +u32* JNL32(u32 to); +/* jnle rel32 */ +u32* JNLE32(u32 to); +/* jo rel32 */ +u32* JO32(u32 to); +/* jno rel32 */ +u32* JNO32(u32 to); + +/* call func */ +void CALLFunc(u32 func); // based on CALL32 +/* call rel32 */ +void CALL32(u32 to); +/* call r32 */ +void CALL32R(int to); +/* call m32 */ +void CALL32M(u32 to); + +//////////////////////////////////// +// misc instructions / +//////////////////////////////////// + +/* cmp imm32 to r32 */ +void CMP32ItoR(int to, u32 from); +/* cmp imm32 to m32 */ +void CMP32ItoM(u32 to, u32 from); +/* cmp r32 to r32 */ +void CMP32RtoR(int to, int from); +/* cmp m32 to r32 */ +void CMP32MtoR(int to, u32 from); + +/* test imm32 to r32 */ +void TEST32ItoR(int to, u32 from); +/* test r32 to r32 */ +void TEST32RtoR(int to, int from); +/* sets r8 */ +void SETS8R(int to); +/* setl r8 */ +void SETL8R(int to); +/* setb r8 */ +void SETB8R(int to); + +/* cbw */ +void CBW(); +/* cwd */ +void CWD(); +/* cdq */ +void CDQ(); + +/* push r32 */ +void PUSH32R(int from); +/* push m32 */ +void PUSH32M(u32 from); +/* push imm32 */ +void PUSH32I(u32 from); + +/* pop r32 */ +void POP32R(int from); + +/* pushad */ +void PUSHA32(); +/* popad */ +void POPA32(); + +/* ret */ +void RET(); + +/********************/ +/* FPU instructions */ +/********************/ + +/* fild m32 to fpu reg stack */ +void FILD32(u32 from); +/* fistp m32 from fpu reg stack */ +void FISTP32(u32 from); +/* fld m32 to fpu reg stack */ +void FLD32(u32 from); +/* fstp m32 from fpu reg stack */ +void FSTP32(u32 to); + +/* fldcw fpu control word from m16 */ +void FLDCW(u32 from); +/* fstcw fpu control word to m16 */ +void FNSTCW(u32 to); + +/* fadd m32 to fpu reg stack */ +void FADD32(u32 from); +/* fsub m32 to fpu reg stack */ +void FSUB32(u32 from); +/* fmul m32 to fpu reg stack */ +void FMUL32(u32 from); +/* fdiv m32 to fpu reg stack */ +void FDIV32(u32 from); +/* fabs fpu reg stack */ +void FABS(); +/* fsqrt fpu reg stack */ +void FSQRT(); +/* fchs fpu reg stack */ +void FCHS(); + +/********************/ +/* MMX instructions */ +/********************/ + +// r64 = mm + +/* movq m64 to r64 */ +void MOVQMtoR(int to, u32 from); +/* movq r64 to m64 */ +void MOVQRtoM(u32 to, int from); + +/* pand r64 to r64 */ +void PANDRtoR(int to, int from); +/* pand m64 to r64 */ +void PANDMtoR(int to, u32 from); + +/* pandn r64 to r64 */ +void PANDNRtoR(int to, int from); + +/* pandn r64 to r64 */ +void PANDNMtoR(int to, u32 from); + +/* por r64 to r64 */ +void PORRtoR(int to, int from); +/* por m64 to r64 */ +void PORMtoR(int to, u32 from); + +/* pxor r64 to r64 */ +void PXORRtoR(int to, int from); +/* pxor m64 to r64 */ +void PXORMtoR(int to, u32 from); + +/* psllq r64 to r64 */ +void PSLLQRtoR(int to, int from); +/* psllq m64 to r64 */ +void PSLLQMtoR(int to, u32 from); +/* psllq imm8 to r64 */ +void PSLLQItoR(int to, u8 from); + +/* psrlq r64 to r64 */ +void PSRLQRtoR(int to, int from); +/* psrlq m64 to r64 */ +void PSRLQMtoR(int to, u32 from); +/* psrlq imm8 to r64 */ +void PSRLQItoR(int to, u8 from); + +/* paddusb r64 to r64 */ +void PADDUSBRtoR(int to, int from); +/* paddusb m64 to r64 */ +void PADDUSBMtoR(int to, u32 from); +/* paddusw r64 to r64 */ +void PADDUSWRtoR(int to, int from); +/* paddusw m64 to r64 */ +void PADDUSWMtoR(int to, u32 from); + +/* paddb r64 to r64 */ +void PADDBRtoR(int to, int from); +/* paddb m64 to r64 */ +void PADDBMtoR(int to, u32 from); +/* paddw r64 to r64 */ +void PADDWRtoR(int to, int from); +/* paddw m64 to r64 */ +void PADDWMtoR(int to, u32 from); +/* paddd r64 to r64 */ +void PADDDRtoR(int to, int from); +/* paddd m64 to r64 */ +void PADDDMtoR(int to, u32 from); + +/* emms */ +void EMMS(); +void FEMMS(); +void BT32ItoR(int to,int from); +void RCR32ItoR(int to,int from); + +//Basara:changed +void PADDSBRtoR(int to, int from); +void PADDSWRtoR(int to, int from); +void PADDSDRtoR(int to, int from); +void PSUBSBRtoR(int to, int from); +void PSUBSWRtoR(int to, int from); +void PSUBSDRtoR(int to, int from); + +void PSUBBRtoR(int to, int from); +void PSUBWRtoR(int to, int from); +void PSUBDRtoR(int to, int from); + +void MOVQ64ItoR(int reg,u64 i); //Prototype.Todo add all consts to end of block.not after jr $+8 + +void PMAXSWRtoR(int to,int from); +void PMINSWRtoR(int to,int from); + +void PCMPEQBRtoR(int to,int from); +void PCMPEQWRtoR(int to,int from); +void PCMPEQDRtoR(int to,int from); + +void PCMPGTBRtoR(int to,int from); +void PCMPGTWRtoR(int to,int from); +void PCMPGTDRtoR(int to,int from); + +void PSRLWItoR(int to,int from); +void PSRLDItoR(int to,int from); +void PSLLWItoR(int to,int from); +void PSLLDItoR(int to,int from); +void PSRAWItoR(int to,int from); +void PSRADItoR(int to,int from); + +//Added:basara 11.01.2003 +void FCOMP32(u32 from); +void FNSTSWtoAX(); +void SETNZ8R(int to); + +//Added:basara 14.01.2003 +void PFCMPEQMtoR(int to,int from); +void PFCMPGTMtoR(int to,int from); +void PFCMPGEMtoR(int to,int from); + +void PFADDMtoR(int to,int from); +void PFADDRtoR(int to,int from); + +void PFSUBMtoR(int to,int from); +void PFSUBRtoR(int to,int from); + +void PFMULMtoR(int to,int from); +void PFMULRtoR(int to,int from); + +void PFRCPMtoR(int to,int from); +void PFRCPRtoR(int to,int from); +void PFRCPIT1RtoR(int to,int from); +void PFRCPIT2RtoR(int to,int from); + +void PFRSQRTRtoR(int to,int from); +void PFRSQIT1RtoR(int to,int from); + +void PF2IDMtoR(int to,int from); +void PF2IDRtoR(int to,int from); +void PI2FDMtoR(int to,int from); +void PI2FDRtoR(int to,int from); + +void PFMAXMtoR(int to,int from); +void PFMAXRtoR(int to,int from); +void PFMINMtoR(int to,int from); +void PFMINRtoR(int to,int from); + +void MOVDMtoR(int to, u32 from); +void MOVDRtoM(u32 to, int from); +void MOVD32RtoR(int to, int from); +void MOVD64RtoR(int to, int from); + +void MOVQRtoR(int to,int from); + +//if to==from MMLO=MMHI +void PUNPCKHDQRtoR(int to,int from); + +//if to==from MMHI=MMLO +void PUNPCKLDQRtoR(int to,int from); + +/* + SSE intructions +*/ +void MOVAPSMtoR(int to,int from); +void MOVAPSRtoM(int to,int from); +void MOVAPSRtoR(int to,int from); + +void ORPSMtoR(int to,int from); +void ORPSRtoR(int to,int from); + +void XORPSMtoR(int to,int from); +void XORPSRtoR(int to,int from); + +void ANDPSMtoR(int to,int from); +void ANDPSRtoR(int to,int from); + +#ifdef __cplusplus +} +#endif +#endif -- cgit v1.2.3