ARM9 프로세서 용 로깅 C 코드를 작성하고 있습니다. 이 코드는 동적 모듈이있는 경우 일부 데이터를 기록합니다. 모듈은 일반적으로 프로덕션 빌드에는 존재하지 않지만 로깅 코드는 항상 컴파일됩니다. 고객이 버그를 발견하면이 모듈을로드 할 수 있고 로깅 코드는 디버깅 정보를 덤프합니다.RVCT4.0을 사용하는 Arm9의 정적 분기 예측
모듈이 없을 때 로깅 코드는 최소한의 영향을 주어야하므로 모든주기가 중요합니다. RVCT 4.0은 다음과 같습니다 코드 생성에 최적화를
__inline void log_some_stuff(Provider *pProvider, other args go here...)
{
if (NULL == pProvider)
return;
... logging code goes here ...
}
: 일반적으로 로깅 코드는 다음과 같이 보입니다
ldr r4,[r0,#0x2C] ; pProvider,[r0,#44]
cmp r4,#0x0 ; pProvider,#0
beq 0x23BB4BE (usually taken)
... logging code goes here...
... regular code starts at 0x23BB4BE
이 프로세서는 더 분기 예측이 없습니다, 그리고 나의 이해는 점이다 분지가 채취 될 때마다 2 사이클의 벌칙이 부과됩니다 (분과회를하지 않으면 벌칙이 없습니다).
나는 일반적인 경우를 원합니다. 여기서 NULL == pProvider
은 빠른 케이스가되고, 분기가 수행되지 않습니다. RVCT 4.0에서 이와 같은 코드를 생성하려면 어떻게합니까?
가 나는 다음과 같이 __builtin_expect
를 사용하여 시도했다 :
if (__builtin_expect(NULL == pProvider, 1))
return;
불행하게도,이 생성 된 코드에 영향을주지 않습니다. __builtin_expect
을 잘못 사용하고 있습니까? 다른 방법이 있습니까 (인라인 어셈블리가 없기를 바랍니다).
이 코드는 의미가 없습니다. pProvider가 첫 번째 arg이고 역 참조를 거치지 않고 NULL에 대해 검사되는 경우 컴파일러는 pProvider가 이미 r0에 있으므로 ldr이 필요하지 않습니다. Provider 유형으로의 오프셋을보고있는 것처럼 보입니다. –
@Variable Length Coder, 로그 함수는 인라인되어 있으므로 인수에 대해 걱정할 필요가 없습니다. ldr 명령은 일부 데이터 구조에서 pProvider를 가져옵니다. 함수가 인라인되지 않으면 호출 전에 발생합니다. –
참고로 RVCT 3.0 설명서에서 [__builtin_expect] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0202h/Cjabddedbde.html)에 대한 지원을 나타냅니다. –