지난 글에서는 분기 명령어의 종류와 사용 방법, 그리고 예제들을 살펴보았다.
간단하게 정리하면 분기 명령어 중 조건 분기와 무조건 분기는 CC 코드를 이용해 분기 명령어에 적힌 조건을 파악하기 때문에, 명령어를 실행시키기 전에 반드시 조건식의 CC 코드를 발생시켜 두어야 했다.
그리고 분기 명령어의 실행 직후에는 Branch Delay Slot 이 반드시 발생하였다.
이번 글에서는 Branch Delay Slot 이 발생하는 이유를 실제 명령어의 실행 파이프라인을 따라가보며 정리해보고자 한다.
다음과 같은 명령어를 순차적으로 실행시킨다고 하자.
ble next_r - A
add R1, R2, R3 - B
mov 130, R4 - C
...
next_r: - D
add R3, R4, R1
set str, %o0
...
SPRAC 의 파이프라인인 F > E > M > W 의 순서로 시간을 따라가보자.
T1 시점
F : A 명령어를 가져와 해석한다.
E :
M :
W :
T2 시점
F : B 명령어를 가져와 해석한다.
E : A 명령어의 해석 결과 분기를 해야한다고 판단한다.
M :
W :
T3 시점
F : 분기 지점에 있는 D 명령어를 가져와 해석한다.
E : B 명령어의 해석 결과대로 실행한다.
M : A 명령어는 메모리의 조작과 관련 없는 명령어이므로, 이 단계는 실행되지 않는다. (맞겠지..?)
W :
t3 시점에서, 분기를 하였음에도, t2 시점에서 fetch 한 B 명령어가 파이프라인에 남아있어 계속 실행된다.
분기 실행시, 다음에 실행할 명령어 주소를 하드웨어적으로 앞으로 넘기기 때문에 PC + 4 주소가 아닌 분기된 곳 명령어가 위치한 주소가 넘어간다.
T4 시점
F : ...
E : D 명령어가 실행된다.
M : B 명령어의 실행결과를 메모리에 쓴다.
W :
이때, B 명령어가 쓴 실행결과가 의도된 D 명령어의 실행결과에 영향을 주게 된다.
따라서 B 명령어가 위치한 곳을 비워 nop 로 만들어두어야 한다.
SPARC 는 분기 명령어 직후의 명령어 ( 이 위치를 Branch Delay Slot 이라고 함 ) 를 분기 여부에 상관없이 반드시 실행한다.
따라서 이 곳에 예상치 못한 명령을 실행시키지 않기 위해 nop 를 넣어두는데, 이는 퍼포먼스의 낭비가 된다.
다음 글에서는 이 퍼포먼스의 낭비를 막기 위해, Branch Delay Slot 을 최적화하는 여러가지 방법에 대해 정리하여보겠다.
'CS > 어셈블리' 카테고리의 다른 글
[SPARC] 20. switch - case 구현하기 (0) | 2023.10.18 |
---|---|
[SPARC] 19. Delay Slot Optimization (0) | 2023.10.17 |
[SPARC] 17. 분기 명령어 (0) | 2023.10.15 |
[SPARC] 16. 비트 연산 명령어 (0) | 2023.10.15 |
[SPARC] 15. 논리 연산 명령어 (0) | 2023.10.14 |