(enum reg): Rearrange registers, remove 'ccfg' and 'pc'.
(enum reg_type): Remove CRX_PC_REGTYPE, CRX_MTPR_REGTYPE. (enum operand_type): Rearrange operands, edit comments. replace us<N> with ui<N> for unsigned immediate. replace d<N> with disps<N>/dispu<N>/dispe<N> for signed/unsigned/escaped displacements (respectively). replace rbase_ridx_scl2_dispu<N> with rindex_disps<N> for register index. (instruction type): Add NO_TYPE_INS. (instruction flags): Add USER_REG, CST4MAP, NO_SP, NO_RPTR. (operand_entry): New field - 'flags'. (operand flags): New.
This commit is contained in:
parent
ccf4c1e6cd
commit
f1e209188b
include/opcode
|
@ -41,20 +41,16 @@ typedef enum
|
||||||
uhi, ulo,
|
uhi, ulo,
|
||||||
/* Processor Status Register. */
|
/* Processor Status Register. */
|
||||||
psr,
|
psr,
|
||||||
/* Configuration Register. */
|
|
||||||
cfg,
|
|
||||||
/* Coprocessor Configuration Register. */
|
|
||||||
cpcfg,
|
|
||||||
/* Cashe Configuration Register. */
|
|
||||||
ccfg,
|
|
||||||
/* Interrupt Base Register. */
|
/* Interrupt Base Register. */
|
||||||
intbase,
|
intbase,
|
||||||
/* Interrupt Stack Pointer Register. */
|
/* Interrupt Stack Pointer Register. */
|
||||||
isp,
|
isp,
|
||||||
|
/* Configuration Register. */
|
||||||
|
cfg,
|
||||||
|
/* Coprocessor Configuration Register. */
|
||||||
|
cpcfg,
|
||||||
/* Coprocessor Enable Register. */
|
/* Coprocessor Enable Register. */
|
||||||
cen,
|
cen,
|
||||||
/* Program Counter Register. */
|
|
||||||
pc,
|
|
||||||
/* Not a register. */
|
/* Not a register. */
|
||||||
nullregister,
|
nullregister,
|
||||||
MAX_REG
|
MAX_REG
|
||||||
|
@ -83,13 +79,11 @@ copreg;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
CRX_PC_REGTYPE, /* pc type */
|
|
||||||
CRX_R_REGTYPE, /* r<N> */
|
CRX_R_REGTYPE, /* r<N> */
|
||||||
CRX_U_REGTYPE, /* u<N> */
|
CRX_U_REGTYPE, /* u<N> */
|
||||||
CRX_C_REGTYPE, /* c<N> */
|
CRX_C_REGTYPE, /* c<N> */
|
||||||
CRX_CS_REGTYPE, /* cs<N> */
|
CRX_CS_REGTYPE, /* cs<N> */
|
||||||
CRX_MTPR_REGTYPE, /* mtpr */
|
CRX_CFG_REGTYPE /* configuration register */
|
||||||
CRX_CFG_REGTYPE /* *hi|lo, *cfg, psr */
|
|
||||||
}
|
}
|
||||||
reg_type;
|
reg_type;
|
||||||
|
|
||||||
|
@ -117,40 +111,38 @@ typedef enum
|
||||||
argtype;
|
argtype;
|
||||||
|
|
||||||
/* CRX operand types :
|
/* CRX operand types :
|
||||||
The operand types correspond to instructions operands
|
The operand types correspond to instructions operands. */
|
||||||
|
|
||||||
Operand Types :
|
|
||||||
cst4 - 4-bit encoded constant
|
|
||||||
iN - N-bit immediate field
|
|
||||||
d, dispsN - N-bit immediate signed displacement
|
|
||||||
dispuN - N-bit immediate unsigned displacement
|
|
||||||
absN - N-bit absolute address
|
|
||||||
rbase - 4-bit genaral-purpose register specifier
|
|
||||||
regr - 4-bit genaral-purpose register specifier
|
|
||||||
regr8 - 8-bit register address space
|
|
||||||
copregr - coprocessor register
|
|
||||||
copsregr - coprocessor special register
|
|
||||||
scl2 - 2-bit scaling factor for memory index
|
|
||||||
ridx - register index. */
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
dummy, cst4, disps9,
|
dummy,
|
||||||
/* Immediate operands. */
|
/* 4-bit encoded constant. */
|
||||||
|
cst4,
|
||||||
|
/* N-bit immediate. */
|
||||||
i16, i32,
|
i16, i32,
|
||||||
/* Unsigned immediate operands. */
|
/* N-bit unsigned immediate. */
|
||||||
us3, us4, us5, us16,
|
ui3, ui4, ui5, ui16,
|
||||||
/* Signed displacement operands. */
|
/* N-bit signed displacement. */
|
||||||
d5, d9, d17, d25, d33,
|
disps9, disps17, disps25, disps32,
|
||||||
/* Absolute operands. */
|
/* N-bit unsigned displacement. */
|
||||||
|
dispu5,
|
||||||
|
/* N-bit escaped displacement. */
|
||||||
|
dispe9,
|
||||||
|
/* N-bit absolute address. */
|
||||||
abs16, abs32,
|
abs16, abs32,
|
||||||
/* Register relative operands. */
|
/* Register relative. */
|
||||||
rbase, rbase_cst4,
|
rbase, rbase_cst4,
|
||||||
rbase_dispu8, rbase_dispu12, rbase_dispu16, rbase_dispu28, rbase_dispu32,
|
rbase_disps12, rbase_disps16, rbase_disps28, rbase_disps32,
|
||||||
/* Index operands. */
|
/* Register index. */
|
||||||
rbase_ridx_scl2_dispu6, rbase_ridx_scl2_dispu22,
|
rindex_disps6, rindex_disps22,
|
||||||
/* Register and processor register operands. */
|
/* 4-bit genaral-purpose register specifier. */
|
||||||
regr, regr8, copregr,copregr8,copsregr,
|
regr,
|
||||||
|
/* 8-bit register address space. */
|
||||||
|
regr8,
|
||||||
|
/* coprocessor register. */
|
||||||
|
copregr,
|
||||||
|
/* coprocessor special register. */
|
||||||
|
copsregr,
|
||||||
/* Not an operand. */
|
/* Not an operand. */
|
||||||
nulloperand,
|
nulloperand,
|
||||||
/* Maximum supported operand. */
|
/* Maximum supported operand. */
|
||||||
|
@ -160,6 +152,7 @@ operand_type;
|
||||||
|
|
||||||
/* CRX instruction types. */
|
/* CRX instruction types. */
|
||||||
|
|
||||||
|
#define NO_TYPE_INS 0
|
||||||
#define ARITH_INS 1
|
#define ARITH_INS 1
|
||||||
#define LD_STOR_INS 2
|
#define LD_STOR_INS 2
|
||||||
#define BRANCH_INS 3
|
#define BRANCH_INS 3
|
||||||
|
@ -192,23 +185,37 @@ operand_type;
|
||||||
#define REG_LIST CRX_INS_MAX
|
#define REG_LIST CRX_INS_MAX
|
||||||
/* The operands in binary and assembly are placed in reverse order.
|
/* The operands in binary and assembly are placed in reverse order.
|
||||||
load - (REVERSE_MATCH)/store - (! REVERSE_MATCH). */
|
load - (REVERSE_MATCH)/store - (! REVERSE_MATCH). */
|
||||||
#define REVERSE_MATCH (REG_LIST << 1)
|
#define REVERSE_MATCH (1 << 6)
|
||||||
|
|
||||||
/* Kind of displacement map used DISPU[BWD]4. */
|
/* Kind of displacement map used DISPU[BWD]4. */
|
||||||
#define DISPUB4 (REVERSE_MATCH << 1)
|
#define DISPUB4 (1 << 7)
|
||||||
#define DISPUW4 (DISPUB4 << 1)
|
#define DISPUW4 (1 << 8)
|
||||||
#define DISPUD4 (DISPUW4 << 1)
|
#define DISPUD4 (1 << 9)
|
||||||
#define CST4MAP (DISPUB4 | DISPUW4 | DISPUD4)
|
#define DISPU4MAP (DISPUB4 | DISPUW4 | DISPUD4)
|
||||||
|
|
||||||
/* Printing formats, where the instruction prefix isn't consecutive. */
|
/* Printing formats, where the instruction prefix isn't consecutive. */
|
||||||
#define FMT_1 (DISPUD4 << 1) /* 0xF0F00000 */
|
#define FMT_1 (1 << 10) /* 0xF0F00000 */
|
||||||
#define FMT_2 (FMT_1 << 1) /* 0xFFF0FF00 */
|
#define FMT_2 (1 << 11) /* 0xFFF0FF00 */
|
||||||
#define FMT_3 (FMT_2 << 1) /* 0xFFF00F00 */
|
#define FMT_3 (1 << 12) /* 0xFFF00F00 */
|
||||||
#define FMT_4 (FMT_3 << 1) /* 0xFFF0F000 */
|
#define FMT_4 (1 << 13) /* 0xFFF0F000 */
|
||||||
#define FMT_5 (FMT_4 << 1) /* 0xFFF0FFF0 */
|
#define FMT_5 (1 << 14) /* 0xFFF0FFF0 */
|
||||||
#define FMT_CRX (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5)
|
#define FMT_CRX (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5)
|
||||||
|
|
||||||
#define RELAXABLE (FMT_5 << 1)
|
/* Indicates whether this instruction can be relaxed. */
|
||||||
|
#define RELAXABLE (1 << 15)
|
||||||
|
|
||||||
|
/* Indicates that instruction uses user registers (and not
|
||||||
|
general-purpose registers) as operands. */
|
||||||
|
#define USER_REG (1 << 16)
|
||||||
|
|
||||||
|
/* Indicates that instruction can perfom a cst4 mapping. */
|
||||||
|
#define CST4MAP (1 << 17)
|
||||||
|
|
||||||
|
/* Instruction shouldn't allow 'sp' usage. */
|
||||||
|
#define NO_SP (1 << 18)
|
||||||
|
|
||||||
|
/* Instruction shouldn't allow to push a register which is used as a rptr. */
|
||||||
|
#define NO_RPTR (1 << 19)
|
||||||
|
|
||||||
/* Maximum operands per instruction. */
|
/* Maximum operands per instruction. */
|
||||||
#define MAX_OPERANDS 5
|
#define MAX_OPERANDS 5
|
||||||
|
@ -219,6 +226,24 @@ operand_type;
|
||||||
/* Maximum instruction length. */
|
/* Maximum instruction length. */
|
||||||
#define MAX_INST_LEN 256
|
#define MAX_INST_LEN 256
|
||||||
|
|
||||||
|
|
||||||
|
/* Values defined for the flags field of a struct operand_entry. */
|
||||||
|
|
||||||
|
/* Operand must be an unsigned number. */
|
||||||
|
#define OPERAND_UNSIGNED (1 << 0)
|
||||||
|
/* Operand must be a signed number. */
|
||||||
|
#define OPERAND_SIGNED (1 << 1)
|
||||||
|
/* A cst4 operand. */
|
||||||
|
#define OPERAND_CST4 (1 << 2)
|
||||||
|
/* Operand must be an even number. */
|
||||||
|
#define OPERAND_EVEN (1 << 3)
|
||||||
|
/* Operand is shifted right. */
|
||||||
|
#define OPERAND_SHIFT (1 << 4)
|
||||||
|
/* Operand is shifted right and decremented. */
|
||||||
|
#define OPERAND_SHIFT_DEC (1 << 5)
|
||||||
|
/* Operand has reserved escape sequences. */
|
||||||
|
#define OPERAND_ESC (1 << 6)
|
||||||
|
|
||||||
/* Single operand description. */
|
/* Single operand description. */
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -300,6 +325,8 @@ typedef struct
|
||||||
unsigned int bit_size;
|
unsigned int bit_size;
|
||||||
/* Argument type. */
|
/* Argument type. */
|
||||||
argtype arg_type;
|
argtype arg_type;
|
||||||
|
/* One bit syntax flags. */
|
||||||
|
int flags;
|
||||||
}
|
}
|
||||||
operand_entry;
|
operand_entry;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue