关于我
欢迎来到我的博客!这里汇集了我对编程和技术的洞见和总结。本站内容分为几个主要类别,涵盖从具体技术实现到编程理念的广泛话题。
主要内容分类
- 项目工程:深入探讨技术的实现细节和理解。
- C/C++:围绕C/C++语言的技术点和编程技巧进行详细总结。
- 程序员哲学:分享程序员在职业生涯中应该具备的哲学理念和思考方式。
想要了解更多具体内容,您可以访问文章分类页面。
联系我
如果您有任何问题或想要交流,欢迎通过关于页面与我联系。
感谢您的阅读和支持,希望我的博客能为您的技术旅程带来帮助!
decode_operand函数
使用BITS宏,从s中的指令二进制串抓取rs1,rs2以及rd的二进制值.
然后根据传入的type类型进行switch跳转,然后执行流水线中的各个操作:
src1R宏,这个宏就是读取rs1存储的寄存器值.
src2R宏,读取rs2存储的寄存器值.
关于src(x)R宏中,调用R宏来做最底层的读取操作.
或调用immI宏:读取I型指令立即数字段.
immU宏:读取U型指令立即数字段.
immS宏:读取S型指令立即数字段.
关于imm(X)宏中调用SEXT宏以及BITS宏来做最底层的操作.
decode_operand函数结束.
关于imm(X)宏和SEXT宏,BITS宏
这些系列宏全部定义在include/macro.h文件中
BITS宏接受三个输入:x表示32位指令二进制串,hi表示高位,lo表示低位.
通过(x) >> (lo)
,将读取的字段放置最右端
通过& BITMASK((hi) - (lo) + 1)
, 将比hi还要高的所有二进制位全部置零.
1 | (hi) - (lo) + 1 |
表示要读取的字段的长度.
BITMASK是掩码,接受读取的字段长度,可以制造出一个该长度的"依靠"低位的掩码.
BITMASK中:
1 | 我们只需要一个32位的指令二进制串进行操作,为何要使用一个64位呢? |
_VA_ARGS_;
1 | 这里的分号会和代码块冲突. |
#define immB() do { *imm = (SEXT(BITS(i, 31, 31), 1) << 11) |
(BITS(i, 7, 7)) << 10 |
(BITS(i, 30, 25)) << 4 |
(BITS(i, 11, 8));} while(0)
1 |
|
INSTPAT(“??? ??? ??? 000 ??? 11000 11”, beq , B, {s->dnpc = (src1 == src2)? (s->pc + (imm << 1)) :
s->dnpc;});
1 |
|
{R(rd) = ((int64_t)src1 * src2) >> 32);}
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 !