Path: blob/master/libmupen64plus/mupen64plus-core/src/r4300/x86/assemble.h
2 views
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1* Mupen64plus - assemble.h *2* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *3* Copyright (C) 2002 Hacktarux *4* *5* This program is free software; you can redistribute it and/or modify *6* it under the terms of the GNU General Public License as published by *7* the Free Software Foundation; either version 2 of the License, or *8* (at your option) any later version. *9* *10* This program is distributed in the hope that it will be useful, *11* but WITHOUT ANY WARRANTY; without even the implied warranty of *12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *13* GNU General Public License for more details. *14* *15* You should have received a copy of the GNU General Public License *16* along with this program; if not, write to the *17* Free Software Foundation, Inc., *18* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *19* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */2021#ifndef ASSEMBLE_H22#define ASSEMBLE_H2324#include "r4300/recomph.h"25#include "api/callbacks.h"26#include "osal/preproc.h"2728#include <stdlib.h>2930extern long long int reg[32];3132#define EAX 033#define ECX 134#define EDX 235#define EBX 336#define ESP 437#define EBP 538#define ESI 639#define EDI 74041#define AX 042#define CX 143#define DX 244#define BX 345#define SP 446#define BP 547#define SI 648#define DI 74950#define AL 051#define CL 152#define DL 253#define BL 354#define AH 455#define CH 556#define DH 657#define BH 75859extern int branch_taken;6061void jump_start_rel8(void);62void jump_end_rel8(void);63void jump_start_rel32(void);64void jump_end_rel32(void);65void add_jump(unsigned int pc_addr, unsigned int mi_addr);6667static osal_inline void put8(unsigned char octet)68{69(*inst_pointer)[code_length] = octet;70code_length++;71if (code_length == max_code_length)72{73*inst_pointer = (unsigned char *) realloc_exec(*inst_pointer, max_code_length, max_code_length+8192);74max_code_length += 8192;75}76}7778static osal_inline void put32(unsigned int dword)79{80if ((code_length+4) >= max_code_length)81{82*inst_pointer = (unsigned char *) realloc_exec(*inst_pointer, max_code_length, max_code_length+8192);83max_code_length += 8192;84}85*((unsigned int *)(&(*inst_pointer)[code_length])) = dword;86code_length+=4;87}8889static osal_inline void mov_eax_memoffs32(unsigned int *memoffs32)90{91put8(0xA1);92put32((unsigned int)(memoffs32));93}9495static osal_inline void mov_memoffs32_eax(unsigned int *memoffs32)96{97put8(0xA3);98put32((unsigned int)(memoffs32));99}100101static osal_inline void mov_m8_reg8(unsigned char *m8, int reg8)102{103put8(0x88);104put8((reg8 << 3) | 5);105put32((unsigned int)(m8));106}107108static osal_inline void mov_reg16_m16(int reg16, unsigned short *m16)109{110put8(0x66);111put8(0x8B);112put8((reg16 << 3) | 5);113put32((unsigned int)(m16));114}115116static osal_inline void mov_m16_reg16(unsigned short *m16, int reg16)117{118put8(0x66);119put8(0x89);120put8((reg16 << 3) | 5);121put32((unsigned int)(m16));122}123124static osal_inline void cmp_reg32_m32(int reg32, unsigned int *m32)125{126put8(0x3B);127put8((reg32 << 3) | 5);128put32((unsigned int)(m32));129}130131static osal_inline void cmp_reg32_reg32(int reg1, int reg2)132{133put8(0x39);134put8((reg2 << 3) | reg1 | 0xC0);135}136137static osal_inline void cmp_reg32_imm8(int reg32, unsigned char imm8)138{139put8(0x83);140put8(0xF8 + reg32);141put8(imm8);142}143144static osal_inline void cmp_preg32pimm32_imm8(int reg32, unsigned int imm32, unsigned char imm8)145{146put8(0x80);147put8(0xB8 + reg32);148put32(imm32);149put8(imm8);150}151152static osal_inline void cmp_reg32_imm32(int reg32, unsigned int imm32)153{154put8(0x81);155put8(0xF8 + reg32);156put32(imm32);157}158159static osal_inline void test_reg32_imm32(int reg32, unsigned int imm32)160{161put8(0xF7);162put8(0xC0 + reg32);163put32(imm32);164}165166static osal_inline void test_m32_imm32(unsigned int *m32, unsigned int imm32)167{168put8(0xF7);169put8(0x05);170put32((unsigned int)m32);171put32(imm32);172}173174static osal_inline void add_m32_reg32(unsigned int *m32, int reg32)175{176put8(0x01);177put8((reg32 << 3) | 5);178put32((unsigned int)(m32));179}180181static osal_inline void sub_reg32_m32(int reg32, unsigned int *m32)182{183put8(0x2B);184put8((reg32 << 3) | 5);185put32((unsigned int)(m32));186}187188static osal_inline void sub_reg32_reg32(int reg1, int reg2)189{190put8(0x29);191put8((reg2 << 3) | reg1 | 0xC0);192}193194static osal_inline void sbb_reg32_reg32(int reg1, int reg2)195{196put8(0x19);197put8((reg2 << 3) | reg1 | 0xC0);198}199200static osal_inline void sub_reg32_imm32(int reg32, unsigned int imm32)201{202put8(0x81);203put8(0xE8 + reg32);204put32(imm32);205}206207static osal_inline void sub_eax_imm32(unsigned int imm32)208{209put8(0x2D);210put32(imm32);211}212213static osal_inline void jne_rj(unsigned char saut)214{215put8(0x75);216put8(saut);217}218219static osal_inline void je_rj(unsigned char saut)220{221put8(0x74);222put8(saut);223}224225static osal_inline void jb_rj(unsigned char saut)226{227put8(0x72);228put8(saut);229}230231static osal_inline void jbe_rj(unsigned char saut)232{233put8(0x76);234put8(saut);235}236237static osal_inline void ja_rj(unsigned char saut)238{239put8(0x77);240put8(saut);241}242243static osal_inline void jae_rj(unsigned char saut)244{245put8(0x73);246put8(saut);247}248249static osal_inline void jle_rj(unsigned char saut)250{251put8(0x7E);252put8(saut);253}254255static osal_inline void jge_rj(unsigned char saut)256{257put8(0x7D);258put8(saut);259}260261static osal_inline void jg_rj(unsigned char saut)262{263put8(0x7F);264put8(saut);265}266267static osal_inline void jl_rj(unsigned char saut)268{269put8(0x7C);270put8(saut);271}272273static osal_inline void jp_rj(unsigned char saut)274{275put8(0x7A);276put8(saut);277}278279static osal_inline void je_near_rj(unsigned int saut)280{281put8(0x0F);282put8(0x84);283put32(saut);284}285286static osal_inline void mov_reg32_imm32(int reg32, unsigned int imm32)287{288put8(0xB8+reg32);289put32(imm32);290}291292static osal_inline void jmp_imm_short(char saut)293{294put8(0xEB);295put8(saut);296}297298static osal_inline void or_m32_imm32(unsigned int *m32, unsigned int imm32)299{300put8(0x81);301put8(0x0D);302put32((unsigned int)(m32));303put32(imm32);304}305306static osal_inline void or_reg32_reg32(unsigned int reg1, unsigned int reg2)307{308put8(0x09);309put8(0xC0 | (reg2 << 3) | reg1);310}311312static osal_inline void and_reg32_reg32(unsigned int reg1, unsigned int reg2)313{314put8(0x21);315put8(0xC0 | (reg2 << 3) | reg1);316}317318static osal_inline void and_m32_imm32(unsigned int *m32, unsigned int imm32)319{320put8(0x81);321put8(0x25);322put32((unsigned int)(m32));323put32(imm32);324}325326static osal_inline void xor_reg32_reg32(unsigned int reg1, unsigned int reg2)327{328put8(0x31);329put8(0xC0 | (reg2 << 3) | reg1);330}331332static osal_inline void sub_m32_imm32(unsigned int *m32, unsigned int imm32)333{334put8(0x81);335put8(0x2D);336put32((unsigned int)(m32));337put32(imm32);338}339340static osal_inline void add_reg32_imm32(unsigned int reg32, unsigned int imm32)341{342put8(0x81);343put8(0xC0+reg32);344put32(imm32);345}346347static osal_inline void inc_m32(unsigned int *m32)348{349put8(0xFF);350put8(0x05);351put32((unsigned int)(m32));352}353354static osal_inline void cmp_m32_imm32(unsigned int *m32, unsigned int imm32)355{356put8(0x81);357put8(0x3D);358put32((unsigned int)(m32));359put32(imm32);360}361362static osal_inline void cmp_eax_imm32(unsigned int imm32)363{364put8(0x3D);365put32(imm32);366}367368static osal_inline void mov_m32_imm32(unsigned int *m32, unsigned int imm32)369{370put8(0xC7);371put8(0x05);372put32((unsigned int)(m32));373put32(imm32);374}375376static osal_inline void jmp(unsigned int mi_addr)377{378put8(0xE9);379put32(0);380add_jump(code_length-4, mi_addr);381}382383static osal_inline void cdq(void)384{385put8(0x99);386}387388static osal_inline void mov_m32_reg32(unsigned int *m32, unsigned int reg32)389{390put8(0x89);391put8((reg32 << 3) | 5);392put32((unsigned int)(m32));393}394395static osal_inline void call_reg32(unsigned int reg32)396{397put8(0xFF);398put8(0xD0+reg32);399}400401static osal_inline void shr_reg32_imm8(unsigned int reg32, unsigned char imm8)402{403put8(0xC1);404put8(0xE8+reg32);405put8(imm8);406}407408static osal_inline void shr_reg32_cl(unsigned int reg32)409{410put8(0xD3);411put8(0xE8+reg32);412}413414static osal_inline void sar_reg32_cl(unsigned int reg32)415{416put8(0xD3);417put8(0xF8+reg32);418}419420static osal_inline void shl_reg32_cl(unsigned int reg32)421{422put8(0xD3);423put8(0xE0+reg32);424}425426static osal_inline void shld_reg32_reg32_cl(unsigned int reg1, unsigned int reg2)427{428put8(0x0F);429put8(0xA5);430put8(0xC0 | (reg2 << 3) | reg1);431}432433static osal_inline void shld_reg32_reg32_imm8(unsigned int reg1, unsigned int reg2, unsigned char imm8)434{435put8(0x0F);436put8(0xA4);437put8(0xC0 | (reg2 << 3) | reg1);438put8(imm8);439}440441static osal_inline void shrd_reg32_reg32_cl(unsigned int reg1, unsigned int reg2)442{443put8(0x0F);444put8(0xAD);445put8(0xC0 | (reg2 << 3) | reg1);446}447448static osal_inline void sar_reg32_imm8(unsigned int reg32, unsigned char imm8)449{450put8(0xC1);451put8(0xF8+reg32);452put8(imm8);453}454455static osal_inline void shrd_reg32_reg32_imm8(unsigned int reg1, unsigned int reg2, unsigned char imm8)456{457put8(0x0F);458put8(0xAC);459put8(0xC0 | (reg2 << 3) | reg1);460put8(imm8);461}462463static osal_inline void mul_m32(unsigned int *m32)464{465put8(0xF7);466put8(0x25);467put32((unsigned int)(m32));468}469470static osal_inline void imul_reg32(unsigned int reg32)471{472put8(0xF7);473put8(0xE8+reg32);474}475476static osal_inline void mul_reg32(unsigned int reg32)477{478put8(0xF7);479put8(0xE0+reg32);480}481482static osal_inline void idiv_reg32(unsigned int reg32)483{484put8(0xF7);485put8(0xF8+reg32);486}487488static osal_inline void div_reg32(unsigned int reg32)489{490put8(0xF7);491put8(0xF0+reg32);492}493494static osal_inline void add_reg32_reg32(unsigned int reg1, unsigned int reg2)495{496put8(0x01);497put8(0xC0 | (reg2 << 3) | reg1);498}499500static osal_inline void adc_reg32_reg32(unsigned int reg1, unsigned int reg2)501{502put8(0x11);503put8(0xC0 | (reg2 << 3) | reg1);504}505506static osal_inline void add_reg32_m32(unsigned int reg32, unsigned int *m32)507{508put8(0x03);509put8((reg32 << 3) | 5);510put32((unsigned int)(m32));511}512513static osal_inline void adc_reg32_imm32(unsigned int reg32, unsigned int imm32)514{515put8(0x81);516put8(0xD0 + reg32);517put32(imm32);518}519520static osal_inline void jmp_reg32(unsigned int reg32)521{522put8(0xFF);523put8(0xE0 + reg32);524}525526static osal_inline void mov_reg32_preg32(unsigned int reg1, unsigned int reg2)527{528put8(0x8B);529put8((reg1 << 3) | reg2);530}531532static osal_inline void mov_preg32_reg32(int reg1, int reg2)533{534put8(0x89);535put8((reg2 << 3) | reg1);536}537538static osal_inline void mov_reg32_preg32preg32pimm32(int reg1, int reg2, int reg3, unsigned int imm32)539{540put8(0x8B);541put8((reg1 << 3) | 0x84);542put8(reg2 | (reg3 << 3));543put32(imm32);544}545546static osal_inline void mov_reg32_preg32pimm32(int reg1, int reg2, unsigned int imm32)547{548put8(0x8B);549put8(0x80 | (reg1 << 3) | reg2);550put32(imm32);551}552553static osal_inline void mov_reg32_preg32x4pimm32(int reg1, int reg2, unsigned int imm32)554{555put8(0x8B);556put8((reg1 << 3) | 4);557put8(0x80 | (reg2 << 3) | 5);558put32(imm32);559}560561static osal_inline void mov_preg32pimm32_reg8(int reg32, unsigned int imm32, int reg8)562{563put8(0x88);564put8(0x80 | reg32 | (reg8 << 3));565put32(imm32);566}567568static osal_inline void mov_preg32pimm32_imm8(int reg32, unsigned int imm32, unsigned char imm8)569{570put8(0xC6);571put8(0x80 + reg32);572put32(imm32);573put8(imm8);574}575576static osal_inline void mov_preg32pimm32_reg16(int reg32, unsigned int imm32, int reg16)577{578put8(0x66);579put8(0x89);580put8(0x80 | reg32 | (reg16 << 3));581put32(imm32);582}583584static osal_inline void mov_preg32pimm32_reg32(int reg1, unsigned int imm32, int reg2)585{586put8(0x89);587put8(0x80 | reg1 | (reg2 << 3));588put32(imm32);589}590591static osal_inline void add_eax_imm32(unsigned int imm32)592{593put8(0x05);594put32(imm32);595}596597static osal_inline void shl_reg32_imm8(unsigned int reg32, unsigned char imm8)598{599put8(0xC1);600put8(0xE0 + reg32);601put8(imm8);602}603604static osal_inline void mov_reg32_m32(unsigned int reg32, unsigned int* m32)605{606put8(0x8B);607put8((reg32 << 3) | 5);608put32((unsigned int)(m32));609}610611static osal_inline void mov_reg8_m8(int reg8, unsigned char *m8)612{613put8(0x8A);614put8((reg8 << 3) | 5);615put32((unsigned int)(m8));616}617618static osal_inline void and_eax_imm32(unsigned int imm32)619{620put8(0x25);621put32(imm32);622}623624static osal_inline void and_reg32_imm32(int reg32, unsigned int imm32)625{626put8(0x81);627put8(0xE0 + reg32);628put32(imm32);629}630631static osal_inline void or_reg32_imm32(int reg32, unsigned int imm32)632{633put8(0x81);634put8(0xC8 + reg32);635put32(imm32);636}637638static osal_inline void xor_reg32_imm32(int reg32, unsigned int imm32)639{640put8(0x81);641put8(0xF0 + reg32);642put32(imm32);643}644645static osal_inline void xor_reg8_imm8(int reg8, unsigned char imm8)646{647put8(0x80);648put8(0xF0 + reg8);649put8(imm8);650}651652static osal_inline void mov_reg32_reg32(unsigned int reg1, unsigned int reg2)653{654if (reg1 == reg2) return;655put8(0x89);656put8(0xC0 | (reg2 << 3) | reg1);657}658659static osal_inline void not_reg32(unsigned int reg32)660{661put8(0xF7);662put8(0xD0 + reg32);663}664665static osal_inline void movsx_reg32_m8(int reg32, unsigned char *m8)666{667put8(0x0F);668put8(0xBE);669put8((reg32 << 3) | 5);670put32((unsigned int)(m8));671}672673static osal_inline void movsx_reg32_8preg32pimm32(int reg1, int reg2, unsigned int imm32)674{675put8(0x0F);676put8(0xBE);677put8((reg1 << 3) | reg2 | 0x80);678put32(imm32);679}680681static osal_inline void movsx_reg32_16preg32pimm32(int reg1, int reg2, unsigned int imm32)682{683put8(0x0F);684put8(0xBF);685put8((reg1 << 3) | reg2 | 0x80);686put32(imm32);687}688689static osal_inline void movsx_reg32_m16(int reg32, unsigned short *m16)690{691put8(0x0F);692put8(0xBF);693put8((reg32 << 3) | 5);694put32((unsigned int)(m16));695}696697static osal_inline void fldcw_m16(unsigned short *m16)698{699put8(0xD9);700put8(0x2D);701put32((unsigned int)(m16));702}703704static osal_inline void fld_preg32_dword(int reg32)705{706put8(0xD9);707put8(reg32);708}709710static osal_inline void fdiv_preg32_dword(int reg32)711{712put8(0xD8);713put8(0x30 + reg32);714}715716static osal_inline void fstp_preg32_dword(int reg32)717{718put8(0xD9);719put8(0x18 + reg32);720}721722static osal_inline void fchs(void)723{724put8(0xD9);725put8(0xE0);726}727728static osal_inline void fstp_preg32_qword(int reg32)729{730put8(0xDD);731put8(0x18 + reg32);732}733734static osal_inline void fadd_preg32_dword(int reg32)735{736put8(0xD8);737put8(reg32);738}739740static osal_inline void fsub_preg32_dword(int reg32)741{742put8(0xD8);743put8(0x20 + reg32);744}745746static osal_inline void fmul_preg32_dword(int reg32)747{748put8(0xD8);749put8(0x08 + reg32);750}751752static osal_inline void fistp_preg32_dword(int reg32)753{754put8(0xDB);755put8(0x18 + reg32);756}757758static osal_inline void fistp_preg32_qword(int reg32)759{760put8(0xDF);761put8(0x38 + reg32);762}763764static osal_inline void fld_preg32_qword(int reg32)765{766put8(0xDD);767put8(reg32);768}769770static osal_inline void fild_preg32_qword(int reg32)771{772put8(0xDF);773put8(0x28+reg32);774}775776static osal_inline void fild_preg32_dword(int reg32)777{778put8(0xDB);779put8(reg32);780}781782static osal_inline void fadd_preg32_qword(int reg32)783{784put8(0xDC);785put8(reg32);786}787788static osal_inline void fdiv_preg32_qword(int reg32)789{790put8(0xDC);791put8(0x30 + reg32);792}793794static osal_inline void fsub_preg32_qword(int reg32)795{796put8(0xDC);797put8(0x20 + reg32);798}799800static osal_inline void fmul_preg32_qword(int reg32)801{802put8(0xDC);803put8(0x08 + reg32);804}805806static osal_inline void fsqrt(void)807{808put8(0xD9);809put8(0xFA);810}811812static osal_inline void fabs_(void)813{814put8(0xD9);815put8(0xE1);816}817818static osal_inline void fcomip_fpreg(int fpreg)819{820put8(0xDF);821put8(0xF0 + fpreg);822}823824static osal_inline void fucomip_fpreg(int fpreg)825{826put8(0xDF);827put8(0xE8 + fpreg);828}829830static osal_inline void ffree_fpreg(int fpreg)831{832put8(0xDD);833put8(0xC0 + fpreg);834}835836#endif // ASSEMBLE_H837838839840