什么是指令融合?
- 某些指令,例如add $3,$2,0, 只会使用rd/rs两个字段,但是这条指令却占用了全部32个bit, 这样会使得代码密度不高,指令域的有效利用率不高;
- 这样,在实现某些功能的情况下,会使得CPU花费更多的时钟周期来处理;
- 因此,引入了指令融合技术:
- 指的是,将符合融合条件的相邻两条,或者多条指令,进行合并;
- 一条融合指令的执行,相当于多条被融合的指令同时发射,执行;
- 这样可以使得CPU花费更少的时间来完成相同的工作;
- 对于指令来讲,也可以提升指令域段的有效利用率;
- 根据宏融合的基本思想,如果某条指令的空闲指令域足够多,足以容纳另一条指令的所有有效指令域,则可以将这两条或多条相邻的指令融合.
- 例如,add 的有效寄存器索引是 rs、rt 和 rd,sa 闲置,而jr只有rs有效,因此可以将这两条指令融合.
指令融合原理简介
为了实现宏融合,fetch阶段预取到指令后,对指令进行扫描,如果连续两条指令的全部有效指令域,经优化可以由单独一条指令容纳,则将这两条指令融合成一条“融合指令”。
在判断指令是否能够融合时会碰到两个问题:
- 已有指令的空闲指令域不多甚至没有;
- 相邻的两条指令之间有数据依赖关系;
MIPS指令融合举例
addsll_v1
从图3可以看到,存在WAW (Write AfterWrite)冲突,并且融合条件要求 rt 与rd一样,限制太紧,实际意义不大。
一条指令所涉及到的寄存器个数,MIPS通常是3个,Intel X86 通常是2个MIPS:
- add $rl, $r2, $r3; r3=rl+r2;
- X86: add Sr1, $r2;rl=rl+r2;
各有好处,但是当MIPS指令涉及到相同寄存器时,如add, $r1, $r1, $r1,就严重浪费用于寄存器索引的指令域了,而指令融合关键在于提高指令域的利用率,为此对MIPS指令作第一次扩展.
所以,下面讲的融合方式,是在对基础的指令集,进行扩展之后,才能使用更好的一些指令融合技术;
addsll_v2
LWSLL2