【问题标题】:Multi-Precision Arithmetic on MIPSMIPS 上的多精度算术
【发布时间】:2011-02-10 14:46:37
【问题描述】:

我只是想在本机 MIPS 上实现多精度算术。假使,假设 一个 64 位整数在寄存器 $12 和 $13 中,另一个在寄存器 $14 和 $15 中。 这笔款项将存放在 10 美元和 11 美元的寄存器中。 64 位整数的最高有效字在偶数寄存器中找到,最低有效字在奇数寄存器中找到。它说,在互联网上,这是最短的实现方式。

addu  $11, $13, $15    # add least significant word
sltu  $10, $11, $15    # set carry-in bit 
addu  $10, $10, $12    # add in first most significant word
addu  $10, $10, $14    # add in second most significant word

我只是想仔细检查一下我的理解是否正确。 sltu 检查是否 两个最低有效词的总和小于或等于其中之一 操作数。如果是这种情况,那么是否发生了进位,对吗?

检查两个最重要的相加时是否发生进位 单词并将结果存储在 $9 我必须做的:

sltu  $9, $10, $12    # set carry-in bit 

这有意义吗?

【问题讨论】:

  • 我建议通过在 SLTU 之前添加高半部分然后添加进位来创建更多 ILP,因此超标量 MIPS 可以与低半部分 addusltu 从低半部分生成结转。您的版本有一个运行所有 4 条指令的依赖链,因此延迟不会超过 4 个周期;我的会缩短到 3 个周期。

标签: math assembly mips bigint


【解决方案1】:

sltu 检查两个最低有效字的和是否小于或等于其中一个操作数。

不完全是:如果两个最低有效字的总和严格小于操作数之一(被视为 32 位无符号值),则将 $10 设置为 1;如果总和等于或大于该操作数,则为 0。

如果是这种情况,那么是否发生了进位,对吗?

是的。

考虑将 b 的各种可能值添加到某个特定值 a(其中一切都是无符号的 32 位值)时会发生什么:

  • 如果没有发生溢出,我们必须有 a b a em>)。
  • b 的其余情况导致溢出;在这些情况下,实际总和必须是 0x100000000 a + 0xFFFFFFFF,当截断为 32 位时会得到 0 a - 1。

检查两个最重要的单词相加时是否发生进位并将结果存储在$ 9中 我必须这样做:

sltu $9, $10, $12 # set carry-in bit

不完全是。

这里的问题是您要添加两个 32 位值 并且 可能是最低有效单词总和的进位。例如,考虑存在进位且两个最高有效字均为 0xFFFFFFFF 的情况:总和将为 1+ 0xFFFFFFFF + 0xFFFFFFFF = 0xFFFFFFFF,因此进位不会设置(但应该设置)。

解决此问题的一种方法是在将$12 添加到$10 后检查进位,并在将$11 添加到该总和后再次检查。这些和中只有一个可以产生进位($12 + $10 仅在$12 为 0xFFFFFFFF 时溢出,因为$10 为 0 或 1;在这种情况下,和为 0,因此第二个和不能溢出为好)。

所以这可能(免责声明:已经很晚了,并且未经测试)可以解决问题:

addu $11, $13, $15
sltu $10, $11, $15  # carry from low word
addu $10, $10, $12
sltu  $9, $10, $12  # possible carry from high word (1)
addu $10, $10, $14
sltu  $8, $10, $14  # possible carry from high word (2)
or    $9,  $8,  $9  # carry in result if either (1) or (2) were true (can't both be true at once)

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多