2013-06-29 3 views
3

이 코드를 올바른 방식으로 최적화하려고합니다. 내가 옳다고 말하는 것은 ... 누군가가 코드를보고 최적화를 제거 할 수 있도록 이러한 최적화를 수행하는 일반적인 접근 방식이 있다고 생각합니다. 나는 첫 번째 부분 (제대로 있는지 확실하지 않습니다)를 최적화 할 수 있습니다,하지만 난SPARC 어셈블리의 루프 최적화

mov %g0, %l2 

    cmp %l0, %l1 
    bge END_LOOP 
    nop 

LOOP: 
    mov %l0, %o0 
    call .mul 
    mov %l1, %o1  ! Fill delay slot with second argument 
    add %l2, %o0, %l2 
    inc %l0 

    cmp %l0, %l1 
    bl  LOOP 
    nop 

END_LOOP: 
    mov %l2, %o0 
    call .mul   ! Fill delay sot with second argument 
    mov %l1, %o1 

    mov %o0, %l3 

읽기 쉽 코드의

C 샘플 ...

int a = 1; // mapped to %l0 
int b = 5; // mapped to %l1 
int c = 0; // mapped to %l2 
int d;  // mapped to %l3 

while(a < b) { 
    c += a * b; 
    ++a; 
} 

d = c * b; 

SPARC 어셈블리 버전 ... 두 번째 부분을 최적화하는 방법을 모릅니다.

mov %g0, %l2 

    cmp %l0, %l1 
    bge,a END_LOOP  ! Annul branch to execute if branch is taken 
    mov %l2, %o0  ! Instruction at target 

LOOP: 
    mov %l0, %o0 
    call .mul 
    mov %l1, %o1  ! Fill delay slot with second argument 
    add %l2, %o0, %l2 
    inc %l0 

    cmp %l0, %l1 
    bl  LOOP 
    nop 

    mov %l2, %o0  ! Move the instruction to above the target 

END_LOOP: 
    call .mul   ! Fill delay sot with second argument 
    mov %l1, %o1 

    mov %o0, %l3 

이러한 최적화를 수행하는 방법에 대한 도움은 매우 감사하겠습니다.

+0

SPARC v8 이상을 대상으로하는 경우'.mul' 시스템 라이브러리 루틴을 호출하는 대신 'SMUL' 명령을 사용할 수 있습니다. – Michael

+0

아마 내가 추가 했어야합니다. 이것은 구형 32 비트 SPARC 시스템입니다. – logbaseinfinity

답변

3

일반적으로 접근 방법은 정확합니다. 데이터 종속성 또는 대상을 따르는 제어 명령 전송이 없다고 가정하면 일반적으로 다음 규칙을 따를 수 있습니다.

이동 지점의 대상으로, 지연 슬롯에 명령을 복사하여 지점을 무효 :

당신은 아마 실현하지 않고, 이런 짓을. 앞에서 언급했듯이 분기를 취소하지 않으면 명령 실행을 방지하기 위해 분기를 취소합니다. 그런 다음 라벨 위의 대상에서 명령을 이동하십시오. 위의 단계를 다음 코드에서

는 다음을 수행 할 것입니다 : 당신이 명시 적으로 내가 변경할 것을 볼 수 있도록

나는 귀하의 의견을 제거했습니다.

mov %g0, %l2 

    cmp %l0, %l1 
    bge,a END_LOOP 
    mov %l2, %o0 

    mov %l0, %o0  ! 3. Move the instruction formerly after the loop 
         ! above the label 
LOOP: 
    [ mov %l0, %o0 ] ! Instruction was here 

    call .mul 
    mov %l1, %o1 
    add %l2, %o0, %l2 
    inc %l0 

    cmp %l0, %l1 
    bl,a LOOP   ! 1. Go to the target and copy that instruction into 
         ! they delay slot. 
         ! 2. Annul the branch 
    mov %l0, %o0  ! Instruction formerly after LOOP: 

    mov %l2, %o0 

END_LOOP: 
    call .mul 
    mov %l1, %o1 

    mov %o0, %l3 

코드를주의 깊게 살펴보면 논리가 여전히 유지되며 체계적으로 최적화를 풀 수 있음을 알 수 있습니다.

루프를 입력했는지 여부에 관계없이 코드는 여전히 루프 다음의 코드를 올바르게 실행합니다.

이것은 코드를 최적화하는 일반적인 방법이며 컴파일러에서 수행하는 것과 유사합니다. 핵심은 항상 데이터 종속성이 존재하지 않는지 확인하는 것입니다.