Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/include/Luau/RegisterA64.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 A64
13
{
14
15
enum class KindA64 : uint8_t
16
{
17
none,
18
w, // 32-bit GPR
19
x, // 64-bit GPR
20
s, // 32-bit SIMD&FP scalar
21
d, // 64-bit SIMD&FP scalar
22
q, // 128-bit SIMD&FP vector
23
};
24
25
struct RegisterA64
26
{
27
KindA64 kind : 3;
28
uint8_t index : 5;
29
30
constexpr bool operator==(RegisterA64 rhs) const
31
{
32
return kind == rhs.kind && index == rhs.index;
33
}
34
35
constexpr bool operator!=(RegisterA64 rhs) const
36
{
37
return !(*this == rhs);
38
}
39
};
40
41
constexpr RegisterA64 castReg(KindA64 kind, RegisterA64 reg)
42
{
43
CODEGEN_ASSERT(kind != reg.kind);
44
CODEGEN_ASSERT(kind != KindA64::none && reg.kind != KindA64::none);
45
CODEGEN_ASSERT((kind == KindA64::w || kind == KindA64::x) == (reg.kind == KindA64::w || reg.kind == KindA64::x));
46
47
return RegisterA64{kind, reg.index};
48
}
49
50
inline constexpr RegisterA64 noreg{KindA64::none, 0};
51
52
inline constexpr RegisterA64 w0{KindA64::w, 0};
53
inline constexpr RegisterA64 w1{KindA64::w, 1};
54
inline constexpr RegisterA64 w2{KindA64::w, 2};
55
inline constexpr RegisterA64 w3{KindA64::w, 3};
56
inline constexpr RegisterA64 w4{KindA64::w, 4};
57
inline constexpr RegisterA64 w5{KindA64::w, 5};
58
inline constexpr RegisterA64 w6{KindA64::w, 6};
59
inline constexpr RegisterA64 w7{KindA64::w, 7};
60
inline constexpr RegisterA64 w8{KindA64::w, 8};
61
inline constexpr RegisterA64 w9{KindA64::w, 9};
62
inline constexpr RegisterA64 w10{KindA64::w, 10};
63
inline constexpr RegisterA64 w11{KindA64::w, 11};
64
inline constexpr RegisterA64 w12{KindA64::w, 12};
65
inline constexpr RegisterA64 w13{KindA64::w, 13};
66
inline constexpr RegisterA64 w14{KindA64::w, 14};
67
inline constexpr RegisterA64 w15{KindA64::w, 15};
68
inline constexpr RegisterA64 w16{KindA64::w, 16};
69
inline constexpr RegisterA64 w17{KindA64::w, 17};
70
inline constexpr RegisterA64 w18{KindA64::w, 18};
71
inline constexpr RegisterA64 w19{KindA64::w, 19};
72
inline constexpr RegisterA64 w20{KindA64::w, 20};
73
inline constexpr RegisterA64 w21{KindA64::w, 21};
74
inline constexpr RegisterA64 w22{KindA64::w, 22};
75
inline constexpr RegisterA64 w23{KindA64::w, 23};
76
inline constexpr RegisterA64 w24{KindA64::w, 24};
77
inline constexpr RegisterA64 w25{KindA64::w, 25};
78
inline constexpr RegisterA64 w26{KindA64::w, 26};
79
inline constexpr RegisterA64 w27{KindA64::w, 27};
80
inline constexpr RegisterA64 w28{KindA64::w, 28};
81
inline constexpr RegisterA64 w29{KindA64::w, 29};
82
inline constexpr RegisterA64 w30{KindA64::w, 30};
83
inline constexpr RegisterA64 wzr{KindA64::w, 31};
84
85
inline constexpr RegisterA64 x0{KindA64::x, 0};
86
inline constexpr RegisterA64 x1{KindA64::x, 1};
87
inline constexpr RegisterA64 x2{KindA64::x, 2};
88
inline constexpr RegisterA64 x3{KindA64::x, 3};
89
inline constexpr RegisterA64 x4{KindA64::x, 4};
90
inline constexpr RegisterA64 x5{KindA64::x, 5};
91
inline constexpr RegisterA64 x6{KindA64::x, 6};
92
inline constexpr RegisterA64 x7{KindA64::x, 7};
93
inline constexpr RegisterA64 x8{KindA64::x, 8};
94
inline constexpr RegisterA64 x9{KindA64::x, 9};
95
inline constexpr RegisterA64 x10{KindA64::x, 10};
96
inline constexpr RegisterA64 x11{KindA64::x, 11};
97
inline constexpr RegisterA64 x12{KindA64::x, 12};
98
inline constexpr RegisterA64 x13{KindA64::x, 13};
99
inline constexpr RegisterA64 x14{KindA64::x, 14};
100
inline constexpr RegisterA64 x15{KindA64::x, 15};
101
inline constexpr RegisterA64 x16{KindA64::x, 16};
102
inline constexpr RegisterA64 x17{KindA64::x, 17};
103
inline constexpr RegisterA64 x18{KindA64::x, 18};
104
inline constexpr RegisterA64 x19{KindA64::x, 19};
105
inline constexpr RegisterA64 x20{KindA64::x, 20};
106
inline constexpr RegisterA64 x21{KindA64::x, 21};
107
inline constexpr RegisterA64 x22{KindA64::x, 22};
108
inline constexpr RegisterA64 x23{KindA64::x, 23};
109
inline constexpr RegisterA64 x24{KindA64::x, 24};
110
inline constexpr RegisterA64 x25{KindA64::x, 25};
111
inline constexpr RegisterA64 x26{KindA64::x, 26};
112
inline constexpr RegisterA64 x27{KindA64::x, 27};
113
inline constexpr RegisterA64 x28{KindA64::x, 28};
114
inline constexpr RegisterA64 x29{KindA64::x, 29};
115
inline constexpr RegisterA64 x30{KindA64::x, 30};
116
inline constexpr RegisterA64 xzr{KindA64::x, 31};
117
118
inline constexpr RegisterA64 sp{KindA64::none, 31};
119
120
inline constexpr RegisterA64 s0{KindA64::s, 0};
121
inline constexpr RegisterA64 s1{KindA64::s, 1};
122
inline constexpr RegisterA64 s2{KindA64::s, 2};
123
inline constexpr RegisterA64 s3{KindA64::s, 3};
124
inline constexpr RegisterA64 s4{KindA64::s, 4};
125
inline constexpr RegisterA64 s5{KindA64::s, 5};
126
inline constexpr RegisterA64 s6{KindA64::s, 6};
127
inline constexpr RegisterA64 s7{KindA64::s, 7};
128
inline constexpr RegisterA64 s8{KindA64::s, 8};
129
inline constexpr RegisterA64 s9{KindA64::s, 9};
130
inline constexpr RegisterA64 s10{KindA64::s, 10};
131
inline constexpr RegisterA64 s11{KindA64::s, 11};
132
inline constexpr RegisterA64 s12{KindA64::s, 12};
133
inline constexpr RegisterA64 s13{KindA64::s, 13};
134
inline constexpr RegisterA64 s14{KindA64::s, 14};
135
inline constexpr RegisterA64 s15{KindA64::s, 15};
136
inline constexpr RegisterA64 s16{KindA64::s, 16};
137
inline constexpr RegisterA64 s17{KindA64::s, 17};
138
inline constexpr RegisterA64 s18{KindA64::s, 18};
139
inline constexpr RegisterA64 s19{KindA64::s, 19};
140
inline constexpr RegisterA64 s20{KindA64::s, 20};
141
inline constexpr RegisterA64 s21{KindA64::s, 21};
142
inline constexpr RegisterA64 s22{KindA64::s, 22};
143
inline constexpr RegisterA64 s23{KindA64::s, 23};
144
inline constexpr RegisterA64 s24{KindA64::s, 24};
145
inline constexpr RegisterA64 s25{KindA64::s, 25};
146
inline constexpr RegisterA64 s26{KindA64::s, 26};
147
inline constexpr RegisterA64 s27{KindA64::s, 27};
148
inline constexpr RegisterA64 s28{KindA64::s, 28};
149
inline constexpr RegisterA64 s29{KindA64::s, 29};
150
inline constexpr RegisterA64 s30{KindA64::s, 30};
151
inline constexpr RegisterA64 s31{KindA64::s, 31};
152
153
inline constexpr RegisterA64 d0{KindA64::d, 0};
154
inline constexpr RegisterA64 d1{KindA64::d, 1};
155
inline constexpr RegisterA64 d2{KindA64::d, 2};
156
inline constexpr RegisterA64 d3{KindA64::d, 3};
157
inline constexpr RegisterA64 d4{KindA64::d, 4};
158
inline constexpr RegisterA64 d5{KindA64::d, 5};
159
inline constexpr RegisterA64 d6{KindA64::d, 6};
160
inline constexpr RegisterA64 d7{KindA64::d, 7};
161
inline constexpr RegisterA64 d8{KindA64::d, 8};
162
inline constexpr RegisterA64 d9{KindA64::d, 9};
163
inline constexpr RegisterA64 d10{KindA64::d, 10};
164
inline constexpr RegisterA64 d11{KindA64::d, 11};
165
inline constexpr RegisterA64 d12{KindA64::d, 12};
166
inline constexpr RegisterA64 d13{KindA64::d, 13};
167
inline constexpr RegisterA64 d14{KindA64::d, 14};
168
inline constexpr RegisterA64 d15{KindA64::d, 15};
169
inline constexpr RegisterA64 d16{KindA64::d, 16};
170
inline constexpr RegisterA64 d17{KindA64::d, 17};
171
inline constexpr RegisterA64 d18{KindA64::d, 18};
172
inline constexpr RegisterA64 d19{KindA64::d, 19};
173
inline constexpr RegisterA64 d20{KindA64::d, 20};
174
inline constexpr RegisterA64 d21{KindA64::d, 21};
175
inline constexpr RegisterA64 d22{KindA64::d, 22};
176
inline constexpr RegisterA64 d23{KindA64::d, 23};
177
inline constexpr RegisterA64 d24{KindA64::d, 24};
178
inline constexpr RegisterA64 d25{KindA64::d, 25};
179
inline constexpr RegisterA64 d26{KindA64::d, 26};
180
inline constexpr RegisterA64 d27{KindA64::d, 27};
181
inline constexpr RegisterA64 d28{KindA64::d, 28};
182
inline constexpr RegisterA64 d29{KindA64::d, 29};
183
inline constexpr RegisterA64 d30{KindA64::d, 30};
184
inline constexpr RegisterA64 d31{KindA64::d, 31};
185
186
inline constexpr RegisterA64 q0{KindA64::q, 0};
187
inline constexpr RegisterA64 q1{KindA64::q, 1};
188
inline constexpr RegisterA64 q2{KindA64::q, 2};
189
inline constexpr RegisterA64 q3{KindA64::q, 3};
190
inline constexpr RegisterA64 q4{KindA64::q, 4};
191
inline constexpr RegisterA64 q5{KindA64::q, 5};
192
inline constexpr RegisterA64 q6{KindA64::q, 6};
193
inline constexpr RegisterA64 q7{KindA64::q, 7};
194
inline constexpr RegisterA64 q8{KindA64::q, 8};
195
inline constexpr RegisterA64 q9{KindA64::q, 9};
196
inline constexpr RegisterA64 q10{KindA64::q, 10};
197
inline constexpr RegisterA64 q11{KindA64::q, 11};
198
inline constexpr RegisterA64 q12{KindA64::q, 12};
199
inline constexpr RegisterA64 q13{KindA64::q, 13};
200
inline constexpr RegisterA64 q14{KindA64::q, 14};
201
inline constexpr RegisterA64 q15{KindA64::q, 15};
202
inline constexpr RegisterA64 q16{KindA64::q, 16};
203
inline constexpr RegisterA64 q17{KindA64::q, 17};
204
inline constexpr RegisterA64 q18{KindA64::q, 18};
205
inline constexpr RegisterA64 q19{KindA64::q, 19};
206
inline constexpr RegisterA64 q20{KindA64::q, 20};
207
inline constexpr RegisterA64 q21{KindA64::q, 21};
208
inline constexpr RegisterA64 q22{KindA64::q, 22};
209
inline constexpr RegisterA64 q23{KindA64::q, 23};
210
inline constexpr RegisterA64 q24{KindA64::q, 24};
211
inline constexpr RegisterA64 q25{KindA64::q, 25};
212
inline constexpr RegisterA64 q26{KindA64::q, 26};
213
inline constexpr RegisterA64 q27{KindA64::q, 27};
214
inline constexpr RegisterA64 q28{KindA64::q, 28};
215
inline constexpr RegisterA64 q29{KindA64::q, 29};
216
inline constexpr RegisterA64 q30{KindA64::q, 30};
217
inline constexpr RegisterA64 q31{KindA64::q, 31};
218
219
} // namespace A64
220
} // namespace CodeGen
221
} // namespace Luau
222
223