Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/include/Luau/RegisterX64.h
2727 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#pragma once
3
4
#include "Luau/CodeGenCommon.h"
5
6
#include <stdint.h>
7
8
namespace Luau
9
{
10
namespace CodeGen
11
{
12
namespace X64
13
{
14
15
enum class SizeX64 : uint8_t
16
{
17
none,
18
byte,
19
word,
20
dword,
21
qword,
22
xmmword,
23
ymmword,
24
};
25
26
struct RegisterX64
27
{
28
SizeX64 size : 3;
29
uint8_t index : 5;
30
31
constexpr bool operator==(RegisterX64 rhs) const
32
{
33
return size == rhs.size && index == rhs.index;
34
}
35
36
constexpr bool operator!=(RegisterX64 rhs) const
37
{
38
return !(*this == rhs);
39
}
40
};
41
42
inline constexpr RegisterX64 noreg{SizeX64::none, 16};
43
inline constexpr RegisterX64 rip{SizeX64::none, 0};
44
45
inline constexpr RegisterX64 al{SizeX64::byte, 0};
46
inline constexpr RegisterX64 cl{SizeX64::byte, 1};
47
inline constexpr RegisterX64 dl{SizeX64::byte, 2};
48
inline constexpr RegisterX64 bl{SizeX64::byte, 3};
49
inline constexpr RegisterX64 spl{SizeX64::byte, 4};
50
inline constexpr RegisterX64 bpl{SizeX64::byte, 5};
51
inline constexpr RegisterX64 sil{SizeX64::byte, 6};
52
inline constexpr RegisterX64 dil{SizeX64::byte, 7};
53
inline constexpr RegisterX64 r8b{SizeX64::byte, 8};
54
inline constexpr RegisterX64 r9b{SizeX64::byte, 9};
55
inline constexpr RegisterX64 r10b{SizeX64::byte, 10};
56
inline constexpr RegisterX64 r11b{SizeX64::byte, 11};
57
inline constexpr RegisterX64 r12b{SizeX64::byte, 12};
58
inline constexpr RegisterX64 r13b{SizeX64::byte, 13};
59
inline constexpr RegisterX64 r14b{SizeX64::byte, 14};
60
inline constexpr RegisterX64 r15b{SizeX64::byte, 15};
61
62
inline constexpr RegisterX64 eax{SizeX64::dword, 0};
63
inline constexpr RegisterX64 ecx{SizeX64::dword, 1};
64
inline constexpr RegisterX64 edx{SizeX64::dword, 2};
65
inline constexpr RegisterX64 ebx{SizeX64::dword, 3};
66
inline constexpr RegisterX64 esp{SizeX64::dword, 4};
67
inline constexpr RegisterX64 ebp{SizeX64::dword, 5};
68
inline constexpr RegisterX64 esi{SizeX64::dword, 6};
69
inline constexpr RegisterX64 edi{SizeX64::dword, 7};
70
inline constexpr RegisterX64 r8d{SizeX64::dword, 8};
71
inline constexpr RegisterX64 r9d{SizeX64::dword, 9};
72
inline constexpr RegisterX64 r10d{SizeX64::dword, 10};
73
inline constexpr RegisterX64 r11d{SizeX64::dword, 11};
74
inline constexpr RegisterX64 r12d{SizeX64::dword, 12};
75
inline constexpr RegisterX64 r13d{SizeX64::dword, 13};
76
inline constexpr RegisterX64 r14d{SizeX64::dword, 14};
77
inline constexpr RegisterX64 r15d{SizeX64::dword, 15};
78
79
inline constexpr RegisterX64 rax{SizeX64::qword, 0};
80
inline constexpr RegisterX64 rcx{SizeX64::qword, 1};
81
inline constexpr RegisterX64 rdx{SizeX64::qword, 2};
82
inline constexpr RegisterX64 rbx{SizeX64::qword, 3};
83
inline constexpr RegisterX64 rsp{SizeX64::qword, 4};
84
inline constexpr RegisterX64 rbp{SizeX64::qword, 5};
85
inline constexpr RegisterX64 rsi{SizeX64::qword, 6};
86
inline constexpr RegisterX64 rdi{SizeX64::qword, 7};
87
inline constexpr RegisterX64 r8{SizeX64::qword, 8};
88
inline constexpr RegisterX64 r9{SizeX64::qword, 9};
89
inline constexpr RegisterX64 r10{SizeX64::qword, 10};
90
inline constexpr RegisterX64 r11{SizeX64::qword, 11};
91
inline constexpr RegisterX64 r12{SizeX64::qword, 12};
92
inline constexpr RegisterX64 r13{SizeX64::qword, 13};
93
inline constexpr RegisterX64 r14{SizeX64::qword, 14};
94
inline constexpr RegisterX64 r15{SizeX64::qword, 15};
95
96
inline constexpr RegisterX64 xmm0{SizeX64::xmmword, 0};
97
inline constexpr RegisterX64 xmm1{SizeX64::xmmword, 1};
98
inline constexpr RegisterX64 xmm2{SizeX64::xmmword, 2};
99
inline constexpr RegisterX64 xmm3{SizeX64::xmmword, 3};
100
inline constexpr RegisterX64 xmm4{SizeX64::xmmword, 4};
101
inline constexpr RegisterX64 xmm5{SizeX64::xmmword, 5};
102
inline constexpr RegisterX64 xmm6{SizeX64::xmmword, 6};
103
inline constexpr RegisterX64 xmm7{SizeX64::xmmword, 7};
104
inline constexpr RegisterX64 xmm8{SizeX64::xmmword, 8};
105
inline constexpr RegisterX64 xmm9{SizeX64::xmmword, 9};
106
inline constexpr RegisterX64 xmm10{SizeX64::xmmword, 10};
107
inline constexpr RegisterX64 xmm11{SizeX64::xmmword, 11};
108
inline constexpr RegisterX64 xmm12{SizeX64::xmmword, 12};
109
inline constexpr RegisterX64 xmm13{SizeX64::xmmword, 13};
110
inline constexpr RegisterX64 xmm14{SizeX64::xmmword, 14};
111
inline constexpr RegisterX64 xmm15{SizeX64::xmmword, 15};
112
113
inline constexpr RegisterX64 ymm0{SizeX64::ymmword, 0};
114
inline constexpr RegisterX64 ymm1{SizeX64::ymmword, 1};
115
inline constexpr RegisterX64 ymm2{SizeX64::ymmword, 2};
116
inline constexpr RegisterX64 ymm3{SizeX64::ymmword, 3};
117
inline constexpr RegisterX64 ymm4{SizeX64::ymmword, 4};
118
inline constexpr RegisterX64 ymm5{SizeX64::ymmword, 5};
119
inline constexpr RegisterX64 ymm6{SizeX64::ymmword, 6};
120
inline constexpr RegisterX64 ymm7{SizeX64::ymmword, 7};
121
inline constexpr RegisterX64 ymm8{SizeX64::ymmword, 8};
122
inline constexpr RegisterX64 ymm9{SizeX64::ymmword, 9};
123
inline constexpr RegisterX64 ymm10{SizeX64::ymmword, 10};
124
inline constexpr RegisterX64 ymm11{SizeX64::ymmword, 11};
125
inline constexpr RegisterX64 ymm12{SizeX64::ymmword, 12};
126
inline constexpr RegisterX64 ymm13{SizeX64::ymmword, 13};
127
inline constexpr RegisterX64 ymm14{SizeX64::ymmword, 14};
128
inline constexpr RegisterX64 ymm15{SizeX64::ymmword, 15};
129
130
constexpr RegisterX64 byteReg(RegisterX64 reg)
131
{
132
return RegisterX64{SizeX64::byte, reg.index};
133
}
134
135
constexpr RegisterX64 wordReg(RegisterX64 reg)
136
{
137
return RegisterX64{SizeX64::word, reg.index};
138
}
139
140
constexpr RegisterX64 dwordReg(RegisterX64 reg)
141
{
142
return RegisterX64{SizeX64::dword, reg.index};
143
}
144
145
constexpr RegisterX64 qwordReg(RegisterX64 reg)
146
{
147
return RegisterX64{SizeX64::qword, reg.index};
148
}
149
150
} // namespace X64
151
} // namespace CodeGen
152
} // namespace Luau
153
154