在MIPS三个整数乘法(Multiplication of three integers in MI

2019-10-20 10:48发布

我想在MIPS乘三个整数。 我首先想到的是乘以第一和第二个,之后与第三个结果(像我加做的)。 但结果是在给定的HILOW 64位。 那么,怎样才能用我的第三个因素相乘?

:32位整数* 32位整数= 64位整数 。 什么(在理论上)将给予如下:

32位int * 32位int * 32位int =&

96位? 128?

感谢您的提示。

Answer 1:

乘以n位数目与m位的数产生一个(N + M)比特数。 所以乘以3个32位的数产生96位乘积

假设三个数为a,b和c,我们有以下结果

  a*b  =   ABH*2³² + ABL
c(a*b) = c(ABH*2³² + ABL)
       = c*ABH*2³² + c*ABL
       = (CABH_H*2³² + CABH_L)*2³² + (CABL_H*2³² + CABL_L)
       = CABH_H*2⁶⁴ + (CABH_L + CABL_H)*2³² + CABL_L

其中H和L被存储在HI和LO分别寄存器结果的高和低的部分。 这里由2 32和2 64的乘法将由分别32和64左移来代替。

因此,在MIPS32如果A,B和C都存储在$ S0,S1 $ $和S2,我们可以算一算,如下

multu   $s0, $s1        # (HI, LO) = a*b
mfhi    $t0             # t0 = ABH
mflo    $t1             # t1 = ABL

multu   $s2, $t1        # (HI, LO) = c*ABL
mfhi    $t4             # t4 = CABL_H
mflo    $s7             # s7 = CABL_L

multu   $s2, $t0        # (HI, LO) = c*ABH
mfhi    $s5             # s5 = CABH_H
mflo    $t3             # t3 = CABH_L

addu    $s6, $t3, $t4   # s6 = CABH_L + CABL_H
sltu    $t5, $s6, $t3   # carry if s6 overflows
addu    $s5, $s5, $t5   # add carry to s5
# result = (s5 << 64) | (s6 << 32) | s7

结果存储在元组($ S5,S6 $,$ S7)

物联网将在MIPS64简单得多:

mul(unsigned int, unsigned int, unsigned int):
        multu   $4,$5
        dext    $6,$6,0,32
        mfhi    $3
        mflo    $2
        dins    $2,$3,32,32
        dmultu  $6,$2
        mflo    $3
        j       $31
        mfhi    $2

下面是一些输出样本汇编GCC上Godbolt

你可能需要签署一些操作略作修改



文章来源: Multiplication of three integers in MIPS