添加一条指令:
(1) riscv.md中增加define_insn,make 会在insn-codes.h中自动生成CODE_FOR_ins=?的枚举类型的变量;
(2) riscv-gcc/gcc/config/riscv/riscv-builtins.c中的struct riscv_builtin_description中的元素:
struct riscv_builtin_description{
enum insn_code icode;
const char *name;
enum riscv_builtin_type builtin_type;
enum riscv_function_type prototype;
unsigned int (*avail) (void);//函数是否可用
}
static const struct riscv_builtin_description riscv_builtins[]=
{
DIRECT_BUILTIN(*ins,RISCV_DI_FTYPE_DI_DI,*ins)//增加的指令设置参数的格式
}
riscv-builtins.c中需要增加
①#define RISCV_FTYPE_NAME2(A,B,C) RISCV_##A##_FTYPE_##B##_##C##A##_FTYPE_##B##_##C
②#define RISCV_FTYPE_ATYPEA2(A,B,C) RISCV_ATYPE_##A,RISCV_ATYPE_##B,RISCV_ATYPE_##C
riscv-ftypes.def 中在最后一行增加 DEF_RISCV_FTYPE(2,(DI,DI,DI)) 会被expand to RISCV_DI_FTYPE_DI_DI where DI=RISCV_ATYPE_DI=intDI_type_node (type node in tree.h)
用到的数据结构:
tree_core.h tree global_trees{TI_MAX] //是一个标准树的vector
enum tree_index// standard named or nameless data types of the c compiler比如TI_INTDI_TYPE….
(3) 需要在riscv-builtins.c中/* Argument types */后增加 #define RISCV_ATYPE_DI intDi_type_node
intDi_type_node为tree.h中定义的global_trees[TI_INTDI_TYPE]
(4) 在riscv-builtins.c中 static_const_struct riscv_builtin_description riscv_builtins[]={
DIRECT_BUILTIN(*,RISCV_DI_FTYPE_DI_DI,*),
}
(5)(6)为最后端
(5) 设置新指令的opcode,将添加的指令的掩码和代码加入文件riscv-binutiles/include/opcode/riscv-opc.h这
#define MATCH_* 0x****
#define MASK_* 0x*****
(6)将指令类型加入文件riscv-binutiles/ opcode/riscv-opc.c中
完成指令的添加,重新make