mirror of
https://github.com/mupen64plus/mupen64plus-oldsvn.git
synced 2025-04-02 10:52:35 -04:00
312 lines
12 KiB
C
312 lines
12 KiB
C
/**
|
|
* Mupen64 - r4300/x86_64/assemble.h
|
|
* Copyright (C) 2007 Richard Goedeken, Hacktarux
|
|
* Based on code written by Hacktarux, Copyright (C) 2002
|
|
*
|
|
* Mupen64 homepage: http://mupen64.emulation64.com
|
|
* Forum homepage: http://www.emutalk.net/forumdisplay.php?f=50
|
|
*
|
|
* This program is free software; you can redistribute it and/
|
|
* or modify it under the terms of the GNU General Public Li-
|
|
* cence as published by the Free Software Foundation; either
|
|
* version 2 of the Licence, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be use-
|
|
* ful, but WITHOUT ANY WARRANTY; without even the implied war-
|
|
* ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public Licence for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public
|
|
* Licence along with this program; if not, write to the Free
|
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
|
|
* USA.
|
|
*
|
|
**/
|
|
|
|
|
|
#ifndef ASSEMBLE_H
|
|
#define ASSEMBLE_H
|
|
|
|
#define RAX 0
|
|
#define RCX 1
|
|
#define RDX 2
|
|
#define RBX 3
|
|
#define RSP 4
|
|
#define RBP 5
|
|
#define RSI 6
|
|
#define RDI 7
|
|
|
|
#define EAX 0
|
|
#define ECX 1
|
|
#define EDX 2
|
|
#define EBX 3
|
|
#define ESP 4
|
|
#define EBP 5
|
|
#define ESI 6
|
|
#define EDI 7
|
|
|
|
#define AX 0
|
|
#define CX 1
|
|
#define DX 2
|
|
#define BX 3
|
|
#define SP 4
|
|
#define BP 5
|
|
#define SI 6
|
|
#define DI 7
|
|
|
|
#define AL 0
|
|
#define CL 1
|
|
#define DL 2
|
|
#define BL 3
|
|
#define AH 4
|
|
#define CH 5
|
|
#define DH 6
|
|
#define BH 7
|
|
|
|
typedef struct _reg_cache_struct
|
|
{
|
|
int need_map;
|
|
void *needed_registers[8];
|
|
unsigned char jump_wrapper[84];
|
|
int need_cop1_check;
|
|
} reg_cache_struct;
|
|
|
|
extern int branch_taken;
|
|
|
|
void debug();
|
|
|
|
|
|
inline void put8(unsigned char octet);
|
|
inline void put16(unsigned short word);
|
|
inline void put32(unsigned int dword);
|
|
inline void put64(unsigned long long qword);
|
|
|
|
void jump_start_rel8();
|
|
void jump_end_rel8();
|
|
void jump_start_rel32();
|
|
void jump_end_rel32();
|
|
void code_align16(void);
|
|
|
|
void mov_eax_memoffs32(unsigned int *memoffs32);
|
|
void mov_memoffs32_eax(unsigned int *memoffs32);
|
|
void mov_reg32_reg32(unsigned int reg1, unsigned int reg2);
|
|
|
|
void mov_reg32_m32abs(unsigned int reg32, unsigned int *m32); /* these functions can only access memory in lower 2GB of address space */
|
|
void mov_m32abs_reg32(unsigned int *m32, unsigned int reg32);
|
|
void mov_reg64_m64abs(unsigned int reg64, unsigned long long* m64);
|
|
void mov_m64abs_reg64(unsigned long long *m64, unsigned int reg64);
|
|
|
|
void mov_rax_memoffs64(unsigned long long *memoffs64);
|
|
void mov_memoffs64_rax(unsigned long long *memoffs64);
|
|
void mov_reg64_reg64(unsigned int reg1, unsigned int reg2);
|
|
|
|
void sete_m8abs(unsigned char *m8);
|
|
void setne_m8abs(unsigned char *m8);
|
|
void setl_m8abs(unsigned char *m8);
|
|
void setle_m8abs(unsigned char *m8);
|
|
void setg_m8abs(unsigned char *m8);
|
|
void setge_m8abs(unsigned char *m8);
|
|
void setl_reg8(unsigned int reg8);
|
|
void setb_reg8(unsigned int reg8);
|
|
|
|
void int_imm8(unsigned char imm8);
|
|
void push_reg64(unsigned int reg64);
|
|
void pop_reg64(unsigned int reg64);
|
|
void cmp_reg32_m32abs(int reg32, unsigned int *m32);
|
|
void cmp_reg64_m64abs(int reg64, unsigned long long *m64);
|
|
void jne_rj(unsigned char saut);
|
|
void mov_reg32_imm32(int reg32, unsigned int imm32);
|
|
void mov_reg64_imm64(int reg64, unsigned long long imm64);
|
|
void jmp_imm(int saut);
|
|
void or_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void add_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void add_reg32_imm8(unsigned int reg32, unsigned char imm8);
|
|
void inc_m32abs(unsigned int *m32);
|
|
void cmp_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void mov_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void je_rj(unsigned char saut);
|
|
void jmp(unsigned int mi_addr);
|
|
void cdq();
|
|
void je_near(unsigned int mi_addr);
|
|
void jne_near(unsigned int mi_addr);
|
|
void jge_near(unsigned int mi_addr);
|
|
void jle_rj(unsigned char saut);
|
|
void jge_rj(unsigned char saut);
|
|
void ret();
|
|
void jle_near(unsigned int mi_addr);
|
|
void call_reg64(unsigned int reg64);
|
|
void jne_near_rj(unsigned int saut);
|
|
void jl_rj(unsigned char saut);
|
|
void sub_reg32_m32abs(int reg32, unsigned int *m32);
|
|
void mul_m32abs(unsigned int *m32);
|
|
void add_reg32_reg32(unsigned int reg1, unsigned int reg2);
|
|
void add_reg64_reg64(unsigned int reg1, unsigned int reg2);
|
|
void add_reg32_m32abs(unsigned int reg32, unsigned int *m32);
|
|
void add_reg64_m64abs(unsigned int reg64, unsigned long long *m64);
|
|
void add_reg32_imm32(unsigned int reg32, unsigned int imm32);
|
|
void add_reg64_imm32(unsigned int reg64, unsigned int imm32);
|
|
void jmp_reg64(unsigned int reg64);
|
|
void sub_reg32_imm32(int reg32, unsigned int imm32);
|
|
void sub_reg64_imm32(int reg64, unsigned int imm32);
|
|
void mov_reg32_preg64(unsigned int reg1, unsigned int reg2);
|
|
void sub_eax_imm32(unsigned int imm32);
|
|
void jl_near(unsigned int mi_addr);
|
|
void add_eax_imm32(unsigned int imm32);
|
|
void and_eax_imm32(unsigned int imm32);
|
|
void nop();
|
|
void cwde();
|
|
void jb_rj(unsigned char saut);
|
|
void ja_rj(unsigned char saut);
|
|
void jg_rj(unsigned char saut);
|
|
void and_ax_imm16(unsigned short imm16);
|
|
void or_ax_imm16(unsigned short imm16);
|
|
void xor_ax_imm16(unsigned short imm16);
|
|
void shrd_reg32_reg32_imm8(unsigned int reg1, unsigned int reg2, unsigned char imm8);
|
|
void or_eax_imm32(unsigned int imm32);
|
|
void or_m32abs_reg32(unsigned int *m32, unsigned int reg32);
|
|
void or_reg32_reg32(unsigned int reg1, unsigned int reg2);
|
|
void or_reg64_reg64(unsigned int reg1, unsigned int reg2);
|
|
void and_reg32_reg32(unsigned int reg1, unsigned int reg2);
|
|
void and_reg64_reg64(unsigned int reg1, unsigned int reg2);
|
|
void xor_reg32_reg32(unsigned int reg1, unsigned int reg2);
|
|
void xor_reg64_reg64(unsigned int reg1, unsigned int reg2);
|
|
void idiv_m32abs(unsigned int *m32);
|
|
void shl_reg32_imm8(unsigned int reg32, unsigned char imm8);
|
|
void shl_reg64_imm8(unsigned int reg64, unsigned char imm8);
|
|
void shl_reg32_cl(unsigned int reg32);
|
|
void shl_reg64_cl(unsigned int reg64);
|
|
void shr_reg32_imm8(unsigned int reg32, unsigned char imm8);
|
|
void shr_reg64_imm8(unsigned int reg64, unsigned char imm8);
|
|
void shr_reg32_cl(unsigned int reg32);
|
|
void shr_reg64_cl(unsigned int reg64);
|
|
void sar_reg32_imm8(unsigned int reg32, unsigned char imm8);
|
|
void sar_reg64_imm8(unsigned int reg64, unsigned char imm8);
|
|
void sar_reg32_cl(unsigned int reg32);
|
|
void sar_reg64_cl(unsigned int reg64);
|
|
void cmp_eax_imm32(unsigned int imm32);
|
|
void jg_near(unsigned int mi_addr);
|
|
void add_m32abs_reg32(unsigned int *m32, int reg32);
|
|
void je_near_rj(unsigned int saut);
|
|
void jge_near_rj(unsigned int saut);
|
|
void jl_near_rj(unsigned int saut);
|
|
void jle_near_rj(unsigned int saut);
|
|
void call_m64abs(unsigned long long *m64);
|
|
void and_reg32_m32abs(unsigned int reg32, unsigned int *m32);
|
|
void or_reg32_m32abs(unsigned int reg32, unsigned int *m32);
|
|
void not_reg32(unsigned int reg32);
|
|
void not_reg64(unsigned int reg64);
|
|
void neg_reg32(unsigned int reg32);
|
|
void neg_reg64(unsigned int reg64);
|
|
void xor_reg32_m32abs(unsigned int reg32, unsigned int *m32);
|
|
void sar_reg32_cl(unsigned int reg32);
|
|
void jmp_imm_short(char saut);
|
|
void jmp_m64abs(unsigned long long *m64);
|
|
void mov_reg32_preg64preg64pimm32(int reg1, int reg2, int reg3, unsigned int imm32);
|
|
void mov_preg64preg64pimm32_reg32(int reg1, int reg2, unsigned int imm32, int reg3);
|
|
void mov_reg64_preg64preg64pimm32(int reg1, int reg2, int reg3, unsigned int imm32);
|
|
void mov_reg32_preg64preg64(int reg1, int reg2, int reg3);
|
|
void mov_reg64_preg64preg64(int reg1, int reg2, int reg3);
|
|
void mov_reg32_preg64pimm32(int reg1, int reg2, unsigned int imm32);
|
|
void mov_reg64_preg64pimm32(int reg1, int reg2, unsigned int imm32);
|
|
void mov_reg64_preg64pimm8(int reg1, int reg2, unsigned int imm8);
|
|
void cmp_m32abs_imm8(unsigned int *m32, unsigned char imm8);
|
|
void mov_reg32_preg64x4pimm32(int reg1, int reg2, unsigned int imm32);
|
|
void mov_reg64_preg64x8preg64(int reg1, int reg2, int reg3);
|
|
void movsx_reg32_m8abs(int reg32, unsigned char *m8);
|
|
void sub_reg32_reg32(int reg1, int reg2);
|
|
void sub_reg64_reg64(int reg1, int reg2);
|
|
void cbw();
|
|
void or_reg32_imm32(int reg32, unsigned int imm32);
|
|
void or_reg64_imm32(int reg64, unsigned int imm32);
|
|
void and_reg32_imm32(int reg32, unsigned int imm32);
|
|
void and_reg64_imm32(int reg64, unsigned int imm32);
|
|
void and_reg32_imm8(int reg32, unsigned char imm8);
|
|
void and_reg64_imm8(int reg64, unsigned char imm8);
|
|
void movsx_reg32_reg16(int reg32, int reg16);
|
|
void movsx_reg32_m16abs(int reg32, unsigned short *m16);
|
|
void movsxd_reg64_reg32(int reg64, int reg32);
|
|
void movsxd_reg64_m32abs(int reg64, unsigned int *m32);
|
|
void cmp_reg32_imm8(int reg32, unsigned char imm8);
|
|
void cmp_reg64_imm8(int reg64, unsigned char imm8);
|
|
void cmp_reg32_imm32(int reg32, unsigned int imm32);
|
|
void cmp_reg64_imm32(int reg64, unsigned int imm32);
|
|
void add_m32abs_imm8(unsigned int *m32, unsigned char imm8);
|
|
void mov_reg8_m8abs(int reg8, unsigned char *m8);
|
|
void mov_preg64pimm32_reg16(int reg64, unsigned int imm32, int reg16);
|
|
void mov_preg64preg64_reg16(int reg1, int reg2, int reg16);
|
|
void mov_preg64preg64_reg32(int reg1, int reg2, int reg32);
|
|
void mov_preg64pimm32_reg32(int reg1, unsigned int imm32, int reg2);
|
|
void mov_preg64pimm8_reg64(int reg1, unsigned int imm8, int reg2);
|
|
void fld_preg64_dword(int reg64);
|
|
void fdiv_preg64_dword(int reg64);
|
|
void fstp_preg64_dword(int reg64);
|
|
void mov_preg64_reg32(int reg1, int reg2);
|
|
void mov_preg64_reg64(int reg1, int reg2);
|
|
void mov_reg64_preg64(int reg1, int reg2);
|
|
void fchs();
|
|
void fstp_preg64_qword(int reg64);
|
|
void fadd_preg64_dword(int reg64);
|
|
void fmul_preg64_dword(int reg64);
|
|
void fcomp_preg64_dword(int reg64);
|
|
void and_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void fistp_m32abs(unsigned int *m32);
|
|
void fistp_m64abs(unsigned long long *m64);
|
|
void div_m32abs(unsigned int *m32);
|
|
void mov_reg16_m16abs(int reg16, unsigned short *m16);
|
|
void mov_m16abs_reg16(unsigned short *m16, int reg16);
|
|
void fld_preg64_qword(int reg64);
|
|
void fadd_preg64_qword(int reg64);
|
|
void fdiv_preg64_qword(int reg64);
|
|
void fsub_preg64_dword(int reg64);
|
|
void xor_reg32_imm32(int reg32, unsigned int imm32);
|
|
void xor_reg64_imm32(int reg64, unsigned int imm32);
|
|
void xor_al_imm8(unsigned char imm8);
|
|
void mov_preg64preg64_reg8(int reg1, int reg2, int reg8);
|
|
void mov_preg64preg64_imm8(int reg1, int reg2, unsigned char imm8);
|
|
void xor_reg8_imm8(int reg8, unsigned char imm8);
|
|
void cmp_m8abs_imm8(unsigned char *m8, unsigned char imm8);
|
|
void fsub_preg64_qword(int reg64);
|
|
void fmul_preg64_qword(int reg64);
|
|
void adc_reg32_m32abs(unsigned int reg32, unsigned int *m32);
|
|
void sub_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void sub_m64abs_imm32(unsigned long long *m64, unsigned int imm32);
|
|
void jbe_rj(unsigned char saut);
|
|
void cmp_reg32_reg32(int reg1, int reg2);
|
|
void cmp_reg64_reg64(int reg1, int reg2);
|
|
void adc_reg32_imm32(unsigned int reg32, unsigned int imm32);
|
|
void and_al_imm8(unsigned char imm8);
|
|
void cmp_al_imm8(unsigned char imm8);
|
|
void movsx_reg32_8preg64pimm32(int reg1, int reg2, unsigned int imm32);
|
|
void movsx_reg32_8preg64preg64(int reg1, int reg2, int reg3);
|
|
void movsx_reg32_16preg64pimm32(int reg1, int reg2, unsigned int imm32);
|
|
void movsx_reg32_16preg64preg64(int reg1, int reg2, int reg3);
|
|
void mov_preg64pimm32_imm8(int reg64, unsigned int imm32, unsigned char imm8);
|
|
void mov_m8abs_reg8(unsigned char *m8, int reg8);
|
|
void shld_reg32_reg32_cl(unsigned int reg1, unsigned int reg2);
|
|
void test_reg32_imm32(int reg32, unsigned int imm32);
|
|
void shrd_reg32_reg32_cl(unsigned int reg1, unsigned int reg2);
|
|
void imul_reg32(unsigned int reg32);
|
|
void mul_reg32(unsigned int reg32);
|
|
void mul_reg64(unsigned int reg64);
|
|
void idiv_reg32(unsigned int reg32);
|
|
void div_reg32(unsigned int reg32);
|
|
void adc_reg32_reg32(unsigned int reg1, unsigned int reg2);
|
|
void sbb_reg32_reg32(int reg1, int reg2);
|
|
void shld_reg32_reg32_imm8(unsigned int reg1, unsigned int reg2, unsigned char imm8);
|
|
void cmp_preg64pimm32_imm8(int reg64, unsigned int imm32, unsigned char imm8);
|
|
void cmp_preg64preg64_imm8(int reg1, int reg2, unsigned char imm8);
|
|
void test_m32abs_imm32(unsigned int *m32, unsigned int imm32);
|
|
void fldcw_m16abs(unsigned short* m16);
|
|
void fsqrt();
|
|
void fabs_();
|
|
void fistp_preg64_qword(int reg64);
|
|
void fistp_preg64_dword(int reg64);
|
|
void fcomip_fpreg(int fpreg);
|
|
void fucomip_fpreg(int fpreg);
|
|
void ffree_fpreg(int fpreg);
|
|
void jp_rj(unsigned char saut);
|
|
void jae_rj(unsigned char saut);
|
|
void fild_preg64_qword(int reg64);
|
|
void fild_preg64_dword(int reg64);
|
|
|
|
#endif // ASSEMBLE_H
|