luau/CodeGen/include/Luau/AddressA64.h

62 lines
1.4 KiB
C
Raw Normal View History

2022-11-05 01:02:37 +08: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 20:21:14 +08:00
#include <stddef.h>
2022-11-05 01:02:37 +08:00
namespace Luau
{
namespace CodeGen
{
2023-03-03 21:45:38 +08:00
namespace A64
{
2022-11-05 01:02:37 +08:00
enum class AddressKindA64 : uint8_t
{
imm, // reg + imm
reg, // reg + reg
// TODO:
// reg + reg << shift
// reg + sext(reg) << shift
// reg + uext(reg) << shift
};
struct AddressA64
{
2023-03-31 20:21:14 +08: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;
2022-11-05 01:02:37 +08:00
AddressA64(RegisterA64 base, int off = 0)
: kind(AddressKindA64::imm)
, base(base)
, offset(xzr)
, data(off)
{
2022-11-11 06:04:44 +08:00
LUAU_ASSERT(base.kind == KindA64::x || base == sp);
2022-11-05 01:02:37 +08:00
}
AddressA64(RegisterA64 base, RegisterA64 offset)
: 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-11 06:04:44 +08:00
using mem = AddressA64;
2023-03-03 21:45:38 +08:00
} // namespace A64
2022-11-05 01:02:37 +08:00
} // namespace CodeGen
} // namespace Luau