这是我们队伍的第2篇帖子
1.
蜂鸟E203内核支持的乘法指令有四种(不含融合指令),分别为mul、mulh、mulhu与mulhsu。它们的汇编语言格式如下:
mul rd, rs1,
rs2
将两个32位整数相乘,取低32位(32位有符号数相乘与无符号数相乘低32位相同)
mulh rd, rs1,
rs2
将两个32位有符号整数相乘,取高32位
mulhu rd,
rs1, rs2
将两个32位无符号整数相乘,取高32位
mulhsu rd,
rs1, rs2
将rs1当作有符号数,rs2当作无符号数相乘,取高32位
2.
由于C语言中的乘法符号,在经过软件编译后生成的汇编指令位mul指令,因此,想要验证mulh、mulhu与mulhsu指令,不能直接验证,需要其他方法。因此,我们想到了在C语言中嵌入内联汇编,分别生成三条指令的接口函数,之后便只需在C语言中调用者三中函数便可执行mulh、mulhu与mulhsu指令。在C语言中嵌入内联汇编的过程如下:
首先,需要遵循GCC内联汇编的语法规则,格式如下:
asm volatile (
汇编指令列表
:输出操作数 //非必需
:输入操作数 //非必需
:可能影响的寄存器或存储器 //非必需
);
对于常见的R型指令,汇编指令列表,即.insn 的使用格式如下:
.insn r
opcode, func3, func7,
rd, rs1, rs2
因此,三条指令的内联汇编如下图所示:
其中指令中%后的数字含义如下:数字从0开始,依次表示输出操作数和输入操作数,如果输出操作数比较多则数字依次增加,输入操作数同理。