문제

다음 MIPS 코드가 있으며 코드를 다시 작성/재정렬하여의 수를 줄일 수 있습니다. NOP 정확성을 보존하는 동안 적절한 파이프 라인 실행에 필요한 지침. Datapath는 마구간이나 앞으로도 전달되지 않는다고 가정합니다. 문제는 두 가지 힌트를 제공합니다. 분기와 점프가 지연되고 지연 슬롯이 채워져 있고 필요할 때 메모리 액세스 지침 (LW, SW)의 오프셋 값을 chaging하는 것을 힌트합니다.

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

이 코드가 한 배열의 내용을 증가시키고 다른 배열에 저장한다는 것은 분명합니다. 따라서 루프를 완료하기 전에 지수를 계산해야 하므로이 코드를 어떻게 재정렬 할 수 있는지 정확히 알지 못합니다.

내 추측은 움직일 것입니다 LW 지시 지침 다음 (내가 이해하는 한) 지연 슬롯의 명령은 항상 실행됩니다. 그런 다음 다시이 주제를 이해하지 못하고 설명에 감사드립니다. 나는 일반적으로 파이프 라인을 이해하지만 지연된 분기는 그리 많지 않습니다. 감사

도움이 되었습니까?

해결책

분기 지연 슬롯을 채우는 한 가지 방법은 다음과 같습니다.

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

다른 팁

두 번째 힌트 측면에서 :

네 번째 지시를 2 위로 만드십시오. 첫 번째는 여전히 실행되는 동안 P/H 용어를 사용하는 경우 첫 번째 명령어의 ID 후에 파이프 라인을 사용할 수 있습니다. 그런 다음 500 대신 (오래된) 3 번째 명령 496에서 오프셋을 만드십시오. 왜 지금 왜 그런지 알 수 있습니까?

첫 번째 힌트와 관련하여, 나는 지연된 지연이 어떻게 실행되는지에 대해 너무 익숙하지 않습니다 (SPIM에서 구현되지 않아서 신경 쓰지 않았습니다). 기존의 마지막 지시는 아마도 "Delayed"라는 이름이 나타내는 것처럼 두 번째로 줄어들 수 있지만, 나는 당신에게 방법과 이유를 말할 수 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top