// 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"

namespace Luau
{
namespace CodeGen
{
namespace A64
{

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
{
    AddressA64(RegisterA64 base, int off = 0)
        : kind(AddressKindA64::imm)
        , base(base)
        , offset(xzr)
        , data(off)
    {
        LUAU_ASSERT(base.kind == KindA64::x || base == sp);
        LUAU_ASSERT(off >= -256 && off < 4096);
    }

    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;
};

using mem = AddressA64;

} // namespace A64
} // namespace CodeGen
} // namespace Luau