2014-09-15 2 views
2

간단한 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

GCC doesn't make use of inc

참고 :

내가 질문 중 누구도 내가 발견거나 지시 한 명시 적으로하기 때문에이 질문을 부탁 해요 그래서이 행동을 설명합니다. 이 문제에 관한 이전의 질문은 아마 과 으로 대답했기 때문에 닫혔습니다. 나는 사소한 것을 찾지 못한다. 주어진 모든 링크와 답변에서 답을 찾지 못했습니다. 다른 "내 마우스를 내 PC에 연결하는 방법"문제가 아닙니다. 모든 질문은 왜 add이 새로운 x86 프로세서에서 더 좋을지 또는 GCC가이를 사용하는 이유를 설명하지만 아무도 ICC에 관심이 없습니다.

ICC 디자인 선택에 대한 통찰력 또한 매우 환영 할 것입니다.

추 신 : PS 유효한 답변이 아니기 때문에 "하지 않습니까?"라고 생각하지 않습니다.

+1

질문에 C 소스 및 어셈블리 목록을 포함하면 도움이됩니다. 'inc '가 왜 틀렸을까요? C 소스 코드는 * behavior *; 프로그램이 올바르게 작동하는 한, 그 행동을 달성하기 위해 어떤 지시가 사용되는지 (C 표준에 관한 한) 중요하지 않습니다. 하지만 그렇습니다. '포함'보다 'addl'을 선호하는 이유가있을 수 있습니다. 왜 –

+1

이유를 설명하는 몇 가지 출처를 인용하면 도움이 될 것입니다. 선택한 컴파일러 옵션을 유지하지 마십시오. 크기 최적화가 INC를 사용하게 만드는 것을 이미 알고 있습니다. –

+0

플래그 문제는 캐리 플래그를 읽는 분기로 처리하는 경우에만 발생하며 문제는되지 않습니다. – harold

답변

2

이 3 (0x83 0xc0 0x01) 대신 1 바이트 (0x40)로만 선택되었다고 가정하는 것은 무리가 아닙니다.

+1

아마도 일부 인텔 프로세서는 '포함'속도가 빠릅니다 (AMD는 느려질 수 있습니다)? –

+0

lea eax, [1 + eax]가 빠를 때가 있었지만 16 비트 프로세서에서만 true 일 수 있으므로 lea ax 만 [1 + ax]입니다. – rcgldr

+0

opcode가 [REX 접두어] (http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix)에 사용 되었기 때문에 x86_64에서 1 바이트 inc/dec이 더 이상 사용되지 않습니다 (OP의 경우). –