https://mp.weixin.qq.com/s/Z67OXngGV2Qb8Qf80LzY1g
简单介绍Consts的实现。
1. ScalarOpConstants
定义标量操作相关的常量:
1) MT
定义操作的内存类型:
如下图所示load指令中的使用:
mtSize表示操作数的大小,以字节数为单位,其值为2的幂,即:
操作数的字节数 = 2^mtSize
mtSigned表示操作数是有符号数还是无符号数;
2) BR
定义branch的类型:
如下图所示Branch指令中使用:
3) A1
定义参数1(argument 1)的信息:
其中:
a. A1_ZERO:表示参数1为0;
b. A1_RS1:表示参数1使用RS1;
c. A1_PC:表示参数1使用PC的值;
4) IMM
定义立即数的类型:
根据指令格式的不同,立即数的编码方式也不相同:
5) A2
定义参数2(argument 2)的信息:
其中:
a. A2_ZERO:表示参数2的值为0;
b. A2_SIZE:表示参数2的值是一个大小,比如jal指令中为距离当前pc的大小;
c. A2_RS2:使用RS2作为参数2;
d. A2_IMM:使用立即数作为参数2;
6) Y/N/X
定义三个基本的Patten:
a. X:值未知的一个比特;
b. Y:值为1的一个比特;
c. N:置位0的一个比特;
7) DW
定义操作数的宽度:
a. DW_32:表示操作数为32位宽;
b. DW_64:表示操作数为64位宽;
c. DW_XPR:表示操作数的宽度与寄存器宽度一致;这里DW_XPR = DW_64,表示当前配置下XLen = 64;这里没有从全局的配置中获取,而是直接写死,是修改时需要注意的一个点。
2. MemoryOpConstants
定义内存操作相关的常量:
1) M
定义指令内存操作的相关信息:
各操作含义如下表格:
LR/SC指令描述如下:
2) isXXX
定义一些简便方法:
a. isAMOLogical:是否原子逻辑运算;
b. isAMOArithmetic:是否原子数学运算;
c. isAMO:是否原子操作;
d. isPrefetch:是否预处理;
e. isRead:是否读操作;
f. isWrite:是否写操作;
g. isWriteIntent:是否想要写;