【指令仿真】解析一条指令

以riscv32的《RISCV手册-开源指令集指南.pdf》以指令c_li 为例子

1、查看指令集定义,可以看到命令的识别码,imm,rd等设定

2、查看qemu内 target/riscv/insn16.decode 查找

# ./qemu/target/riscv/insn16.decode
# RV32/64C Standard Extension (Quadrant 1) 
addi 000 . ..... ..... 01 @ci
addi 010 . ..... ..... 01 @c_li
{
 illegal 011 0 ----- 00000 01 # c.addi16sp and c.lui, RES nzimm=0
 addi    011 . 00010 ..... 01 @c_addi16sp
 lui     011 . ..... ..... 01 @c_lui
}

3、查找c_li的格式

c_li指令遵循&i的参数格式

# ./qemu/target/riscv/insn16.decode
@c_sdsp    ... . .....  ..... .. &s      imm=%uimm_6bit_sd rs1=2 rs2=%rs2_5
@c_swsp    ... . .....  ..... .. &s      imm=%uimm_6bit_sw rs1=2 rs2=%rs2_5
@c_li      ... . .....  ..... .. &i      imm=%imm_ci rs1=0 %rd
@c_lui     ... . .....  ..... .. &u      imm=%imm_lui %rd
@c_jalr    ... . .....  ..... .. &i      imm=0 rs1=%rd

4、&i的参数格式,由imm,rs1,rd构成

此处的!extern

# ./qemu/target/riscv/insn16.decode
# Argument sets imported from insn32.decode:
&empty                  !extern
&r         rd rs1 rs2   !extern
&i         imm rs1 rd   !extern
&s         imm rs1 rs2  !extern

5、根据参数格式,填充参数构成

# ./qemu/target/riscv/insn16.decode
@c_sdsp    ... . .....  ..... .. &s      imm=%uimm_6bit_sd rs1=2 rs2=%rs2_5
@c_swsp    ... . .....  ..... .. &s      imm=%uimm_6bit_sw rs1=2 rs2=%rs2_5
@c_li      ... . .....  ..... .. &i      imm=%imm_ci rs1=0 %rd
@c_lui     ... . .....  ..... .. &u      imm=%imm_lui %rd
@c_jalr    ... . .....  ..... .. &i      imm=0 rs1=%rd

6、参数格式

6.1 参数1

%imm_ci :第12bit,从第2bit开始5位bit;因为此处是s1,所以会使用sextract,对首位进行符号扩展

# Immediates:
%imm_ci        12:s1 2:5
%nzuimm_ciw    7:4 11:2 5:1 6:1   !function=ex_shift_2
%uimm_cl_q     10:1 5:2 11:2      !function=ex_shift_4
%uimm_cl_d     5:2 10:3           !function=ex_shift_3
%uimm_cl_w     5:1 10:3 6:1       !function=ex_shift_2

6.2 参数2

%rd: 从bit7开始5位bit

# Fields:
%rd        7:5
%rs1_3     7:3                !function=ex_rvc_register
%rs2_3     2:3                !function=ex_rvc_register
%rs2_5     2:5

6.3 参数3

rs1:值永恒为0

QEMU指令仿真 文章被收录于专栏

riscv指令仿真

全部评论

相关推荐

2025-12-10 19:50
山西大学 测试工程师
点赞 评论 收藏
分享
2025-12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务