请教关于x86指令集译码的问题
麻烦有清楚的详细介绍一下,多谢!
x86 有个decode,负责吧不定长指令转成定长uops,然后在做类似于mips 之类的定长译
码。 不定长转uops部分,你可以理解成一个rom,每不定长指令选中一段地址,该地址包
括一系列uops,完成同样的功能。
如果我做的话
他大概想问不定长指令如何做的编码能读取的时候知道后面还有几个byte是现在指令的,或者
从当中随便取一个byte如何确定这个byte是一个指令的开始还是一个指令中间一段(这个可能不一定需要)
后面的方式我清楚,我不清楚如何能高效的将多个不定长的指令在一个指令包里面拆开。
例如:从cache里面取指过来的指令包为256bit,里面可能包括了5条变长指令,如何高效将这些指令拆开?
---------------------------------------------------------------------------------------
是的!
------------------------------------------------------------------------------------------
一般从第一条开始,译码得知当前指令长度;然后找第二条。如此往复,完成拆分。
x86译码uops 已经是x86为向前兼容背负的原罪了。
x86译码分若干阶段,如定指令边界,对齐,转ucop等阶段;
定指令边界的基本做法是一排(可能有4~8个)指令长度译码器并行地判断指令长度;
比如8个length decoder(0~7),第0个length decoder从当前第0字节开始判断指令
长度,第1个length decoder从第1个字节开始判断。。。第7个length decoder从第7个
字节开始判断指令长度。显然,不是每个字节都是指令的开始位置。最终,从第0个
length decoder开始,跟据各length decoder的结果就可以知道一段若干字节指令流的
各指令长度。
这种在变长单指令的译码中很有效。
不知道该机制是否适用于多个并行变长指令的译码。即:类似于vliw结构,但是每个槽的编码为变长,此时该机制是否适用呢?
楼上的是正解,补充一下Length decoder的具体方法
x86指令有这么几个字段,prefix, opcode, modrm, sib, disp, imm
prefix, 0-14B, 可选,由特殊的字符组成,如0x66,0x67等
opcode, 1-3B,必须, 它决定了指令modrm, disp, imm的是否存在及其长度
modrm, 0-1B,可选, 决定指令是否有sib
由此可见,只要把前3个字段确定下来,就能确定整个指令的长度
一般做法,先挑出prefix,然后根据prefix后面4B的情况,就能知道整个指令的长度