查看: 1825|回复: 0
收起左侧

RISC-V加载常量(立即数或地址)

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2020-8-24 10:56:16 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2020-8-27 13:49 编辑

    RISC-V使用I-type格式的指令和U-type格式的指令加载立即数,I-type格式包含12位立即数,U-type格式包含20位立即数,而且这20位是加载到寄存器的高20位的。


    所以,一条I-type指令加上一条U-type指令就可以加载32位的常量,包括32位的立即数或内存地址。有些情况下只需要一条I-type指令,或者一条U-type指令就可以了。


    mingdu.zheng at gmail dot com

    I-type和U-type指令格式定义如下:



    国内芯片技术交流-RISC-V加载常量(立即数或地址)risc-v单片机中文社区(1)


    小常量

    这里的小常量是指 -2048 ~ 2047 之间的常量,I-type格式的12位立即数是表示成有符号数的,所以其立即数能表示的范围就是 -2048 ~ 2047 ,这个范围内的小常量只需要使用一条 I-type指令就可以了,不需要额外的U-type指令。例如加载常量1234到寄存器x14:


    1. addi        x14,x0,1234
    复制代码

    低12位为零的32位常量

    这种常量值需要U-type指令,不需要额外的I-type指令,例如加载常量0x12345000:


    1. lui                x14,0x12345
    复制代码


    其它32位常量

    除了上述两种特殊情况之外的其它32位常量,都需要I-type指令和U-type指令配合加载常量,例如加载常量0x12345678:


    1. lui                x15,0x12345 # 首先加载常量的高20位
    2. addi                x15,x15,0x678 # 再将低12位加到高20位
    复制代码


    和 Cortex-M 对比

    相比之下,Cortex-M 加载32位常量,通常要把常量存储在代码段,然后通过LDR指令从代码段读取。RISC-V加载32位常量使用2条指令,占用8个字节;Cortex-M加载常量使用1条指令和1条常量,占用6个字节或8个字节(有16位长的LDR指令,也有32位长的LDR指令)。RISC-V使用2条指令,只需要访问指令总线,没有存储器加载的延时和总线冲突,Cortex-M因为要从代码段加载,既要访问指令总线也要访问数据总线,会有存储器加载延时和可能的总线冲突。


    RV32 加载64位常量

    在RV32架构下,需要两个寄存器来存储64位数,理论上讲可以使用两组I-type和U-type组合就可以加载64位常量,例如加载常量0x1234567812345678:

    1. # 低32位存储在x14
    2. lui                x14,0x12345
    3. addi                x14,x14,0x678
    4. # 高32位存储在x15
    5. lui                x15,0x12345
    6. addi                x15,x15,0x678
    复制代码


    但是,目前GCC给出的编译结果如下:


    1. lui                x14,0x8000
    2. lw                x12,0(x14)
    3. lw                x13,4(x14)
    复制代码


    首先把64位常量存储在代码段,然后使用lw指令加载。


    RV64 加载64位常量

    也是先把64位常量存储在代码段,然后使用ld指令加载,RV64使用1个寄存器就可以存储64位数了,所以这回只需要加载一次:


    1. lui                x14,0x8000
    2. ld                x14,0(x14)
    复制代码
    本篇完,感谢关注:RISC-V单片机中文网




    上一篇:国产RISC-V开发板RV-STAR初体验
    下一篇:CKB-VM:连接硬件和软件的桥梁——Nervos@RISC-V Roadshow
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-20 14:44 , Processed in 0.668309 second(s), 48 queries .

    快速回复 返回顶部 返回列表