根据我的阅读,它用于修复CPU中的错误而无需修改BIOS.根据我对汇编的基本知识,我知道汇编指令在内部由CPU分成微码并相应地执行.但是,在系统启动并运行时,intel会以某种方式提供访问以进行一些更新.
有人有更多的信息吗?有没有关于微码可以做些什么以及如何使用它们的文件?
编辑:我已经阅读了维基百科的文章:没有弄清楚我怎么能自己写一些,以及它会有什么用处.
我使用英特尔®架构代码分析器(IACA)发现了一些意想不到的东西(对我而言).
以下指令使用[base+index]寻址
addps xmm1, xmmword ptr [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)
根据IACA没有微熔丝.但是,如果我用[base+offset]这样的
addps xmm1, xmmword ptr [rsi]
Run Code Online (Sandbox Code Playgroud)
IACA报告它确实融合了.
英特尔优化参考手册的第2-11节给出了以下"可以由所有解码器处理的微融合微操作"的示例
FADD DOUBLE PTR [RDI + RSI*8]
Run Code Online (Sandbox Code Playgroud)
和Agner Fog的优化装配手册也给出了使用[base+index]寻址的微操作融合的例子.例如,请参见第12.2节"Core2上的相同示例".那么正确的答案是什么?
根据维基百科,x86是一个CISC设计,但我也听说过/它是RISC.什么是正确的?我还想知道为什么它是CISC或RISC.什么决定设计是RISC还是CISC?它只是微处理器所具有的机器语言指令的数量,还是有任何其他决定架构的特性?
这与此问题有关,但不一样:x86-64汇编的性能优化 - 对齐和分支预测与我之前的问题略有关系:无符号64位到双倍转换:为什么这个算法来自g ++
以下是一个不真实的测试用例.这种素性测试算法是不明智的.我怀疑任何真实世界的算法都不会执行如此多的小内循环(num大概是2**50的大小).在C++ 11中:
using nt = unsigned long long;
bool is_prime_float(nt num)
{
for (nt n=2; n<=sqrt(num); ++n) {
if ( (num%n)==0 ) { return false; }
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
然后g++ -std=c++11 -O3 -S生成以下内容,包含RCX n和包含XMM6 sqrt(num).请参阅我之前发布的剩余代码(在此示例中从未执行过,因为RCX永远不会变得足够大,不能被视为带符号的否定).
jmp .L20
.p2align 4,,10
.L37:
pxor %xmm0, %xmm0
cvtsi2sdq %rcx, %xmm0
ucomisd %xmm0, %xmm6
jb .L36 // Exit the loop
.L20:
xorl %edx, %edx
movq %rbx, %rax …Run Code Online (Sandbox Code Playgroud) 英特尔优化参考,根据第3.5.1节,建议:
"赞成单微操作指令."
"避免使用复杂指令(例如,输入,离开或循环),这些指令超过4个微操作并需要多个周期才能解码.请使用简单指令序列."
虽然英特尔自己告诉编译器编写者使用解码为少数微操作的指令,但我在他们的任何手册中都找不到任何东西,这解释了每个ASM指令解码的微操作数量!这些信息是否随处可用?(当然,我希望不同代CPU的答案会有所不同.)
我正在对代码的性能关键部分进行微优化,并且遇到了指令序列(在AT&T语法中):
add %rax, %rbx
mov %rdx, %rax
mov %rbx, %rdx
Run Code Online (Sandbox Code Playgroud)
我以为我终于有一个用例xchg可以让我刮一个指令并写:
add %rbx, %rax
xchg %rax, %rdx
Run Code Online (Sandbox Code Playgroud)
然而,根据Agner Fog的指令表,我发现这xchg是一个3微操作指令,在Sandy Bridge,Ivy Bridge,Broadwell,Haswell甚至Skylake上有2个周期延迟.3个完整的微操作和2个周期的延迟!3微操作抛出了我的4-1-1-1的节奏和2周期延迟使得它比在最好的情况下原来的,因为在原来的并行执行可能最后2条指令差.
现在......我得知CPU可能会将指令分解为相当于以下内容的微操作:
mov %rax, %tmp
mov %rdx, %rax
mov %tmp, %rdx
Run Code Online (Sandbox Code Playgroud)
哪里tmp是匿名内部寄存器,我想最后两个微操作可以并行运行,因此延迟是2个周期.
鉴于寄存器重命名发生在这些微架构上,但对我来说这是以这种方式完成的.为什么寄存器重命名器不会交换标签?理论上,这将只有1个周期(可能是0?)的延迟,并且可以表示为单个微操作,因此它会便宜得多.
我不太想知道在每个平台上开发代码时程序员习惯于什么或他觉得更容易做的事情等方面的“小字”差异。我也对详细的物理差异不感兴趣核心(我不介意提及它们,如果它适合您的叙述,我只是不想专注于上述内容)
我只是在寻找为什么像 x86 这样的 CISC 架构优于 RISC 架构,或者不是?
我的意思是,如果您可以在降低复杂性 (RISC) 的情况下做所有事情,那么为什么要成为“复杂”(CISC)
有什么是 x86 可以做而 ARM 做不到的吗?如果什么都没有,那么为什么我们(历史上)费心开发 CISC 而没有专注于 RISC?
今天,ARM 似乎可以完成英特尔计算机所做的一切,他们甚至还有面向服务器的设计……
它让我叔叔感到震惊。。
根据我的阅读,IA-32架构有10个32位和6个16位寄存器.
32位寄存器如下:
16位寄存器如下:
但是,我找不到有关当前指令寄存器(CIR)或存储器缓冲寄存器(MBR)/存储器数据寄存器(MBR)的任何信息.这些寄存器是否被称为其他东西?这些寄存器是32位吗?
我假设它们是32位的,并且在这种架构下最常用的指令长度不超过4个字节.从观察来看,许多指令似乎都在4个字节以下,例如:
对于更长的指令,CPU将使用前缀代码和其他可选代码.较长的指令需要多个周期才能完成,这取决于指令长度.
我是否正确,因为有问题的寄存器长度为32位?IA-32架构中是否还有其他寄存器,我也应该注意这些寄存器?