2012-12-03 4 views
0

저는 C로 작성하고 GCC를 사용하여 해석합니다.GCC C 어셈블러

중간 코드를 생성하는 방식을 변경했습니다.

그러나이 코드를 해석 할 때 예기치 않은 변경이있었습니다. 중간 코드에서 조건부 점프를 처리하는 조건 블록이 하나 있습니다. 코드 조각을 변경하지 않았습니다.

해체를 위해 Dissy 사용.

mov 0x10(%r14),%rax 
mov (%r12,%rax,8),%rdx 
mov (%rdx),%eax 
test $0x4,%al 
je 4073e0 
cmpb $0x0,0x8(%rdx) 
je 4073e0 

이 변경 misspredictions에 의한 4~6% 성능 회귀를 발생 :

mov 0x10(%r14),%rax 
mov 0x50(%rsp),%rcx 
mov (%rcx,%rax,8),%r12 
mov (%r12),%eax 
test $0x4,%al 
je 4077ef 
cmpb $0x0,0x8(%r12) 
je 4077ef 

최신 버전 : 같은

이전 버전 assember 보인다.

GCC가 어셈블리 섹션을 사용하지 않고 이전 버전을 사용하도록 제안하는 방법이 있습니까?

감사합니다. C에서

편집

코드 :

if((M->type & 4 && M->val.boolean) 
|| (M->type & 1 && M->val.number != 0.0) 
|| (M->type & 2 && M->val.string.length != 0)) 
    // true; 
else 
    // false; 
+3

어떻게 C 소스를 보지 않고도 누구나 추측 할 수 있습니까? –

+0

C 코드와 gcc 명령 줄을 보여줍니다. gcc 및/또는 gcc 컴파일러 버전의 명령 줄이 변경 ​​되었습니까? –

+0

아니요, Makefile과 GCC가 동일합니다 – user978734

답변

2

가 여기 분기 예측의 차이가 될 수 없습니다.

는 오히려 당신이에서 원래의 소스 코드를 수정 한 것을 보인다 때문에에 myArray의 기본은 이미 레지스터 R12에 캐시 후자의 경우에

void modified(int * myarray, int N) { 
    do_something(myarray); 
    do_something_else(myarray[N]); 
} 

void my_func(int *myarray, int N) { 
     do_something(myarray[N]); 
} 

- 또는 방금 myarray를 로컬 스택에서 이동하여 함수의 매개 변수로 사용했습니다.

+0

변수 M은 여전히'M = memory [instructions-> a2]'를 사용하는 동일한 매크로로 채워지지만 모든 명령어 다음에 복제 된 스위치를 사용하므로 전체 해석이 하나의 큰 함수입니다. – user978734