CPU如何执行像MUL/MULT这样的指令?

10

MUL(x86)/MULT(mips)在不同的汇编语言中均表示乘法。对于程序员来说,它是一个黑匣子。我对CPU如何实现乘法感兴趣,而不考虑架构。假设我的寄存器中有两个16位值,并且我是CPU,因此必须使用我拥有的其他位操作指令(and、or、xor、not、shl、shr等)来实现MUL。我该怎么办?

2个回答

9
在维基百科上,Multiplication ALU列出了数字电路中进行乘法的不同方法。
我在大学时曾参与一个项目,使用Verilog为DEC Alpha处理器添加SIMD指令。我们实现了Wallace树乘法器,主要原因是它可以在固定的周期内运行,并且易于流水线化。
报道,在真实的CPU ALU中,包括现代x86,几乎普遍使用Dadda乘法器。像Wallace乘法器一样,它也可以通过固定延迟进行流水线化。
编辑:您提到使用其他位操作指令,在现代处理器上,乘法不会像这样微编码;这将会非常慢,处理器在基准测试中会被击败。

我以为CPU出于效率原因不会调用自己的指令。但是我没有其他表达方式,因为我迄今为止接触过的最低层次就是汇编语言。感谢您的帮助! - George
有时候它们确实会这样做。x86是一种复杂的ISA,具有一些非常奇怪的指令。这些指令被翻译成内部微代码程序。请查看http://en.wikipedia.org/wiki/File:Intel_Nehalem_arch.svg,您将看到一个复杂的解码单元和一个微代码顺序器,它可以执行此操作。 - Michael
在现代CPU上,情况甚至比这更糟糕——由于乱序执行、分支预测、超线程等技术以及微码的存在,可以说x86 ISA运行在一个由微码和电路实现的虚拟机中。但是几乎不需要担心这个问题... - Jeff Shannon
@JeffShannon: imul eax, ecx 在典型的x86 CPU上(从Pentium Pro开始)解码为单个uop;对于标量整数乘法,有一个单独的完全流水线执行单元。 (在某些AMD CPU之前的Ryzen之前,它不是完全流水线化的,例如Bulldozer系列可以每隔一个时钟周期启动一个imul。)https://agner.org/optimize/。 对于大多数向量乘法操作,SIMD整数/ FP乘法器也是单个uop。 但是,英特尔会微代码他们的整数除法指令。 仍然有一个硬件除法器单元,但需要多个uop才能执行div - Peter Cordes
太长不看:只有像call(分支和推送返回地址)这样的复杂指令才会解码为多个uop,或者像rep movsb(memcpy)这样的疯狂操作。经常使用的整数ALU指令大多解码为单个uop。乱序预测执行并不会改变执行单元的实际构建方式;乱序执行机制存在的目的是通过在单个线程中找到ILP来保持执行单元的工作。是的,它与顺序流水线非常不同,但是无论您是微代码乘法还是具有专用HW,都与顺序与乱序执行大多数情况下无关。 - Peter Cordes

4
这个页面展示了一个4*4组合乘法器的逻辑门。你可以从这里开始学习。链接 这是某人的实验室,他们描述了如何使用AND门和全加器构建一个16位乘法器,每个乘法器都由4个4位乘法器组成。包括完整的设计、芯片布局和仿真波形。链接

3
两个链接现在都失效了 :/ - Peter Cordes
1
它们仍然可以在Wayback Machine上找到。https://web.archive.org/web/20091212185618/http://www-unix.ecs.umass.edu/~smckenna/ https://web.archive.org/web/20200216192105/http://www2.elo.utfsm.cl:80/~lsb/elo211/aplicaciones/katz/chapter5/chapter05.doc5.html - Siim Liiser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接