#pragma once

#include <cstdint>

namespace sliger {

// NOTICE: keep up to date with src/arch.ts

enum class Op : uint32_t {
    Nop = 0x00,
    PushNull = 0x01,
    PushInt = 0x02,
    PushBool = 0x03,
    PushString = 0x04,
    PushPtr = 0x05,
    Pop = 0x06,
    ReserveStatic = 0x07,
    LoadStatic = 0x08,
    StoreStatic = 0x09,
    LoadLocal = 0x0a,
    StoreLocal = 0x0b,
    Call = 0x0c,
    Return = 0x0d,
    Jump = 0x0e,
    JumpIfTrue = 0x0f,
    Builtin = 0x10,
    Add = 0x20,
    Subtract = 0x21,
    Multiply = 0x22,
    Divide = 0x23,
    Remainder = 0x24,
    Equal = 0x25,
    LessThan = 0x26,
    And = 0x27,
    Or = 0x28,
    Xor = 0x29,
    Not = 0x2a,
    SourceMap = 0x30,
};

enum class Builtin : uint32_t {
    StringConcat = 0x10,
    StringEqual = 0x11,
    ArraySet = 0x20,
    StructSet = 0x30,
    Print = 0x40,
};

}