//===-- FormatterBytecode.def -----------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef DEFINE_OPCODE
#define DEFINE_OPCODE(OP, MNEMONIC, NAME)
#endif
#ifndef DEFINE_SELECTOR
#define DEFINE_SELECTOR(ID, NAME)
#endif
#ifndef DEFINE_SIGNATURE
#define DEFINE_SIGNATURE(ID, NAME)
#endif

// Opcodes.
DEFINE_OPCODE(0x01, "dup",  dup)
DEFINE_OPCODE(0x02, "drop", drop)
DEFINE_OPCODE(0x03, "pick", pick)
DEFINE_OPCODE(0x04, "over", over)
DEFINE_OPCODE(0x05, "swap", swap)
DEFINE_OPCODE(0x06, "rot",  rot)

DEFINE_OPCODE(0x10, "{", begin)
DEFINE_OPCODE(0x11, "if", if)
DEFINE_OPCODE(0x12, "ifelse", ifelse)
DEFINE_OPCODE(0x13, "return", return)

DEFINE_OPCODE(0x20, nullptr, lit_uint)
DEFINE_OPCODE(0x21, nullptr, lit_int)
DEFINE_OPCODE(0x22, nullptr, lit_string)
DEFINE_OPCODE(0x23, nullptr, lit_selector)

DEFINE_OPCODE(0x2a, "as_int", as_int)
DEFINE_OPCODE(0x2b, "as_uint", as_uint)
DEFINE_OPCODE(0x2c, "is_null", is_null)

DEFINE_OPCODE(0x30, "+", plus)
DEFINE_OPCODE(0x31, "-", minus)
DEFINE_OPCODE(0x32, "*", mul)
DEFINE_OPCODE(0x33, "/", div)
DEFINE_OPCODE(0x34, "%", mod)
DEFINE_OPCODE(0x35, "<<", shl)
DEFINE_OPCODE(0x36, ">>", shr)

DEFINE_OPCODE(0x40, "&", and)
DEFINE_OPCODE(0x41, "|", or)
DEFINE_OPCODE(0x42, "^", xor)
DEFINE_OPCODE(0x43, "~", not)

DEFINE_OPCODE(0x50, "=", eq)
DEFINE_OPCODE(0x51, "!=", neq)
DEFINE_OPCODE(0x52, "<", lt)
DEFINE_OPCODE(0x53, ">", gt)
DEFINE_OPCODE(0x54, "=<", le)
DEFINE_OPCODE(0x55, ">=", ge)

DEFINE_OPCODE(0x60, "call", call)

// Selectors.
DEFINE_SELECTOR(0x00, summary)
DEFINE_SELECTOR(0x01, type_summary)

DEFINE_SELECTOR(0x10, get_num_children)
DEFINE_SELECTOR(0x11, get_child_at_index)
DEFINE_SELECTOR(0x12, get_child_with_name)
DEFINE_SELECTOR(0x13, get_child_index)
DEFINE_SELECTOR(0x14, get_parent)
DEFINE_SELECTOR(0x15, get_type)
DEFINE_SELECTOR(0x16, get_template_argument_type)
DEFINE_SELECTOR(0x17, cast)
DEFINE_SELECTOR(0x18, get_synthetic_value)
DEFINE_SELECTOR(0x19, get_non_synthetic_value)

DEFINE_SELECTOR(0x20, get_value)
DEFINE_SELECTOR(0x21, get_value_as_unsigned)
DEFINE_SELECTOR(0x22, get_value_as_signed)
DEFINE_SELECTOR(0x23, get_value_as_address)
DEFINE_SELECTOR(0x24, clone)

DEFINE_SELECTOR(0x40, read_memory_byte)
DEFINE_SELECTOR(0x41, read_memory_uint32)
DEFINE_SELECTOR(0x42, read_memory_int32)
DEFINE_SELECTOR(0x43, read_memory_unsigned)
DEFINE_SELECTOR(0x44, read_memory_signed)
DEFINE_SELECTOR(0x45, read_memory_address)
DEFINE_SELECTOR(0x46, read_memory)

DEFINE_SELECTOR(0x50, fmt)
DEFINE_SELECTOR(0x51, sprintf)
DEFINE_SELECTOR(0x52, strlen)

// Formatter signatures.
DEFINE_SIGNATURE(0, summary)
DEFINE_SIGNATURE(1, init)
DEFINE_SIGNATURE(2, get_num_children)
DEFINE_SIGNATURE(3, get_child_index)
DEFINE_SIGNATURE(4, get_child_at_index)
DEFINE_SIGNATURE(5, get_value)
DEFINE_SIGNATURE(6, update)
#ifndef kSignatureCount
#define kSignatureCount 7
#endif

#undef DEFINE_OPCODE
#undef DEFINE_SELECTOR
#undef DEFINE_SIGNATURE
