系列宏以及函数

项目工程

Posted by Bruce Lee on 2024-04-08
INSTPAT_INST宏是怎么起作用的?

只引用了Decode类型变量s,引用s中的isa内部变量,引用内部变量isa的inst联合体,引用inst联合体中的val字段.

该宏在INSTPAT宏的定义中使用,用于在pattern_decode函数之后,检测当前执行指令是否与当前执行的模式匹配中的指令格式匹配.这里的发挥的作用就是使用但前指令的二进制串.

INSTPAT_MATCH宏是怎么其作用的?

使用变参系统.

其内部只调用了一个变参系统函数decode_operand.
decode_operand函数就是最深处的指令匹配函数,调用对应的do函数

该宏在INSTPAT宏中被调用:主要是在pattern_decode函数之后,进行匹配成功检查,如果检查通过,则表示但前指令的模式与这个INSTPAT宏定义的模式一致
那么就执行INSTPAT_MATCH宏.

从这个表象就可以说明:INSTPAT_MATCH是最深处的指令字段内模式匹配函数,调用该函数时可以明确:指令格式已经确定;指令正确;马上执行该指令;

INSTPAT_STAPT宏是怎么起作用的?

在项目中首先标识了模式匹配的开始位置.这是最浅显的意思.

同时记录了跳转标签的地址(使用一个const void类型的双重指针来记录地址)

INSTPAT_STAPT宏的技术原理是什么?

使用宏定义,其中最重要的就是使用了concat宏.concat宏的技术原理见另篇:C-PreProcessor-Token-Pasting-Operator.md

const void ** _instpat_end声明了一个参数双重指针_instpat_end, 用于记录跳转标签的地址.

在INSTPAT中,if语句块里最后使用了:

1
goto *(__instpat_end); \

这里就是对应的跳转语句.访问了__instpat_end_标签的地址.

INSTPAT_END宏是怎么起作用的?

就是一个将concat宏包装的一个外层宏.

但是在concat宏的后面添加了冒号.

这里就是起到标签地址的作用.

使用goto-标签的语法,目的就是为了避免冗余的模板指令模式匹配.在匹配成功之后,及时跳转基本语句块,增加能效.

INSTPAT_END宏的技术原理是什么?

INSTPAT_END宏的技术原理同concat宏的技术原理一样,见另篇:C-Preprocessor-Token-Pasting-Operator.md

使用的INSTPAT_START和INSTPAT_END宏,都是需要一个参数的,但是在inst.c文件decode_exec函数中使用的时候没有传入任何的参数.这里应该是一个留出来的扩展

concat宏的技术原理

另见篇:C-preprocessor-token-pasting-operator.md

INSTPAT宏详解

在inst.c中使用多个INSTPAT宏来定义不同的指令类型(当前指令会随着inst.c文件中的decode_exec函数中定义的序列指令模式挨个执行(匹配))

INSTPAT宏中首先定义了key,mask,shift.至今,我发现没有使shift结果不为0的指令.这里可能是一个扩展.

INSTPAT宏使用了变参系统,在使用INSTPAT宏时,传入了指令模式串,指令名称,指令类型,指令的动作.

INSTPAT调用pattern_decode函数,传入指令模式串和指令模式串长度,已经key,mask,shift地址.

对于pattern_decode和macro宏的讲解,现在回到了if基本块.
在这里对Decode类型s变量进行shift然后和掩码&一下,和键码对比.为了检测该指令是否就是这个指令模式.

如果是,那么就太好了,直接进入if语句块,指令INSTPAT_MATCH宏,执行完INSTPAT_MATCH宏之后,执行goto语句,goto语句我已经讲解过,在关于INSTPAT_START,INSTPAT_END宏中就是的.

pattern_decode函数是干嘛的?技术原理是什么?

pattern_decode定义在include/cpu/decode.h函数中,是由INSTPAT宏调用的.其作用就是为了检查但前的指令和但前正在执行的指令模式是否匹配.然后用于下一步的INSTPAT宏的if语句基本块.

pattern_decode的定义是一个内联函数,在预编辑器处理的过程中,会在INSTPAT宏中直接展开.

接受指令模式串和指令模式串长度,以及key,mask,shift的地址.

在pattern_decode在处理指令模板和指令是否匹配时,是使用了macro宏,使用该宏做了一个"检测单字符是否匹配"的过程.

macro(i)的作用和技术原理?

将指令模板串中进行一个处理(将不影响指令功能的无关位置,使用掩码(置为0)来处理,将关键位置,记录在键码变量中(置为1).对于shift,Manual中有讲(Read the fxxking manual)可以得出,和我目前的活应该不相干,这是编译器的活儿

在使用时,是直接使用的是macro64(0);

这里使用二分分开来检测一个64位指令的每一个位.

最后退出.

回到了INSTPAT宏的if语句.

关于INSTPAT_MATCH宏

定义在src/isa/riscv32/inst.c文件中的INSTPAT_MATCH宏.这是深层次的指令匹配宏.

直接调用decode_operand函数.

1
static void decode_operand(Decode *s, int *rd, word_t *src1, word_t *src2, word_t *imm, int type)

decode_operand函数讲解:见decode_operand了解细节

使用__VA_ARGS__来做指令实际计算操作

关于__VA_ARGS__,参考另外一篇文章:预编译变参系统与预编译器粘结运算符以及"回调宏"的应用


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. All the images used in the blog are my original works or AI works, if you want to take it,don't hesitate. Thank you !