MUL(x86)/MULT(mips)在不同的汇编语言中均表示乘法。对于程序员来说,它是一个黑匣子。我对CPU如何实现乘法感兴趣,而不考虑架构。假设我的寄存器中有两个16位值,并且我是CPU,因此必须使用我拥有的其他位操作指令(and、or、xor、not、shl、shr等)来实现MUL。我该怎么办?
MUL(x86)/MULT(mips)在不同的汇编语言中均表示乘法。对于程序员来说,它是一个黑匣子。我对CPU如何实现乘法感兴趣,而不考虑架构。假设我的寄存器中有两个16位值,并且我是CPU,因此必须使用我拥有的其他位操作指令(and、or、xor、not、shl、shr等)来实现MUL。我该怎么办?
imul eax, ecx
在典型的x86 CPU上(从Pentium Pro开始)解码为单个uop;对于标量整数乘法,有一个单独的完全流水线执行单元。 (在某些AMD CPU之前的Ryzen之前,它不是完全流水线化的,例如Bulldozer系列可以每隔一个时钟周期启动一个imul
。)https://agner.org/optimize/。 对于大多数向量乘法操作,SIMD整数/ FP乘法器也是单个uop。 但是,英特尔会微代码他们的整数除法指令。 仍然有一个硬件除法器单元,但需要多个uop才能执行div
。 - Peter Cordescall
(分支和推送返回地址)这样的复杂指令才会解码为多个uop,或者像rep movsb
(memcpy)这样的疯狂操作。经常使用的整数ALU指令大多解码为单个uop。乱序预测执行并不会改变执行单元的实际构建方式;乱序执行机制存在的目的是通过在单个线程中找到ILP来保持执行单元的工作。是的,它与顺序流水线非常不同,但是无论您是微代码乘法还是具有专用HW,都与顺序与乱序执行大多数情况下无关。 - Peter Cordes