全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

【RISC-V】li指令

时间:2022-11-18 10:12

人气:

作者:admin

标签: 指令  寄存器  RISC-V 

导读:可以将任意的32位数据或者地址加载到指定的寄存器中。...

RISC-V中有这样一条伪指令:

li a0, immediately

可以将任意的32位数据或者地址加载到指定的寄存器

在 RV32I中,它扩展到 lui 和/或 addi

li 何时扩展为 lui 或者 addi呢?又何时扩展为lui 和 addi呢?

我们观察lui 和 addi 的指令码即可得出结果

在这里插入图片描述

在这里插入图片描述

由上图可知,lui加载的立即数为高20位,addi加载的立即数为低12位

由此得出结论

  • li 加载的立即数范围为:0~4096 时,会扩展成 addi 指令

    li a0, immediately ⇒ addi a0, x0, imme

  • li 加载的立即数范围超过4096时,会扩展成 lui 指令addi 指令

    li a0, immediately 扩展成

    1、lui a0, (immediately >> 12)

    2、addi a0, a0, (immediately & 0xFFF)

  • li 加载的立即数范围超过4096时,并且低12位为0,会扩展成 lui 指令

    li a0, immediately

    扩展成

    lui a0, (immediately >> 12)


接上文,观察 lui指令addi指令 会得到这个结果:lui指令加载的立即数为无符号,无需注意。addi指令加载的为有符号数,这个需要考虑一下立即数的符号位

假如我们要加载大立即数到指定的寄存器,需要考虑两种情况

1、第11位为0

第11位为0,则指令:li a0, immediate 会直接扩展成:

lui   a0,  immediate >> 12
addi  a0, a0, (immediate & 0xFFF)

2、第11位为1

第11位为1,此时 li a0, immediate 就不会扩展成

lui   a0,  immediate >> 12
addi  a0, a0, (immediate & 0xFFF)

而是扩展成

lui   a0,  ((immediate >> 12) + 1)
addi  a0, a0, ((immediate & 0xFFF) - 2^12)

解释一下:

addi指令所加载的立即数的第11位为1时,这个立即数是符号扩展的,因此加数将为负数。这意味着除了添加常量的最右边11位

之外,我们还需要减去2^12。为了弥补这个错误,只需将lui 加载的常量添加一个1,因为 lui 常量缩小了 2 ^12倍

例如:将 0xE76 加载到寄存器a0中

答:

lui   a0,  0x01
addi  a0, a0, (0xE76 - 4096)

代码实现

#define immediate  XXXX

uint32_t MSB, LSB;
MSB = immediate >> 12;
LSB = immediate & 0xFFF;

if (MSB == 0) {
	if (LSB & 0x800) {
		asm volatile("lui a0, 0x01"); 
		asm volatile("addi a0, a0, LSB - 4096"); 
	} else {
		asm volatile("addi a0, x0, LSB"); 
	}
} else {
	if (LSB & 0x800) {
		asm volatile("lui a0, MSB + 0x01"); 
		asm volatile("addi a0, a0, LSB - 4096"); 
	} else {
		asm volatile("lui a0, MSB"); 
		asm volatile("addi a0, x0, LSB"); 
	}
}

审核编辑:汤梓红

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信