간단한 C 코드를 보면서 이상한 것을 발견했습니다. 왜 ICC는 addl $1, %eax
대신에 증가를 위해 생성 된 어셈블리 코드에서 incl %eax
을 생성합니까? GCC는 예상대로 동작하지만 add
을 사용합니다.ICC가 x86 어셈블리에서 "추가"대신 "inc"를 생성하는 이유는 무엇입니까?
예 코드 (GCC 및 ICC 모두 사용 -O3
) 예를 들어, ICC
L__routine_start_foo_0:
foo:
movl B(%rip), %eax #5.13
movl D(%rip), %edx #8.9
incl %eax #5.17
movl E(%rip), %ecx #10.9
addl $2, %edx #9.9
addl $2, %ecx #10.9
movl %eax, A(%rip) #5.9
movl $0, B(%rip) #6.9
incl C(%rip) #7.9
movl %edx, D(%rip) #9.9
movl %ecx, E(%rip) #10.9
ret
에
int A, B, C, D, E;
void foo()
{
A = B + 1;
B = 0;
C++;
D++;
D++;
E += 2;
}
결과는 here 참조.
이와 같은, 궁금한 점은 - 의도 된 기능, 버그 또는 특정 설정의 결과 인 것입니까? add
이 플래그 업데이트 또는 효율성 (아래 링크를 기반으로 한 결론 임)으로 인해 더 좋을 경우 - ICC가 inc
을 사용하는 이유는 무엇입니까?
관련 :
Relative performance of x86 inc vs. add instruction
Is ADD 1 really faster than INC ? x86
참고 :
내가 질문 중 누구도 내가 발견거나 지시 한 명시 적으로하기 때문에이 질문을 부탁 해요 그래서이 행동을 설명합니다. 이 문제에 관한 이전의 질문은 아마 과 이으로 대답했기 때문에 닫혔습니다. 나는 사소한 것을 찾지 못한다. 주어진 모든 링크와 답변에서 답을 찾지 못했습니다. 다른 "내 마우스를 내 PC에 연결하는 방법"문제가 아닙니다. 모든 질문은 왜 add
이 새로운 x86 프로세서에서 더 좋을지 또는 GCC가이를 사용하는 이유를 설명하지만 아무도 ICC에 관심이 없습니다.
ICC 디자인 선택에 대한 통찰력 또한 매우 환영 할 것입니다.
추 신 : PS 유효한 답변이 아니기 때문에 "하지 않습니까?"라고 생각하지 않습니다.
질문에 C 소스 및 어셈블리 목록을 포함하면 도움이됩니다. 'inc '가 왜 틀렸을까요? C 소스 코드는 * behavior *; 프로그램이 올바르게 작동하는 한, 그 행동을 달성하기 위해 어떤 지시가 사용되는지 (C 표준에 관한 한) 중요하지 않습니다. 하지만 그렇습니다. '포함'보다 'addl'을 선호하는 이유가있을 수 있습니다. 왜 –
이유를 설명하는 몇 가지 출처를 인용하면 도움이 될 것입니다. 선택한 컴파일러 옵션을 유지하지 마십시오. 크기 최적화가 INC를 사용하게 만드는 것을 이미 알고 있습니다. –
플래그 문제는 캐리 플래그를 읽는 분기로 처리하는 경우에만 발생하며 문제는되지 않습니다. – harold