rizin/librz/arch/arch-asm/rx/rx_inst.h
2024-03-07 18:38:49 +08:00

100 lines
1.6 KiB
C

// SPDX-FileCopyrightText: 2024 heersin <teablearcher@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RX_ARCH_INST_H
#define RX_ARCH_INST_H
#include "rx_opcode_detail.h"
typedef enum rx_operand_kind_enum {
RX_OPERAND_NULL,
RX_OPERAND_IMM,
RX_OPERAND_REG,
RX_OPERAND_FLAG,
RX_OPERAND_COND,
} RxOperandKind;
typedef enum {
RX_FIXOP_NON,
RX_FIXOP_POST_INC,
RX_FIXOP_PRE_DEC
} RxOpFixMark;
typedef enum {
RX_FLAG_C,
RX_FLAG_Z,
RX_FLAG_S,
RX_FLAG_O,
RX_FLAG_I,
RX_FLAG_U,
RX_FLAG_RESERVED
} RxOperandFlag;
typedef enum {
RX_COND_EQ, // BZ
RX_COND_NE, // BNZ
RX_COND_GEU, // BC
RX_COND_LTU, // BNC
RX_COND_GTU,
RX_COND_LEU,
RX_COND_PZ,
RX_COND_N,
RX_COND_GE,
RX_COND_LT,
RX_COND_GT,
RX_COND_LE,
RX_COND_O,
RX_COND_NO,
RX_COND_RA,
RX_COND_JUMP,
RX_COND_RESERVED,
} RxOpCondMark;
typedef struct {
RxOpCondMark cond;
ut8 pc_dsp_len;
ut32 pc_dsp_val;
} RxOperandCond;
typedef struct {
bool as_indirect;
bool as_base;
ut8 dsp_width;
RxOpExtMark memex;
RxReg ri;
RxReg reg;
RxOpFixMark fix_mode;
ut32 dsp_val;
} RxOperandReg;
typedef struct {
ut8 imm_width;
ut32 imm;
} RxOperandImm;
typedef struct rx_operand_t {
RxOperandKind kind;
union {
RxOperandReg reg;
RxOperandImm imm;
RxOperandFlag flag;
RxOperandCond cond;
} v;
} RxOperand;
typedef struct rx_inst_t {
RxOpCode op;
RxOperand v0;
RxOperand v1;
RxOperand v2;
RxOpExtMark sz_mark;
} RxInst;
// TODO make them into function, not static defined here
// TODO: call in init
extern RxOperandFlag rx_cb_map[16];
extern RxReg rx_cr_map[32];
bool rx_try_match_and_parse(RZ_OUT RxInst *inst, RxDesc *desc, st32 RZ_OUT *bytes_read, ut64 bytes);
#endif