- 主题:龙芯的 LoongISA 为什么乘法需要两条指令?
看了一下 LonngISA 的指令描述,一般来说,两个寄存器相乘,乘积结果是双倍寄存器宽度,同然用一对寄存器来存放结果。比如 MIPS 乘法结果放入 hi, lo 两个寄存器,传统x86 乘法结果放入 eax, edx 两个寄存器。原本以为龙芯也是类似,一条乘法指令结果放入一对相邻寄存器,比如: mul r4, r3, r2, 把两个寄存器 r3, r2 的乘积放入r4 和r5(偶数号寄存器连同其后紧邻的一个寄存器),这样似乎非常自然。
然而 LoongISA 却不这样,非得用两条乘法指令才行:
mul r4, r3, r2;
mulh r5, r3, r2
命名一次乘法就得到结果,为什么非得要两条乘法指令才能得到完整的积。这种设计非常令人费解。实际中谁也不会有计算乘法后只需要乘积的高半部分或者低半部分的需求,有时如果确知高半部分为0,那当然只需要低半部分就够了。但是实现怎能知道呢?
--
FROM 218.16.203.*
抄MIPS或RISCV的
--
FROM 59.109.147.*
只用低半部分很常见。
int a, b, c;
c = a * b;
编译器只需要生成低32-bit的指令就行
【 在 quene 的大作中提到: 】
: 看了一下 LonngISA 的指令描述,一般来说,两个寄存器相乘,乘积结果是双倍寄存器宽度,同然用一对寄存器来存放结果。比如 MIPS 乘法结果放入 hi, lo 两个寄存器,传统x86 乘法结果放入 eax, edx 两个寄存器。原本以为龙芯也是类似,一条乘法指令结果放入一对相邻寄存器,比如: mul r4, r3, r2, 把两个寄存器 r3, r2 的乘积放入r4 和r5(偶数号寄存器连同其后紧邻的一个寄存器),这样似乎非常自然。
: 然而 LoongISA 却不这样,非得用两条乘法指令才行:
: mul r4, r3, r2;
: ...................
--
FROM 45.32.65.*
如果是这样的话,那只用高半部分的指令就毫无意义了。要么只用低板部分,要么就用
全部。这样的话应该设计两条指令:一个是只有乘积的低半部分,一个是有成绩的全部。
事实上有全部了当然就有低半部分了,无非浪费一个寄存器而已。这么说来有一条保留
全部乘积乘法指令就够了。其它的处理器基本都是这么设计的。
而龙芯用两条指令分别计算乘积的低半部和高半部,就显得极为不伦不类,而且毫无逻辑。
要么传统方法一条指令计算全部积,顶多再加上一条指令只计算乘积的低半部。两条指令
分别计算高半部和低半部,实在令人费解。
【 在 MegaStone 的大作中提到: 】
: 只用低半部分很常见。
: int a, b, c;
: c = a * b;
: ...................
--
FROM 218.16.203.*
好像是抄RISCV 的,但RISCV 为什么又要这么做呢?似乎risc 允许硬件实现的时候把两条指令当成一条指令。
【 在 lukeff 的大作中提到: 】
: 抄MIPS或RISCV的
--
FROM 218.16.203.*
只用高半部分也是有应用的。定点小数乘法,就是 (mul 0.X 0.Y),结果的有效数字,即小数点后要的部分就是取 XY 乘积的高半部分(可能还会移位),我单位做的DSP有这样的指令。
我只是说一下可能的应用,不代表LoongArch是这么想的。
【 在 quene (秦岭) 的大作中提到: 】
: 如果是这样的话,那只用高半部分的指令就毫无意义了。要么只用低板部分,要么就用
: 全部。这样的话应该设计两条指令:一个是只有乘积的低半部分,一个是有成绩的全部。
: 事实上有全部了当然就有低半部分了,无非浪费一个寄存器而已。这么说来有一条保留
: ...................
--
修改:ArchLinux FROM 59.109.218.*
FROM 59.109.218.*
既然是抄RISCV 的, 为什么不直接搞riscv?
干嘛又抡个轮子? 强调国产?
【 在 quene 的大作中提到: 】
: 好像是抄RISCV 的,但RISCV 为什么又要这么做呢?似乎risc 允许硬件实现的时候把两条指令当成一条指令。
--
FROM 117.147.21.*
这种译码方式一看就是物理寄存器堆的写口问题 指令能够双目的操作数的话直接一条就走了
--
FROM 124.64.17.*
你看看除法,也是山寨mips
MSA估计也没少参考
【 在 txgx 的大作中提到: 】
: 既然是抄RISCV 的, 为什么不直接搞riscv?
: 干嘛又抡个轮子? 强调国产?
:
: ...................
--
FROM 223.104.38.*
可以指定任意《寄存器对》存放全积结果。
对寄存器分配算法更友好。
两条指令在流水线内融合,看作一条。
汇编代码跟流水线微码有些区别。
【 在 quene 的大作中提到: 】
: 看了一下 LonngISA 的指令描述,一般来说,两个寄存器相乘,乘积结果是双倍寄存器宽度,同然用一对寄存器来存放结果。比如 MIPS 乘法结果放入 hi, lo 两个寄存器,传统x86 乘法结果放入 eax, edx 两个寄存器。原本以为龙芯也是类似,一条乘法指令结果放入一对相邻寄存器,比如: mul r4, r3, r2, 把两个寄存器 r3, r2 的乘积放入r4 和r5(偶数号寄存器连同其后紧邻的一个寄存器),这样似乎非常自然。
: 然而 LoongISA 却不这样,非得用两条乘法指令才行:
: mul r4, r3, r2;
: ...................
--
FROM 119.129.255.*