X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fix86%2Fix86.c;fp=libpcsxcore%2Fix86%2Fix86.c;h=0000000000000000000000000000000000000000;hp=d701e899bc841cbb6783bfc5936d0900cd416a86;hb=89f33b734d7d540c7fa26f6556ef9ec49eb3008a;hpb=665f33e1e8ce2e40a7939a33075c3bce1c90790c diff --git a/libpcsxcore/ix86/ix86.c b/libpcsxcore/ix86/ix86.c deleted file mode 100644 index d701e899..00000000 --- a/libpcsxcore/ix86/ix86.c +++ /dev/null @@ -1,1723 +0,0 @@ -/*************************************************************************** - * 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 core v0.5.1 - * Authors: linuzappz - * alexey silinov - */ - -#include "ix86.h" - -s8 *x86Ptr; -u8 *j8Ptr[32]; -u32 *j32Ptr[32]; - -void x86Init() { -} - -void x86SetPtr(char *ptr) { - x86Ptr = ptr; -} - -void x86Shutdown() { -} - -void x86SetJ8(u8 *j8) { - u32 jump = (x86Ptr - (s8*)j8) - 1; - - if (jump > 0x7f) printf("j8 greater than 0x7f!!\n"); - *j8 = (u8)jump; -} - -void x86SetJ32(u32 *j32) { - *j32 = (x86Ptr - (s8*)j32) - 4; -} - -void x86Align(int bytes) { - // fordward align - x86Ptr = (s8*)(((u32)x86Ptr + bytes) & ~(bytes - 1)); -} - -#define SIB 4 -#define DISP32 5 - -/* macros helpers */ - -#define ModRM(mod, rm, reg) \ - write8((mod << 6) | (rm << 3) | (reg)); - -#define SibSB(ss, rm, index) \ - write8((ss << 6) | (rm << 3) | (index)); - -#define SET8R(cc, to) { \ - write8(0x0F); write8(cc); \ - write8((0xC0) | (to)); } - -#define J8Rel(cc, to) { \ - write8(cc); write8(to); return x86Ptr - 1; } - -#define J32Rel(cc, to) { \ - write8(0x0F); write8(cc); write32(to); return (u32*)(x86Ptr - 4); } - -#define CMOV32RtoR(cc, to, from) { \ - write8(0x0F); write8(cc); \ - ModRM(3, to, from); } - -#define CMOV32MtoR(cc, to, from) { \ - write8(0x0F); write8(cc); \ - ModRM(0, to, DISP32); \ - write32(from); } - -/********************/ -/* IX86 intructions */ -/********************/ - -// mov instructions - -/* mov r32 to r32 */ -void MOV32RtoR(int to, int from) { - write8(0x89); - ModRM(3, from, to); -} - -/* mov r32 to m32 */ -void MOV32RtoM(u32 to, int from) { - write8(0x89); - ModRM(0, from, DISP32); - write32(to); -} - -/* mov m32 to r32 */ -void MOV32MtoR(int to, u32 from) { - write8(0x8B); - ModRM(0, to, DISP32); - write32(from); -} - -/* mov [r32] to r32 */ -void MOV32RmtoR(int to, int from) { - write8(0x8B); - ModRM(0, to, from); -} - -/* mov [r32][r32*scale] to r32 */ -void MOV32RmStoR(int to, int from, int from2, int scale) { - write8(0x8B); - ModRM(0, to, 0x4); - SibSB(scale, from2, from); -} - -/* mov r32 to [r32] */ -void MOV32RtoRm(int to, int from) { - write8(0x89); - ModRM(0, from, to); -} - -/* mov r32 to [r32][r32*scale] */ -void MOV32RtoRmS(int to, int to2, int scale, int from) { - write8(0x89); - ModRM(0, from, 0x4); - SibSB(scale, to2, to); -} - -/* mov imm32 to r32 */ -void MOV32ItoR(int to, u32 from) { - write8(0xB8 | to); - write32(from); -} - -/* mov imm32 to m32 */ -void MOV32ItoM(u32 to, u32 from) { - write8(0xC7); - ModRM(0, 0, DISP32); - write32(to); - write32(from); -} - -/* mov r16 to m16 */ -void MOV16RtoM(u32 to, int from) { - write8(0x66); - write8(0x89); - ModRM(0, from, DISP32); - write32(to); -} - -/* mov m16 to r16 */ -void MOV16MtoR(int to, u32 from) { - write8(0x66); - write8(0x8B); - ModRM(0, to, DISP32); - write32(from); -} - -/* mov imm16 to m16 */ -void MOV16ItoM(u32 to, u16 from) { - write8(0x66); - write8(0xC7); - ModRM(0, 0, DISP32); - write32(to); - write16(from); -} - -/* mov r8 to m8 */ -void MOV8RtoM(u32 to, int from) { - write8(0x88); - ModRM(0, from, DISP32); - write32(to); -} - -/* mov m8 to r8 */ -void MOV8MtoR(int to, u32 from) { - write8(0x8A); - ModRM(0, to, DISP32); - write32(from); -} - -/* mov imm8 to m8 */ -void MOV8ItoM(u32 to, u8 from) { - write8(0xC6); - ModRM(0, 0, DISP32); - write32(to); - write8(from); -} - -/* movsx r8 to r32 */ -void MOVSX32R8toR(int to, int from) { - write16(0xBE0F); - ModRM(3, to, from); -} - -/* movsx m8 to r32 */ -void MOVSX32M8toR(int to, u32 from) { - write16(0xBE0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* movsx r16 to r32 */ -void MOVSX32R16toR(int to, int from) { - write16(0xBF0F); - ModRM(3, to, from); -} - -/* movsx m16 to r32 */ -void MOVSX32M16toR(int to, u32 from) { - write16(0xBF0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* movzx r8 to r32 */ -void MOVZX32R8toR(int to, int from) { - write16(0xB60F); - ModRM(3, to, from); -} - -/* movzx m8 to r32 */ -void MOVZX32M8toR(int to, u32 from) { - write16(0xB60F); - ModRM(0, to, DISP32); - write32(from); -} - -/* movzx r16 to r32 */ -void MOVZX32R16toR(int to, int from) { - write16(0xB70F); - ModRM(3, to, from); -} - -/* movzx m16 to r32 */ -void MOVZX32M16toR(int to, u32 from) { - write16(0xB70F); - ModRM(0, to, DISP32); - write32(from); -} - -/* cmovne r32 to r32 */ -void CMOVNE32RtoR(int to, int from) { - CMOV32RtoR(0x45, to, from); -} - -/* cmovne m32 to r32*/ -void CMOVNE32MtoR(int to, u32 from) { - CMOV32MtoR(0x45, to, from); -} - -/* cmove r32 to r32*/ -void CMOVE32RtoR(int to, int from) { - CMOV32RtoR(0x44, to, from); -} - -/* cmove m32 to r32*/ -void CMOVE32MtoR(int to, u32 from) { - CMOV32MtoR(0x44, to, from); -} - -/* cmovg r32 to r32*/ -void CMOVG32RtoR(int to, int from) { - CMOV32RtoR(0x4F, to, from); -} - -/* cmovg m32 to r32*/ -void CMOVG32MtoR(int to, u32 from) { - CMOV32MtoR(0x4F, to, from); -} - -/* cmovge r32 to r32*/ -void CMOVGE32RtoR(int to, int from) { - CMOV32RtoR(0x4D, to, from); -} - -/* cmovge m32 to r32*/ -void CMOVGE32MtoR(int to, u32 from) { - CMOV32MtoR(0x4D, to, from); -} - -/* cmovl r32 to r32*/ -void CMOVL32RtoR(int to, int from) { - CMOV32RtoR(0x4C, to, from); -} - -/* cmovl m32 to r32*/ -void CMOVL32MtoR(int to, u32 from) { - CMOV32MtoR(0x4C, to, from); -} - -/* cmovle r32 to r32*/ -void CMOVLE32RtoR(int to, int from) { - CMOV32RtoR(0x4E, to, from); -} - -/* cmovle m32 to r32*/ -void CMOVLE32MtoR(int to, u32 from) { - CMOV32MtoR(0x4E, to, from); -} - -// arithmic instructions - -/* add imm32 to r32 */ -void ADD32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x05); - } else { - write8(0x81); - ModRM(3, 0, to); - } - write32(from); -} - -/* add imm32 to m32 */ -void ADD32ItoM(u32 to, u32 from) { - write8(0x81); - ModRM(0, 0, DISP32); - write32(to); - write32(from); -} - -/* add r32 to r32 */ -void ADD32RtoR(int to, int from) { - write8(0x01); - ModRM(3, from, to); -} - -/* add r32 to m32 */ -void ADD32RtoM(u32 to, int from) { - write8(0x01); - ModRM(0, from, DISP32); - write32(to); -} - -/* add m32 to r32 */ -void ADD32MtoR(int to, u32 from) { - write8(0x03); - ModRM(0, to, DISP32); - write32(from); -} - -/* adc imm32 to r32 */ -void ADC32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x15); - } else { - write8(0x81); - ModRM(3, 2, to); - } - write32(from); -} - -/* adc r32 to r32 */ -void ADC32RtoR(int to, int from) { - write8(0x11); - ModRM(3, from, to); -} - -/* adc m32 to r32 */ -void ADC32MtoR(int to, u32 from) { - write8(0x13); - ModRM(0, to, DISP32); - write32(from); -} - -/* inc r32 */ -void INC32R(int to) { - write8(0x40 + to); -} - -/* inc m32 */ -void INC32M(u32 to) { - write8(0xFF); - ModRM(0, 0, DISP32); - write32(to); -} - -/* sub imm32 to r32 */ -void SUB32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x2D); - } else { - write8(0x81); - ModRM(3, 5, to); - } - write32(from); -} - -/* sub r32 to r32 */ -void SUB32RtoR(int to, int from) { - write8(0x29); - ModRM(3, from, to); -} - -/* sub m32 to r32 */ -void SUB32MtoR(int to, u32 from) { - write8(0x2B); - ModRM(0, to, DISP32); - write32(from); -} - -/* sbb imm32 to r32 */ -void SBB32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x1D); - } else { - write8(0x81); - ModRM(3, 3, to); - } - write32(from); -} - -/* sbb r32 to r32 */ -void SBB32RtoR(int to, int from) { - write8(0x19); - ModRM(3, from, to); -} - -/* sbb m32 to r32 */ -void SBB32MtoR(int to, u32 from) { - write8(0x1B); - ModRM(0, to, DISP32); - write32(from); -} - -/* dec r32 */ -void DEC32R(int to) { - write8(0x48 + to); -} - -/* dec m32 */ -void DEC32M(u32 to) { - write8(0xFF); - ModRM(0, 1, DISP32); - write32(to); -} - -/* mul eax by r32 to edx:eax */ -void MUL32R(int from) { - write8(0xF7); - ModRM(3, 4, from); -} - -/* imul eax by r32 to edx:eax */ -void IMUL32R(int from) { - write8(0xF7); - ModRM(3, 5, from); -} - -/* mul eax by m32 to edx:eax */ -void MUL32M(u32 from) { - write8(0xF7); - ModRM(0, 4, DISP32); - write32(from); -} - -/* imul eax by m32 to edx:eax */ -void IMUL32M(u32 from) { - write8(0xF7); - ModRM(0, 5, DISP32); - write32(from); -} - -/* imul r32 by r32 to r32 */ -void IMUL32RtoR(int to, int from) { - write16(0xAF0F); - ModRM(3, to, from); -} - -/* div eax by r32 to edx:eax */ -void DIV32R(int from) { - write8(0xF7); - ModRM(3, 6, from); -} - -/* idiv eax by r32 to edx:eax */ -void IDIV32R(int from) { - write8(0xF7); - ModRM(3, 7, from); -} - -/* div eax by m32 to edx:eax */ -void DIV32M(u32 from) { - write8(0xF7); - ModRM(0, 6, DISP32); - write32(from); -} - -/* idiv eax by m32 to edx:eax */ -void IDIV32M(u32 from) { - write8(0xF7); - ModRM(0, 7, DISP32); - write32(from); -} - -// shifting instructions - -void RCR32ItoR(int to,int from) -{ - if (from==1) - { - write8(0xd1); - write8(0xd8 | to); - } - else - { - write8(0xc1); - write8(0xd8 | to); - write8(from); - } -} - -/* shl imm8 to r32 */ -void SHL32ItoR(int to, u8 from) { - if (from==1) - { - write8(0xd1); - write8(0xe0 | to); - return; - } - write8(0xC1); - ModRM(3, 4, to); - write8(from); -} - -/* shl cl to r32 */ -void SHL32CLtoR(int to) { - write8(0xD3); - ModRM(3, 4, to); -} - -/* shr imm8 to r32 */ -void SHR32ItoR(int to, u8 from) { - if (from==1) - { - write8(0xd1); - write8(0xe8 | to); - return; - } - write8(0xC1); - ModRM(3, 5, to); - write8(from); -} - -/* shr cl to r32 */ -void SHR32CLtoR(int to) { - write8(0xD3); - ModRM(3, 5, to); -} - -/* sar imm8 to r32 */ -void SAR32ItoR(int to, u8 from) { - write8(0xC1); - ModRM(3, 7, to); - write8(from); -} - -/* sar cl to r32 */ -void SAR32CLtoR(int to) { - write8(0xD3); - ModRM(3, 7, to); -} - - -// logical instructions - -/* or imm32 to r32 */ -void OR32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x0D); - } else { - write8(0x81); - ModRM(3, 1, to); - } - write32(from); -} - -/* or imm32 to m32 */ -void OR32ItoM(u32 to, u32 from) { - write8(0x81); - ModRM(0, 1, DISP32); - write32(to); - write32(from); -} - -/* or r32 to r32 */ -void OR32RtoR(int to, int from) { - write8(0x09); - ModRM(3, from, to); -} - -/* or r32 to m32 */ -void OR32RtoM(u32 to, int from) { - write8(0x09); - ModRM(0, from, DISP32); - write32(to); -} - -/* or m32 to r32 */ -void OR32MtoR(int to, u32 from) { - write8(0x0B); - ModRM(0, to, DISP32); - write32(from); -} - -/* xor imm32 to r32 */ -void XOR32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x35); - } else { - write8(0x81); - ModRM(3, 6, to); - } - write32(from); -} - -/* xor imm32 to m32 */ -void XOR32ItoM(u32 to, u32 from) { - write8(0x81); - ModRM(0, 6, DISP32); - write32(to); - write32(from); -} - -/* xor r32 to r32 */ -void XOR32RtoR(int to, int from) { - write8(0x31); - ModRM(3, from, to); -} - -/* xor r32 to m32 */ -void XOR32RtoM(u32 to, int from) { - write8(0x31); - ModRM(0, from, DISP32); - write32(to); -} - -/* xor m32 to r32 */ -void XOR32MtoR(int to, u32 from) { - write8(0x33); - ModRM(0, to, DISP32); - write32(from); -} - -/* and imm32 to r32 */ -void AND32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x25); - } else { - write8(0x81); - ModRM(3, 0x4, to); - } - write32(from); -} - -/* and imm32 to m32 */ -void AND32ItoM(u32 to, u32 from) { - write8(0x81); - ModRM(0, 0x4, DISP32); - write32(to); - write32(from); -} - -/* and r32 to r32 */ -void AND32RtoR(int to, int from) { - write8(0x21); - ModRM(3, from, to); -} - -/* and r32 to m32 */ -void AND32RtoM(u32 to, int from) { - write8(0x21); - ModRM(0, from, DISP32); - write32(to); -} - -/* and m32 to r32 */ -void AND32MtoR(int to, u32 from) { - write8(0x23); - ModRM(0, to, DISP32); - write32(from); -} - -/* not r32 */ -void NOT32R(int from) { - write8(0xF7); - ModRM(3, 2, from); -} - -/* neg r32 */ -void NEG32R(int from) { - write8(0xF7); - ModRM(3, 3, from); -} - -// jump instructions - -/* jmp rel8 */ -u8* JMP8(u8 to) { - write8(0xEB); - write8(to); - return x86Ptr - 1; -} - -/* jmp rel32 */ -u32* JMP32(u32 to) { - write8(0xE9); - write32(to); - return (u32*)(x86Ptr - 4); -} - -/* jmp r32 */ -void JMP32R(int to) { - write8(0xFF); - ModRM(3, 4, to); -} - -/* je rel8 */ -u8* JE8(u8 to) { - J8Rel(0x74, to); -} - -/* jz rel8 */ -u8* JZ8(u8 to) { - J8Rel(0x74, to); -} - -/* jg rel8 */ -u8* JG8(u8 to) { - J8Rel(0x7F, to); -} - -/* jge rel8 */ -u8* JGE8(u8 to) { - J8Rel(0x7D, to); -} - -/* jl rel8 */ -u8* JL8(u8 to) { - J8Rel(0x7C, to); -} - -/* jle rel8 */ -u8* JLE8(u8 to) { - J8Rel(0x7E, to); -} - -/* jne rel8 */ -u8* JNE8(u8 to) { - J8Rel(0x75, to); -} - -/* jnz rel8 */ -u8* JNZ8(u8 to) { - J8Rel(0x75, to); -} - -/* jng rel8 */ -u8* JNG8(u8 to) { - J8Rel(0x7E, to); -} - -/* jnge rel8 */ -u8* JNGE8(u8 to) { - J8Rel(0x7C, to); -} - -/* jnl rel8 */ -u8* JNL8(u8 to) { - J8Rel(0x7D, to); -} - -/* jnle rel8 */ -u8* JNLE8(u8 to) { - J8Rel(0x7F, to); -} - -/* jo rel8 */ -u8* JO8(u8 to) { - J8Rel(0x70, to); -} - -/* jno rel8 */ -u8* JNO8(u8 to) { - J8Rel(0x71, to); -} - -/* je rel32 */ -u32* JE32(u32 to) { - J32Rel(0x84, to); -} - -/* jz rel32 */ -u32* JZ32(u32 to) { - J32Rel(0x84, to); -} - -/* jg rel32 */ -u32* JG32(u32 to) { - J32Rel(0x8F, to); -} - -/* jge rel32 */ -u32* JGE32(u32 to) { - J32Rel(0x8D, to); -} - -/* jl rel32 */ -u32* JL32(u32 to) { - J32Rel(0x8C, to); -} - -/* jle rel32 */ -u32* JLE32(u32 to) { - J32Rel(0x8E, to); -} - -/* jne rel32 */ -u32* JNE32(u32 to) { - J32Rel(0x85, to); -} - -/* jnz rel32 */ -u32* JNZ32(u32 to) { - J32Rel(0x85, to); -} - -/* jng rel32 */ -u32* JNG32(u32 to) { - J32Rel(0x8E, to); -} - -/* jnge rel32 */ -u32* JNGE32(u32 to) { - J32Rel(0x8C, to); -} - -/* jnl rel32 */ -u32* JNL32(u32 to) { - J32Rel(0x8D, to); -} - -/* jnle rel32 */ -u32* JNLE32(u32 to) { - J32Rel(0x8F, to); -} - -/* jo rel32 */ -u32* JO32(u32 to) { - J32Rel(0x80, to); -} - -/* jno rel32 */ -u32* JNO32(u32 to) { - J32Rel(0x81, to); -} - -/* call func */ -void CALLFunc(u32 func) { - CALL32(func - ((u32)x86Ptr + 5)); -} - -/* call rel32 */ -void CALL32(u32 to) { - write8(0xE8); - write32(to); -} - -/* call r32 */ -void CALL32R(int to) { - write8(0xFF); - ModRM(3, 2, to); -} - -/* call m32 */ -void CALL32M(u32 to) { - write8(0xFF); - ModRM(0, 2, DISP32); - write32(to); -} - -// misc instructions - -/* cmp imm32 to r32 */ -void CMP32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0x3D); - } else { - write8(0x81); - ModRM(3, 7, to); - } - write32(from); -} - -/* cmp imm32 to m32 */ -void CMP32ItoM(u32 to, u32 from) { - write8(0x81); - ModRM(0, 7, DISP32); - write32(to); - write32(from); -} - -/* cmp r32 to r32 */ -void CMP32RtoR(int to, int from) { - write8(0x39); - ModRM(3, from, to); -} - -/* cmp m32 to r32 */ -void CMP32MtoR(int to, u32 from) { - write8(0x3B); - ModRM(0, to, DISP32); - write32(from); -} - -/* test imm32 to r32 */ -void TEST32ItoR(int to, u32 from) { - if (to == EAX) { - write8(0xA9); - } else { - write8(0xF7); - ModRM(3, 0, to); - } - write32(from); -} - -/* test r32 to r32 */ -void TEST32RtoR(int to, int from) { - write8(0x85); - ModRM(3, from, to); -} - -void BT32ItoR(int to,int from) -{ - write16(0xba0f); - write8(0xe0 | to); - write8(from); -} - -/* sets r8 */ -void SETS8R(int to) { - SET8R(0x98, to); -} -/* setl r8 */ -void SETL8R(int to) { - SET8R(0x9C, to); -} - -/* setb r8 */ -void SETB8R(int to) { - SET8R(0x92, to); -} - -/* setnz r8 */ -void SETNZ8R(int to) { - SET8R(0x95,to); -} - -/* cbw */ -void CBW() { - write16(0x9866); -} - -/* cwd */ -void CWD() { - write8(0x98); -} - -/* cdq */ -void CDQ() { - write8(0x99); -} - -/* push r32 */ -void PUSH32R(int from) { - write8(0x50 | from); -} - -/* push m32 */ -void PUSH32M(u32 from) { - write8(0xFF); - ModRM(0, 6, DISP32); - write32(from); -} - -/* push imm32 */ -void PUSH32I(u32 from) { - write8(0x68); write32(from); -} - -/* pop r32 */ -void POP32R(int from) { - write8(0x58 | from); -} - -/* pushad */ -void PUSHA32() { - write8(0x60); -} - -/* popad */ -void POPA32() { - write8(0x61); -} - -/* ret */ -void RET() { - write8(0xC3); -} - -/********************/ -/* FPU instructions */ -/********************/ - -//Added:basara 14.01.2003 -/* compare m32 to fpu reg stack */ -void FCOMP32(u32 from) { - write8(0xD8); - ModRM(0, 0x3, DISP32); - write32(from); -} - -void FNSTSWtoAX() { - write16(0xE0DF); -} - -/* fild m32 to fpu reg stack */ -void FILD32(u32 from) { - write8(0xDB); - ModRM(0, 0x0, DISP32); - write32(from); -} - -/* fistp m32 from fpu reg stack */ -void FISTP32(u32 from) { - write8(0xDB); - ModRM(0, 0x3, DISP32); - write32(from); -} - -/* fld m32 to fpu reg stack */ -void FLD32(u32 from) { - write8(0xD9); - ModRM(0, 0x0, DISP32); - write32(from); -} - -/* fstp m32 from fpu reg stack */ -void FSTP32(u32 to) { - write8(0xD9); - ModRM(0, 0x3, DISP32); - write32(to); -} - -// - -/* fldcw fpu control word from m16 */ -void FLDCW(u32 from) { - write8(0xD9); - ModRM(0, 0x5, DISP32); - write32(from); -} - -/* fnstcw fpu control word to m16 */ -void FNSTCW(u32 to) { - write8(0xD9); - ModRM(0, 0x7, DISP32); - write32(to); -} - -// - -/* fadd m32 to fpu reg stack */ -void FADD32(u32 from) { - write8(0xD8); - ModRM(0, 0x0, DISP32); - write32(from); -} - -/* fsub m32 to fpu reg stack */ -void FSUB32(u32 from) { - write8(0xD8); - ModRM(0, 0x4, DISP32); - write32(from); -} - -/* fmul m32 to fpu reg stack */ -void FMUL32(u32 from) { - write8(0xD8); - ModRM(0, 0x1, DISP32); - write32(from); -} - -/* fdiv m32 to fpu reg stack */ -void FDIV32(u32 from) { - write8(0xD8); - ModRM(0, 0x6, DISP32); - write32(from); -} - -/* fabs fpu reg stack */ -void FABS() { - write16(0xE1D9); -} - -/* fsqrt fpu reg stack */ -void FSQRT() { - write16(0xFAD9); -} - -/* fchs fpu reg stack */ -void FCHS() { - write16(0xE0D9); -} - -/********************/ -/* MMX instructions */ -/********************/ - -// r64 = mm - -/* movq m64 to r64 */ -void MOVQMtoR(int to, u32 from) { - write16(0x6F0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* movq r64 to m64 */ -void MOVQRtoM(u32 to, int from) { - write16(0x7F0F); - ModRM(0, from, DISP32); - write32(to); -} - -/* pand r64 to r64 */ -void PANDRtoR(int to, int from) { - write16(0xDB0F); - ModRM(3, to, from); -} - -/* pand r64 to r64 */ -void PANDNRtoR(int to, int from) { - write16(0xDF0F); - ModRM(3, to, from); -} - -/* por r64 to r64 */ -void PORRtoR(int to, int from) { - write16(0xEB0F); - ModRM(3, to, from); -} - -/* pxor r64 to r64 */ -void PXORRtoR(int to, int from) { - write16(0xEF0F); - ModRM(3, to, from); -} - -/* psllq r64 to r64 */ -void PSLLQRtoR(int to, int from) { - write16(0xF30F); - ModRM(3, to, from); -} - -/* psllq m64 to r64 */ -void PSLLQMtoR(int to, u32 from) { - write16(0xF30F); - ModRM(0, to, DISP32); - write32(from); -} - -/* psllq imm8 to r64 */ -void PSLLQItoR(int to, u8 from) { - write16(0x730F); - ModRM(3, 6, to); - write8(from); -} - -/* psrlq r64 to r64 */ -void PSRLQRtoR(int to, int from) { - write16(0xD30F); - ModRM(3, to, from); -} - -/* psrlq m64 to r64 */ -void PSRLQMtoR(int to, u32 from) { - write16(0xD30F); - ModRM(0, to, DISP32); - write32(from); -} - -/* psrlq imm8 to r64 */ -void PSRLQItoR(int to, u8 from) { - write16(0x730F); - ModRM(3, 2, to); - write8(from); -} - -/* paddusb r64 to r64 */ -void PADDUSBRtoR(int to, int from) { - write16(0xDC0F); - ModRM(3, to, from); -} - -/* paddusb m64 to r64 */ -void PADDUSBMtoR(int to, u32 from) { - write16(0xDC0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* paddusw r64 to r64 */ -void PADDUSWRtoR(int to, int from) { - write16(0xDD0F); - ModRM(3, to, from); -} - -/* paddusw m64 to r64 */ -void PADDUSWMtoR(int to, u32 from) { - write16(0xDD0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* paddb r64 to r64 */ -void PADDBRtoR(int to, int from) { - write16(0xFC0F); - ModRM(3, to, from); -} - -/* paddb m64 to r64 */ -void PADDBMtoR(int to, u32 from) { - write16(0xFC0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* paddw r64 to r64 */ -void PADDWRtoR(int to, int from) { - write16(0xFD0F); - ModRM(3, to, from); -} - -/* paddw m64 to r64 */ -void PADDWMtoR(int to, u32 from) { - write16(0xFD0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* paddd r64 to r64 */ -void PADDDRtoR(int to, int from) { - write16(0xFE0F); - ModRM(3, to, from); -} - -/* paddd m64 to r64 */ -void PADDDMtoR(int to, u32 from) { - write16(0xFE0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* emms */ -void EMMS() { - //use femms if we have 3dnow - write16(0x0e0f); - return; -} - -/* femms */ -void FEMMS() { - write16(0x770F); - return; -} - -//Basara:changed -void PADDSBRtoR(int to, int from) { - write16(0xEC0F); - ModRM(3, to, from); -} - -void PADDSWRtoR(int to, int from) { - write16(0xED0F); - ModRM(3, to, from); -} - -void PADDSDRtoR(int to, int from) { - write16(0xEE0F); - ModRM(3, to, from); -} - -void PSUBSBRtoR(int to, int from) { - write16(0xE80F); - ModRM(3, to, from); -} - -void PSUBSWRtoR(int to, int from) { - write16(0xE90F); - ModRM(3, to, from); -} - -void PSUBSDRtoR(int to, int from) { - write16(0xEA0F); - ModRM(3, to, from); -} - -void PSUBBRtoR(int to, int from) { - write16(0xF80F); - ModRM(3, to, from); -} - -void PSUBWRtoR(int to, int from) { - write16(0xF90F); - ModRM(3, to, from); -} - -void PSUBDRtoR(int to, int from) { - write16(0xFA0F); - ModRM(3, to, from); -} - -//changed:basara -//P.s.It's sux.Don't use it offten. -void MOVQ64ItoR(int reg,u64 i) -{ - MOVQMtoR(reg,(u32)(x86Ptr)+2+7); - JMP8(8); - write64(i); -} - -void PSUBUSBRtoR(int to, int from) { - write16(0xD80F); - ModRM(3, to, from); -} - -void PSUBUSWRtoR(int to, int from) { - write16(0xD90F); - ModRM(3, to, from); -} - -void PMAXSWRtoR(int to,int from) -{ - write16(0xEE0F); - ModRM(3, to, from); -} - -void PMINSWRtoR(int to,int from) -{ - write16(0xEA0F); - ModRM(3, to, from); -} - -void PCMPEQBRtoR(int to,int from) -{ - write16(0x740F); - ModRM(3, to, from); -} - -void PCMPEQWRtoR(int to,int from) -{ - write16(0x750F); - ModRM(3, to, from); -} - -void PCMPEQDRtoR(int to,int from) -{ - write16(0x760F); - ModRM(3, to, from); -} - -void PCMPGTBRtoR(int to,int from) -{ - write16(0x640F); - ModRM(3, to, from); -} - -void PCMPGTWRtoR(int to,int from) -{ - write16(0x650F); - ModRM(3, to, from); -} - -void PCMPGTDRtoR(int to,int from) -{ - write16(0x660F); - ModRM(3, to, from); -} - -//Basara:Added 10.01.2003 -void PSRLWItoR(int to,int from) -{ - write16(0x710f); - ModRM(2, 2 , to); - write8(from); -} -void PSRLDItoR(int to,int from) -{ - write16(0x720f); - ModRM(2, 2 , to); - write8(from); -} - -void PSLLWItoR(int to,int from) -{ - write16(0x710f); - ModRM(3, 6 , to); - write8(from); -} - -void PSLLDItoR(int to,int from) -{ - write16(0x720f); - ModRM(3, 6 , to); - write8(from); -} - -void PSRAWItoR(int to,int from) -{ - write16(0x710f); - ModRM(3, 4 , to); - write8(from); -} - -void PSRADItoR(int to,int from) -{ - write16(0x720f); - ModRM(3, 4 , to); - write8(from); -} - -/* por m64 to r64 */ -void PORMtoR(int to, u32 from) { - write16(0xEB0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* pxor m64 to r64 */ -void PXORMtoR(int to, u32 from) { - write16(0xEF0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* pand m64 to r64 */ -void PANDMtoR(int to, u32 from) { - write16(0xDB0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* pandn m64 to r64 */ -void PANDNMtoR(int to, u32 from) { - write16(0xDF0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* movd m32 to r64 */ -void MOVDMtoR(int to, u32 from) { - write16(0x6E0F); - ModRM(0, to, DISP32); - write32(from); -} - -/* movq r64 to m32 */ -void MOVDRtoM(u32 to, int from) { - write16(0x7E0F); - ModRM(0, from, DISP32); - write32(to); -} - -/* movd r32 to r64 */ -void MOVD32RtoR(int to, int from) { - write16(0x6E0F); - ModRM(3, to,from); -} - -/* movq r64 to r32 */ -void MOVD64RtoR(int to, int from) { - write16(0x7E0F); - ModRM(3, from,to); -} - -void MOVQRtoR(int to, int from) { - write16(0x6F0F); - ModRM(3, to,from); -} - -void PUNPCKHDQRtoR(int to, int from) { - write16(0x6A0F); - ModRM(3, to,from); -} - -void PUNPCKLDQRtoR(int to, int from) { - write16(0x620F); - ModRM(3, to,from); -} - -////////////////////////////////////////////////////////////////////////// -// SSE intructions -////////////////////////////////////////////////////////////////////////// - -void MOVAPSMtoR(int to, int from) { - write16(0x280f); - ModRM(0, to, DISP32); - write32(from); -} - -void MOVAPSRtoM(int to, int from) { - write16(0x2b0f); - ModRM(0, from, DISP32); - write32(to); -} - -void MOVAPSRtoR(int to, int from) { - write16(0x290f); - ModRM(3, to,from); -} - -void ORPSMtoR(int to, int from) { - write16(0x560f); - ModRM(0, to, DISP32); - write32(from); -} - -void ORPSRtoR(int to, int from) { - write16(0x560f); - ModRM(3, to,from); -} - -void XORPSMtoR(int to, int from) { - write16(0x570f); - ModRM(0, to, DISP32); - write32(from); -} - -void XORPSRtoR(int to, int from) { - write16(0x570f); - ModRM(3, to,from); -} - -void ANDPSMtoR(int to, int from) { - write16(0x540f); - ModRM(0, to, DISP32); - write32(from); -} - -void ANDPSRtoR(int to, int from) { - write16(0x540f); - ModRM(3, to,from); -} - -/* - 3DNOW intructions -*/ - -void PFCMPEQMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0xb0); -} - -void PFCMPGTMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0xa0); -} - -void PFCMPGEMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x90); -} - -void PFADDMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x9e); -} - -void PFADDRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to, from); - write8(0x9e); -} - -void PFSUBMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x9a); -} - -void PFSUBRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to, from); - write8(0x9a); -} - -void PFMULMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0xb4); -} - -void PFMULRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to,from); - write8(0xb4); -} - -void PFRCPMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x96); -} - -void PFRCPRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to,from); - write8(0x96); -} - -void PFRCPIT1RtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to,from); - write8(0xa6); -} - -void PFRCPIT2RtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to,from); - write8(0xb6); -} - -void PFRSQRTRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to,from); - write8(0x97); -} - -void PFRSQIT1RtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to,from); - write8(0xa7); -} - -void PF2IDMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x1d); -} - -void PF2IDRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to, from); - write8(0x1d); -} - -void PI2FDMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x0d); -} - -void PI2FDRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to, from); - write8(0x0d); -} - -/* - 3DNOW Extension intructions -*/ - -void PFMAXMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0xa4); -} - -void PFMAXRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to, from); - write8(0xa4); -} - -void PFMINMtoR(int to, int from) { - write16(0x0f0f); - ModRM(0, to, DISP32); - write32(from); - write8(0x94); -} - -void PFMINRtoR(int to, int from) { - write16(0x0f0f); - ModRM(3, to, from); - write8(0x94); -}