summaryrefslogtreecommitdiffhomepage
path: root/dev/LibCompiler/Backend/Amd64.h
blob: a3fb8a2aceb3c79bfb05056f362854ae1c26cbce (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
/* -------------------------------------------

  Copyright (C) 2024-2025 Amlal EL Mahrous, all rights reserved

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

#pragma once

#include <LibCompiler/Defines.h>

// @brief AMD64 support.
// @file Backend/Amd64.h

#define kAsmOpcodeDecl(__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 = {
    kAsmOpcodeDecl("int", 0xCD) kAsmOpcodeDecl("into", 0xCE) kAsmOpcodeDecl("intd", 0xF1)
        kAsmOpcodeDecl("int3", 0xC3) kAsmOpcodeDecl("iret", 0xCF) kAsmOpcodeDecl("retf", 0xCB)
            kAsmOpcodeDecl("retn", 0xC3) kAsmOpcodeDecl("ret", 0xC3) kAsmOpcodeDecl("sti", 0xfb)
                kAsmOpcodeDecl("cli", 0xfa) kAsmOpcodeDecl("hlt", 0xf4) kAsmOpcodeDecl("nop", 0x90)
                    kAsmOpcodeDecl("mov", 0x48) kAsmOpcodeDecl("call", 0xFF)};

#define kAsmRegisterLimit 16