문제

SPARC 어셈블리의 경우, annulled 지점은 일반 분기와 어떻게 다른가요?

분기 지침을 위해 NOP 지연 슬롯을 채워야 할 때는 항상 분기 지침이 필요하다고 생각했습니다. 그러나 나는 당신이 지점을 무효화하지 않고도 NOP를 채울 수 있기 때문에 내가이 부분에 맞지 않는다고 생각합니다.

도움이 되었습니까?

해결책

미개발 지침은 지연 슬롯의 명령어 (지점 후 지침)의 지침이 분기를 사용하지 않으면 무시됩니다.

이것이 왜 중요한가? 일반적으로 지점을 채취하더라도 분기 후 지침이 실행되기 때문입니다. PC와 NPC라는 두 개의 프로그램 카운터가 있기 때문입니다. 실행중인 명령을 나타내는 PC는 NPC가 분기 명령의 대상으로 업데이트되는 것과 동시에 PC + 4 인 NPC로 업데이트되었습니다. 따라서 이러한 이벤트의 타이밍으로 인해 다음 명령이로드되어야합니다. 그주기를 버리기보다는 가능하다면 그주기를 사용하는 것이 더 유리합니다. 그런 다음 우리는 그 명령을 루프의 일부로 만들 것입니다.

loop:   someOp                
        someOtherOp
        branch      loop      ;
        delayslotOp           ; will actually be executed, before someOp, after branch

분기 후 명령 슬롯을 사용할 수 없다면, 우리는 거기에 NOP를 붙잡고 그주기에 아무것도하지 않습니다.

그렇다면 왜 무효화되지 않은 분기 옵션과 다른 지침이 있습니까? 루프에서 나오는 일에 대한 선택을 우리에게 선택합니다. 루프 활동의 지연 슬롯 부분을 만들면 루프에서 떠날 때 OP가 실행되는 것을 원하지 않을 수 있습니다. 그러므로 우리는 "지 명령 끝에", "AD를 추가 할 것이다.

이 페이지에는 몇 가지 좋은 예가 있습니다.

다른 팁

에 따르면 SPARC 아키텍처 매뉴얼 (V9):

3.2.3 제어 전송

[...]

대부분의 제어 전송 지침이 지연됩니다. 즉, 논리 시퀀스의 제어 전송 명령에 따라 즉시 대상 주소로의 제어 전송이 완료되기 전에 분산된다.

[...]

지연된 제어 전환 지침에 따른 지침을 지연 교육. 지연된 제어 전환 명령어 (Annul Bit)의 약간은 지연 명령을 분기를 취하지 않으면 (즉, 효과가 없음) 발생할 수 있습니다.

6.3.4 제어 전송 지침 (CTIS)

[...]

프로그래밍 노트: ANNUL BIT는 컴파일러가 분기 후 지연 슬롯을 채우는 유용한 명령을 찾을 수있는 가능성을 증가시켜 프로그램에서 실행 된 지침 수를 줄입니다. 예를 들어, Annul 비트를 사용하여 루프 내에서 명령을 이동하여 루프를 닫는 분기의 지연 슬롯을 채우기 위해 명령어를 이동할 수 있습니다. 마찬가지로, Annul Bit은“ifthen- else”프로그램 블록의“else”또는“then”브랜치에서 지시를 그들 사이에서 선택하는 지연 슬롯으로 옮기는 데 사용될 수 있습니다. 전체 조건 세트가 제공되므로 컴파일러는 코드를 정렬 할 수 있으며 (조건의 감각을 되돌릴 수 있음) "else"브랜치 또는 "그런 다음"분기의 명령이 지연 슬롯으로 이동할 수 있습니다.

다음 코드는 두 개의 지연을 보여줍니다. 첫 번째 지연에서 지연 명령이 항상 실행됩니다. 두 번째 지연은 지연 명령이 분기를 취하지 않으면 끊임없이 처리됩니다.

cmp   %i3, %i0
ble   %icc, -0x5c
ld    [%l0 - 0x4], %i5  ; executed whether the branch is taken or not

...

cmp   %l1, 0x80
bl,a  %icc, +0x40
ld    [%fp + 0x7c7], %g2    ; annulled if the branch is not taken, executed otherwise
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top