RISC-V没有条件码,如何处理32位加法溢出?如何处理32位减法借位?以及如执行64位数的加减法?

mingdu.zheng at gmail dot com
https://blog.csdn.net/zoomdy/article/details/82949816

64位加法

写一段64位加法的程序:

uint64_t add64u(uint64_t a, uint64_t b)
{uint64_t c;c = a + b;return c;
}

以RV32架构编译,然后反汇编:

$ riscv64-unknown-elf-gcc -O2 -c -o 64.o -march=rv32i -mabi=ilp32 -Wall 64.c
$ riscv64-unknown-elf-objdump -d -M no-aliases 64.o

反汇编结果如果:

00000000 <add64u>:0:   00050793            addi    a5,a0,04:   00c50533            add a0,a0,a28:  00f537b3            sltu    a5,a0,a5c:  00d585b3            add a1,a1,a310: 00b785b3            add a1,a5,a114: 00008067            jalr    zero,0(ra)

按照函数调用规约,a0a1存储第一个64位入参aa2a3存储第二个64位入参b,返回值c存储在a0a1,低字节存储在编号较低的寄存器。

  • 0: 00050793 addi a5,a0,0: 首先保存一下a的低32位,后面还要用。
  • 4: 00c50533 add a0,a0,a2a的低32位加上b的低32位。
  • 8: 00f537b3 sltu a5,a0,a5: 比较c的低32位和a的低32位,如果c的低32位比a的低32位小,那么说明加法溢出了,必须产生进位,此时a5寄存器赋值1;否则没有加法进位,a5寄存器赋值0。也就是说a5寄存器存储的是低32位加法的进位标志。从这可以看出SLTU指令的作用了吧。
  • c: 00d585b3 add a1,a1,a3a的高32位加上b的高32位。
  • 10: 00b785b3 add a1,a5,a1:低32位的进位标志存储在a5寄存器了,再加上进位标志。

RISC-V 没有进位标志位,它通过是否小于加数来判断是否产生进位,然后再把进位累加进最终的当中。利用了大于任意一个加数这条数学规律。

和 Cortex-M 对比

相比之下,Cortex-M生成的指令要少得多,因为Cortex-M有进位标志,还有带进位的加法指令。

00000000 <add64u>:0:   1880        adds    r0, r0, r22:    eb41 0103   adc.w   r1, r1, r36:    4770        bx  lr

那么,这能证明 Cortex-M 更优秀吗?一般使用32位处理器的应用不会有大量的64位运算,如果有大量64位运算的话,那应该改用64位处理器。RISC-V的设计哲学是让硬件尽可能的简单,剔除进位标志和带进位加法指令同样也是基于同样的设计哲学,硬件设计得简单,那么在同样的工艺下,可以达到更高的主频,同样的主频下消耗更少的能量。所以,别看 Cortex-M 在64位运算上占了便宜,综合起来,谁输谁赢真不一定。

其它64位运算

还有64位的有符号数加法,以及64位的减法,源代码如下:

int64_t add64s(int64_t a, int64_t b)
{return a + b;
}uint64_t sub64u(uint64_t a, uint64_t b)
{return a - b;
}int64_t sub64s(int64_t a, int64_t b)
{return a - b;
}

反汇编如下:

00000018 <add64s>:18:  00050793            addi    a5,a0,01c:  00c50533            add a0,a0,a220: 00f537b3            sltu    a5,a0,a524: 00d585b3            add a1,a1,a328: 00b785b3            add a1,a5,a12c: 00008067            jalr    zero,0(ra)00000030 <sub64u>:30:   00050793            addi    a5,a0,034:  40c50533            sub a0,a0,a238: 00a7b7b3            sltu    a5,a5,a03c: 40d585b3            sub a1,a1,a340: 40f585b3            sub a1,a1,a544: 00008067            jalr    zero,0(ra)00000048 <sub64s>:48:   00050793            addi    a5,a0,04c:  40c50533            sub a0,a0,a250: 00a7b7b3            sltu    a5,a5,a054: 40d585b3            sub a1,a1,a358: 40f585b3            sub a1,a1,a55c: 00008067            jalr    zero,0(ra)

RV32执行64位的加减法及SLT/SLTU的作用相关推荐

  1. 64位内核第三讲,Windbg的使用.以及命令

    目录 一丶驱动的调试. 1.线程 2.断点 3.内存查看命令 4.修改内存命令 5.栈相关操作命令 6.进程线程命令(内核命令) 一丶驱动的调试. 编写驱动免不了调试.所以这里介绍一下WinDbg的常 ...

  2. 计算机怎么弄64位,64位系统怎么装?安装64位系统教程

    电脑怎么安装64位系统?一些用户由于内存比较小,是安装了32位windows系统,现在内存增加到4G甚至更大,此时需要安装64位系统,才能更好的识别使用大内存.不过有用户不清楚如何安装64位系统,64 ...

  3. 64位应用程序的开发

    在高端领域,Sun.IBM.Intel和HP等公司一直热衷于64位平台.现在,全球有80%以上的企业,其关键业务都运行在64位大型主机上,大多数企业级的应用程序都是基于64位平台进行开发的. 2003 ...

  4. 64位计算机不能运行32位游戏,我想玩个游戏,仅支援64位系统,我家电脑win7 32位的,怎么办求解决方法...

    我想玩个游戏,仅支援64位系统,我家电脑win7 32位的,怎么办求解决方法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...

  5. 在i3 Cpu上允许64位系统

    今天想在64位系统上运行一些代码,看和32位系统有什么差别.然后准备在虚拟机中安装一个64位的Fedora系统,但是开始之后却提 示:this kernel requires an x84-84cpu ...

  6. oracle11g 下载图解,oracle11g 64位客户端下载 附安装教程

    软件大小: 587.18 MB 更新时间: 2016-03-22 软件语言: 简体中文 软件厂商: Home Page 软件等级: 软件类别: 国产软件 / 免费软件 / 编程工具 官方网站: 应用平 ...

  7. VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案

    VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作.解决方案 参考文章: (1)VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法 ...

  8. 如何确定我的Python Shell是在OS X上以32位还是64位模式执行?

    我需要一种方法,从外壳程序中告诉外壳程序处于哪种模式. 我尝试查看平台模块,但似乎只告诉您"有关可执行程序所使用的位架构和链接格式"的信息:尽管二进制文件编译为64位(我在OS X ...

  9. Zynq UltraScale + MPSoC示例设计 - 在64位Linux上执行32位应用程序

    目录 官方说明连接:https://china.xilinx.com/support/answers/66636.html 描述 解决方案 官方说明连接:https://china.xilinx.co ...

最新文章

  1. Word的常用功能设置(
  2. 如何接入虹软免费人脸识别SDK
  3. 实现线程栈初始化(RTT)
  4. SAP的标准对话框函数
  5. 通过BI专题场景,深度剖析制造行业如何提高设备利用率?
  6. oracle中备份package源码
  7. 冬奥网络安全卫士被表彰突出贡献,探寻冬奥背后的安全竞技
  8. Python二级笔记(2)
  9. TiFlash:并非另一个 T + 1 列存数据库
  10. 腾讯企业邮箱外域邮件发送失败原因及其解决方案
  11. 深入理解SpringBoot的过滤条件--AutoConfigure
  12. web服务器python_一个简单的web服务器(python)
  13. Julia: 1.0 ! “startup.jl” 的妙用, 设置IDE启动时,自动运行某文件或某行命令
  14. ADS EM MODEL 问题
  15. 权限管理模块数据库设计
  16. (转载)BitCometTracker使用指南
  17. java integer转成负数_Java 十进制和十六制之间的转化(负数的处理)
  18. json rpgmv 加密_RPGMakerMV探秘01-文件结构
  19. 无盘服务器接几根网线,设置无线路由器需要几根网线_安装路由器需要几根网线?-192路由网...
  20. CreateFontIndirect

热门文章

  1. 0基础小白学python好学吗-零基础适合学Python吗?小白能否学会Python?
  2. 4K高清,为什么离我们还是那么远!?
  3. mysql数据库索引的创建语句
  4. 小艺人黄鑫洋受邀参加巴黎时装周儿童单元武汉站
  5. oppor11点android版本,OPPO R11有几个版本 OPPO R11巴萨版与普通版区别 (全文)
  6. 逼格高,含金量大的比赛究竟有哪些?
  7. 消息队列的实现原理和ActiveMQ详解
  8. 以太坊区块广播、fetcher消息接收过滤、downloader的Total Difficulty的代码流程解析
  9. cocos 坐标系的转换
  10. eBay测评自养号,卖家如何运营?