dstE和dstM是在Decode Stage要设置的register,dst在这里其实是destination的简写,它指明了用哪一个register是用来储存指令要写回(write back)的value。注意,他仅仅是register的编号,并不记录要储存的value。
比如说在addq %rax, %rbx
,这个指令里,假设%rax=3,%rbx=5,那么这里会将3+5=8这个值储存到%rbx。在这个例子里,dstE会被设为%rbx对应的编号3,而不是加合8。
那么为什么这里没有使用dstM呢?答案取决于要写回的value是在哪个Stage产生的。E代表Execute Stage,而M则代表Memory Stage。简单来说,如果要写回的value是在E产生的,比如算术运算的结果,那就设置dstE。而如果要写回的值是在M从memory中读取出来的,则要设置dstM。
回到这个例子addq %rax, %rbx
,因为%rax和%rbx的合是在Execute Stage将valA和valB通过加法运算得出的结果,所以这里设置的是dstE。又比如在mrmovq (%rcx), %rdx
这个指令里,最终要将%rcx的值对应的地址上的value取出并写回%rdx。因为读取memory并且得到valM这个操作是在Memory Stage发生的,所以这里会设置dstM为%rdx的编号2.
最后挖个坑,据说有的指令会同时使用dstE和dstM。