Để hiểu các định dạng hướng dẫn MIPS I, bạn cần hiểu đường ống MIPS và cũng nghĩ lại về công nghệ triển khai CPU vào khoảng năm 1985. Nếu bạn nhìn vào sơ đồ (bạn biết cái này), bạn sẽ thấy việc đọc tệp đăng ký nằm trong Giai đoạn ID, ngay sau IF.
Với mục đích của hướng dẫn loại R, giai đoạn ID cần thực hiện các tác vụ sau:
- Xác định rằng nó thực sự là một lệnh loại R.
- Nếu vậy, hãy báo cho tệp đăng ký để tải các giá trị từ các thanh ghi.
Với mục đích của cuộc thảo luận này, đây là nhiệm vụ đầu tiên mà bạn phải suy nghĩ. Nếu có rất nhiều công việc giải mã hướng dẫn mà bạn phải thực hiện để thậm chí giải quyết nếu bạn cần bất kỳ giá trị nào từ các thanh ghi, điều này làm tăng độ trễ trước khi bạn có thể bắt đầu đọc đăng ký. Nó cũng làm tăng sự phức tạp của giai đoạn ID. Bằng cách đặt trước một mã opcode cho tất cả các hướng dẫn loại R, bạn giữ mức độ phức tạp ở mức tối thiểu.
Có vẻ hơi lạ khi bạn dành năm bit chỉ để thay đổi. Tôi có thể nghĩ về một vài lời giải thích có thể. Một là nó đơn giản hóa việc định tuyến (năm bit đó LUÔN được đưa thẳng vào tệp đăng ký, năm bit đó LUÔN được đưa vào bộ dịch chuyển thùng, sáu bit đó LUÔN LUÔN được chuyển qua ALU để xác định chức năng nào sẽ thực hiện).
Họ có thể đã nghĩ đến việc giới thiệu các hướng dẫn thay đổi kết hợp giữa trái và thêm trong tương lai. Điều này có lẽ sẽ có dạng:
$d = $s + ($t << shamt)
2S+ 1S
Ngày nay, có lẽ chúng ta sẽ không nghĩ hai lần về việc có một giai đoạn giải mã phức tạp hơn, đặc biệt là khi các truy cập tệp đăng ký có xu hướng xảy ra sau đó trong đường ống của một CPU siêu lớp điển hình. Nhiều CPU hiện đại thậm chí còn thực hiện một số giải mã lệnh thô tại thời điểm một lệnh được chèn vào bộ đệm L1 . Bạn làm cho các dòng I-cache rộng hơn một vài bit để lưu trữ thông tin bổ sung (nhờ Định luật Moore, bạn có rất nhiều bóng bán dẫn bị lãng phí) để thực hiện giải mã lệnh "đúng" đơn giản và nhanh hơn.
Một lý do tại sao họ có thể muốn giữ trường opcode nhỏ nhất có thể là vì nó không phạt các hướng dẫn loại J quá mức. Như bạn có thể biết, hướng dẫn loại J sử dụng địa chỉ giả trực tiếp. Vì lợi ích của bất kỳ ai chơi cùng ở nhà, tôi sẽ giải thích ngắn gọn về nó.
Trường địa chỉ của lệnh loại J là 26 bit. Vì các hướng dẫn luôn được căn chỉnh 4 byte, bạn không cần lưu trữ hai bit có ý nghĩa ít nhất, điều đó có nghĩa là bạn thực sự có 28 bit địa chỉ. Tuy nhiên, không gian địa chỉ trong MIPS I là 32 bit. Vì vậy, bốn bit trên cùng của vị trí nhảy được lấy từ bộ đếm chương trình.
Điều này có nghĩa là bạn không thể trực tiếp nhảy đến một vị trí có bốn bit quan trọng nhất của vị trí PC khác nhau. Thay vào đó, bạn sẽ phải thực hiện một bước nhảy ba hướng đắt tiền hơn thông qua một thanh ghi đầu:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Điều đó không quá tệ ngày hôm nay, nhưng vào năm 1985, đó là rất nhiều chu kỳ đồng hồ.
Ăn cắp một chút từ trường địa chỉ sẽ làm giảm phạm vi hiệu quả của một cú nhảy trực tiếp hơn nữa. Bạn có thể thấy làm thế nào điều này có thể là một cái giá quá cao để trả.