RISC-V技术论坛
直播中

哈哈哈

11年用户 863经验值
擅长:可编程逻辑
私信 关注
[经验]

通过内联汇编调用乘法指令mulh\\mulhsu\\mulhu

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开始,依次表示输出操作数和输入操作数,如果输出操作数比较多则数字依次增加,输入操作数同理。




更多回帖

发帖
×
20
完善资料,
赚取积分