Background
컴퓨터 구조를 배우면서, MIPS 아키텍쳐에 대해 공부하고 있다. MIPS의 경우, pipeline을 도입하고 branch prediction을 위해 여러 방법을 사용한다고 한다. 그 방법 중 static prediction의 방법으로 해당 branch가 거짓일 경우(즉, jump를 수행하지 않는 분기)로 예상하는 방법이 존재한다고 한다.
이 방법을 보고나서 gcc의 __builtin_expect나 C++20의 likely 및 unlikely attribute가 이러한 분기 예측을 기반으로 구성되어 있는 것이 아닌가하는 생각이 들었다. 따라서 이를 간단하게 분석해보고자 하였다.
__builtin_expect
GCC에서는 컴파일러에게 도움을 줄 수 있는 여러 builtin macro를 제공한다.
앞서 언급했듯, 그 중에는 __builtin_expect와 __builtin_expect_with_probability가 존재한다.