【指令仿真】解析一条指令
以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指令仿真
查看16道真题和解析