luau/CodeGen/include/Luau/AddressA64.h

60 lines
1.4 KiB
C
Raw Normal View History

2022-11-04 17:02:37 +00:00
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
#pragma once
#include "Luau/RegisterA64.h"
2023-03-31 13:21:14 +01:00
#include <stddef.h>
2022-11-04 17:02:37 +00:00
namespace Luau
{
namespace CodeGen
{
2023-03-03 13:45:38 +00:00
namespace A64
{
2022-11-04 17:02:37 +00:00
enum class AddressKindA64 : uint8_t
{
2023-06-09 13:20:36 +01:00
reg, // reg + reg
imm, // reg + imm
pre, // reg + imm, reg += imm
post, // reg, reg += imm
2022-11-04 17:02:37 +00:00
};
struct AddressA64
{
2023-03-31 13:21:14 +01:00
// This is a little misleading since AddressA64 can encode offsets up to 1023*size where size depends on the load/store size
// 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
static constexpr size_t kMaxOffset = 1023;
2023-06-09 13:20:36 +01:00
constexpr AddressA64(RegisterA64 base, int off = 0, AddressKindA64 kind = AddressKindA64::imm)
: kind(kind)
2022-11-04 17:02:37 +00:00
, base(base)
, offset(xzr)
, data(off)
{
2022-11-10 22:04:44 +00:00
LUAU_ASSERT(base.kind == KindA64::x || base == sp);
2023-06-09 13:20:36 +01:00
LUAU_ASSERT(kind != AddressKindA64::reg);
2022-11-04 17:02:37 +00:00
}
2023-04-14 13:05:27 +01:00
constexpr AddressA64(RegisterA64 base, RegisterA64 offset)
2022-11-04 17:02:37 +00:00
: kind(AddressKindA64::reg)
, base(base)
, offset(offset)
, data(0)
{
LUAU_ASSERT(base.kind == KindA64::x);
LUAU_ASSERT(offset.kind == KindA64::x);
}
AddressKindA64 kind;
RegisterA64 base;
RegisterA64 offset;
int data;
};
2022-11-10 22:04:44 +00:00
using mem = AddressA64;
2023-03-03 13:45:38 +00:00
} // namespace A64
2022-11-04 17:02:37 +00:00
} // namespace CodeGen
} // namespace Luau