pass-lang/src/x86encode.h

79 lines
2.6 KiB
C

#ifndef _X86ENCODE_H
#define _X86ENCODE_H
#include <stdint.h>
// A general-purpose x86 register.
// The specific register size (e.g. al/ax/eax/rax) depends on the instruction.
// All registers are valid for all instructions; we will perform exchanges if necessary.
typedef enum reg {
AX = 0, // rax, eax, ax, al
CX = 1, // rcx, ecx, cx, cl
DX = 2, // rdx, edx, dx, dl
BX = 3, // rbx, ebx, bx, bl
SP = 4, // rsp, esp, sp, spl (we do not use ah)
BP = 5, // rbp, ebp, bp, bpl (we do not use ch)
SI = 6, // rsi, esi, si, sil (we do not use dh)
DI = 7, // rdi, edi, di, dil (we do not use bh)
R8 = 8, // r8, r8d, r8w, r8l
R9 = 9, // r9, r9d, r9w, r9l
R10 = 10, // r10, r10d, r10w, r10l
R11 = 11, // r11, r11d, r11w, r11l
R12 = 12, // r12, r12d, r12w, r12l
R13 = 13, // r13, r13d, r13w, r13l
R14 = 14, // r14, r14d, r14w, r14l
R15 = 15, // r15, r15d, r15w, r15l
} reg;
void x86_inst_mov_r64_imm64(reg dest, uint64_t imm);
void x86_inst_mov_r64_imm32(reg dest, uint32_t imm);
void x86_inst_mov_r64_imm(reg dest, uint64_t imm);
void x86_inst_mov_r64_r64(reg dest, reg src);
void x86_inst_mov_r64_m64(reg dest, reg src);
void x86_inst_mov_r64_m64_disp8(reg dest, reg src, int8_t disp);
void x86_inst_mov_r64_m64_disp32(reg dest, reg src, int32_t disp);
void x86_inst_mov_r64_m64_disp(reg dest, reg src, int32_t disp);
void x86_inst_mov_m64_r64(reg dest, reg src);
void x86_inst_mov_m64_r64_disp8(reg dest, reg src, int8_t disp);
void x86_inst_mov_m64_r64_disp32(reg dest, reg src, int32_t disp);
void x86_inst_mov_m64_r64_disp(reg dest, reg src, int32_t disp);
void x86_inst_push_r64(reg reg);
void x86_inst_pop_r64(reg reg);
void x86_inst_test_r64_r64(reg r1, reg r2);
#define X86_JMP_DISP8_SIZE 2
void x86_inst_jmp_disp8(int8_t disp);
#define X86_JMP_DISP32_SIZE 5
void x86_inst_jmp_disp32(int32_t disp);
void x86_inst_jmp_disp(int32_t disp);
void x86_inst_jmp_disp32_op(void);
#define X86_JNZ_DISP8_SIZE 2
void x86_inst_jnz_disp8(int8_t disp);
#define X86_JNZ_DISP32_SIZE 6
void x86_inst_jnz_disp32(int32_t disp);
void x86_inst_jnz_disp(int32_t disp);
void x86_inst_jnz_disp32_op(void);
#define X86_JZ_DISP8_SIZE 2
void x86_inst_jz_disp8(int8_t disp);
#define X86_JZ_DISP32_SIZE 6
void x86_inst_jz_disp32(int32_t disp);
void x86_inst_jz_disp(int32_t disp);
void x86_inst_jz_disp32_op(void);
void x86_inst_sub_r64_imm8(reg dest, int8_t imm);
void x86_inst_sub_r64_imm32(reg dest, int32_t imm);
void x86_inst_sub_r64_imm(reg dest, int32_t imm);
void x86_inst_sub_r64_r64(reg dest, reg src);
void x86_inst_add_r64_imm8(reg dest, int8_t imm);
void x86_inst_add_r64_r64(reg dest, reg src);
void x86_inst_syscall(void);
#endif