我需要在RISC-V上进行大数运算(加法和减法,但我将减法视为有符号加法),情况有些复杂。根据我在互联网上半小时的研究,我得到以下结论:
- RISC-V操作没有提供检查进位或溢出的手段。 - 这个决定是由于标志或其他处理方式会给乱序微体系结构增加很多复杂性的缘故。 - 相反,他们建议之后进行分支
- 对于无符号加法,可以使用单个bltu进行溢出处理。 - 如果已知一个操作数的符号,则有符号加法也可以相同处理 - 否则,需要执行两个检查(三个额外指令)
- 互联网上的人对此感到非常愤怒(我这里不会链接)。
据我所知,这些分支确实涵盖了大部分场景,除了一个:(有符号)大数加法。因为在那里,我们在热循环中命中最慢的检查路径。
我只知道一点关于ISA设计的知识,但为什么他们没有包括一个计算(a+b)>>32(实际上是进位)的指令呢?有点像乘法指令被分成mul和mulh一样。这将允许使用始终只有两个指令的所需计算。更强大的微体系结构甚至可以检测序列并只执行一次加法。
我是否错过了使这个指令过时(或等同于它)的一些技巧?它有任何主要缺点吗?我没有找到关于这个一般性话题的很多好文档。
- RISC-V操作没有提供检查进位或溢出的手段。 - 这个决定是由于标志或其他处理方式会给乱序微体系结构增加很多复杂性的缘故。 - 相反,他们建议之后进行分支
- 对于无符号加法,可以使用单个bltu进行溢出处理。 - 如果已知一个操作数的符号,则有符号加法也可以相同处理 - 否则,需要执行两个检查(三个额外指令)
- 互联网上的人对此感到非常愤怒(我这里不会链接)。
据我所知,这些分支确实涵盖了大部分场景,除了一个:(有符号)大数加法。因为在那里,我们在热循环中命中最慢的检查路径。
我只知道一点关于ISA设计的知识,但为什么他们没有包括一个计算(a+b)>>32(实际上是进位)的指令呢?有点像乘法指令被分成mul和mulh一样。这将允许使用始终只有两个指令的所需计算。更强大的微体系结构甚至可以检测序列并只执行一次加法。
我是否错过了使这个指令过时(或等同于它)的一些技巧?它有任何主要缺点吗?我没有找到关于这个一般性话题的很多好文档。