延迟转移技术:在转移指令之后插入一条有效的指令,程序执行时,要等这条插入的指令执行完成之后,才执行转移指令,因此,转移指令好象被延迟执行了,这种技术称为延迟转移技术。
图2.15 因转移指令引起的流水线断流
图2.16 采用延时转移技术的指令流水线
采用指令延迟转移技术时,指令序列的调整由编译器自动进行,一般不需要人来干预,但是,如果要在目标程序一级调试程序,这种已经被调整过了的程序将很难看懂,很容易引起人们的误解。
很容易会提出这样一个问题:如果是条件转移指令时,还能不能采用延迟转移技术呢?我们来看下面的程序:
1: MOVE R1, R2
2: CMP R3, R4 ;(R3)与(R4)比较
3: BEQ EXIT ;如果(R3)=(R4)则转移到NEXT
4: ADD R4, R5
………
N: NEXT: MOVE R4, A
重新调整一下程序的指令序列,把原来的第一条指令插入到条件转移指令之后。得到一个新的程序:
1: CMP R3, R4 ;(R3)与(R4)比较
2: BEQ EXIT ;如果(R3)=(R4)则转移到NEXT
3: MOVE R1, R2 ;插入一条指令,但不能有数据相关,不能改变条件吗
4: ADD R4, R5
………
N: NEXT: MOVE R4, A
以上程序在执行时流水线就不会有断流情况发生。
必须注意:调整指令序列一定不能改变原来程序的数据相关关系,即被移动指令中的所有数据存储单元与移动过程中所经过的指令的所有数据存储单元之间不能有数据的读-写、写-读和写-写相关。另外,还要求,被移动的指令不要破坏机器的条件码,至少不要影响后面的条件码测试指令所要求的条件码。
如果找不到符合上述条件的指令来调整程序中指令序列,那么,编译程序必须在条件转移指令后面插入一条空操作指令。如果指令的执行过程分为多个流水段,则要插入多条空操作指令。