Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/include/Luau/AddressA64.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/RegisterA64.h"
5
6
#include <stddef.h>
7
8
namespace Luau
9
{
10
namespace CodeGen
11
{
12
namespace A64
13
{
14
15
enum class AddressKindA64 : uint8_t
16
{
17
reg, // reg + reg
18
imm, // reg + imm
19
pre, // reg + imm, reg += imm
20
post, // reg, reg += imm
21
};
22
23
struct AddressA64
24
{
25
// This is a little misleading since AddressA64 can encode offsets up to 1023*size where size depends on the load/store size
26
// For example, ldr x0, [reg+imm] is limited to 8 KB offsets assuming imm is divisible by 8, but loading into w0 reduces the range to 4 KB
27
static constexpr size_t kMaxOffset = 1023;
28
29
constexpr AddressA64(RegisterA64 base, int off = 0, AddressKindA64 kind = AddressKindA64::imm)
30
: kind(kind)
31
, base(base)
32
, offset(xzr)
33
, data(off)
34
{
35
CODEGEN_ASSERT(base.kind == KindA64::x || base == sp);
36
CODEGEN_ASSERT(kind != AddressKindA64::reg);
37
}
38
39
constexpr AddressA64(RegisterA64 base, RegisterA64 offset)
40
: kind(AddressKindA64::reg)
41
, base(base)
42
, offset(offset)
43
, data(0)
44
{
45
CODEGEN_ASSERT(base.kind == KindA64::x);
46
CODEGEN_ASSERT(offset.kind == KindA64::x);
47
}
48
49
AddressKindA64 kind;
50
RegisterA64 base;
51
RegisterA64 offset;
52
int data;
53
};
54
55
using mem = AddressA64;
56
57
} // namespace A64
58
} // namespace CodeGen
59
} // namespace Luau
60
61