MIPS I 명령어 형식을 이해하려면 MIPS 파이프 라인을 이해하고 1985 년경 CPU 구현 기술을 다시 생각해야합니다. 다이어그램을 보면 (파일을 알고 있음) 레지스터 파일 읽기가 IF 직후 ID 단계.
R 유형 명령어의 목적을 위해 ID 단계는 다음 작업을 수행해야합니다.
- 그것이 실제로 결정 이다 는 R 형 명령.
- 그렇다면 레지스터 파일에 레지스터에서 값을로드하도록 지시하십시오.
이 토론의 목적 상 가장 먼저 고려해야 할 작업입니다. 레지스터의 값이 필요한 경우 해결해야하는 많은 명령 디코딩 작업이있는 경우 레지스터 읽기를 시작하기 전에 지연 시간이 늘어납니다. 또한 ID 단계의 복잡성을 증가시킵니다. 모든 R 유형 명령어에 대해 단일 opcode를 예약하면 복잡성을 최소한으로 유지할 수 있습니다.
시프트에 5 비트를 바치는 것이 조금 이상하게 보입니다. 몇 가지 가능한 설명을 생각할 수 있습니다. 하나는 라우팅을 단순화한다는 것입니다 (5 개의 비트는 항상 레지스터 파일에 직접 공급되고, 5 개의 비트는 항상 배럴 시프터에 공급되며, 6 개의 비트는 항상 수행 할 기능을 결정하기 위해 ALU로 라우팅됩니다).
그들은 미래에 조합 된 왼쪽 및 추가 명령을 도입하려고 생각했을 수도 있습니다. 이것은 아마도 다음과 같은 형식 일 것입니다.
$d = $s + ($t << shamt)
2에스+ 1에스
오늘날 우리는 더 복잡한 디코딩 단계에 대해 두 번 생각하지 않을 것입니다. 특히 레지스터 파일 액세스는 나중에 전형적인 슈퍼 스칼라 CPU의 파이프 라인에서 발생하기 때문입니다. 많은 현대 CPU는 심지어 명령어가 L1 캐시에 삽입 될 때 약간의 명령어 디코딩 을 수행 합니다 . I- 캐시 라인을 추가 정보 (무어의 법칙 덕분에 낭비 할 많은 트랜지스터가 있음)를 저장하기 위해 몇 비트 더 넓게 만들어 "적절한"명령어 디코딩을 더 간단하고 빠르게 만듭니다.
그들이 opcode 필드를 가능한 한 작게 유지하려는 이유 중 하나는 J 유형 명령어를 부당하게 처벌하지 않기 때문입니다. 아시다시피 J 유형 명령어는 의사 직접 주소 지정을 사용합니다. 집에서 같이 놀아주는 사람의 이익을 위해 간단히 설명하겠습니다.
J 형 명령어의 주소 필드는 26 비트입니다. 명령어는 항상 4 바이트로 정렬되므로 최하위 2 비트를 저장할 필요가 없으므로 28 비트 주소를 효과적으로 가질 수 있습니다. 그러나 MIPS I의 주소 공간은 32 비트입니다. 따라서 점프 위치의 상위 4 비트는 프로그램 카운터에서 가져옵니다.
즉, PC 위치의 최상위 4 비트가 다른 위치로 바로 이동할 수 없습니다. 대신 스크래치 레지스터를 통해 더 비싼 3 명령 점프를 수행해야합니다.
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
오늘날에는 그렇게 나쁘지는 않지만 1985 년에는 많은 클럭 사이클이 있습니다.
주소 필드에서 비트를 훔치면 직접 점프의 유효 범위가 훨씬 더 줄어 듭니다. 이것이 지불하기에는 너무 높은 가격을 볼 수 있습니다.