summaryrefslogtreecommitdiffhomepage
path: root/dev/CompilerKit/impl/X64.h
blob: 7dc44f2a61dcf7a3381009e514fb17c5d566d8dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* -------------------------------------------

  Copyright (C) 2024-2025 Amlal EL Mahrouss, Licensed under Apache 2.0

------------------------------------------- */

#pragma once

#include <CompilerKit/Defines.h>

// @brief AMD64 support.
// @file impl/X64.h

#define CK_ASM_OPCODE(__NAME, __OPCODE) {.fName = __NAME, .fOpcode = __OPCODE},

typedef char     i64_character_t;
typedef uint8_t  i64_byte_t;
typedef uint16_t i64_hword_t;
typedef uint32_t i64_word_t;

#define kAsmRegisterPrefix "r"

struct CpuOpcodeAMD64 {
  std::string fName;
  i64_byte_t  fPrefixBytes[4];
  i64_hword_t fOpcode;
  i64_hword_t fModReg;
  i64_word_t  fDisplacment;
  i64_word_t  fImmediate;
};

/// these two are edge cases
#define kAsmIntOpcode 0xCC
#define kasmIntOpcodeAlt 0xCD

#define kAsmJumpOpcode 0x0F80
#define kJumpLimit 30
#define kJumpLimitStandard 0xE3
#define kJumpLimitStandardLimit 0xEB

inline std::vector<CpuOpcodeAMD64> kOpcodesAMD64 = {
    CK_ASM_OPCODE("int", 0xCD) CK_ASM_OPCODE("into", 0xCE) CK_ASM_OPCODE("intd", 0xF1)
        CK_ASM_OPCODE("int3", 0xC3) CK_ASM_OPCODE("iret", 0xCF) CK_ASM_OPCODE("retf", 0xCB)
            CK_ASM_OPCODE("retn", 0xC3) CK_ASM_OPCODE("ret", 0xC3) CK_ASM_OPCODE("sti", 0xfb)
                CK_ASM_OPCODE("cli", 0xfa) CK_ASM_OPCODE("hlt", 0xf4) CK_ASM_OPCODE("nop", 0x90)
                    CK_ASM_OPCODE("mov", 0x48) CK_ASM_OPCODE("call", 0xFF)
                        CK_ASM_OPCODE("syscall", 0x0F) CK_ASM_OPCODE("xor", 0x48)};

#define kAsmRegisterLimit 16