저는 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;
어떻게 C 소스를 보지 않고도 누구나 추측 할 수 있습니까? –
C 코드와 gcc 명령 줄을 보여줍니다. gcc 및/또는 gcc 컴파일러 버전의 명령 줄이 변경 되었습니까? –
아니요, Makefile과 GCC가 동일합니다 – user978734