mupen64plus-oldsvn/r4300/x86_64/assemble.h

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