MIPS: зачем нам нужен байт загрузки, если у нас уже есть слово загрузки?

В наборе инструкций RISC MIPS у нас есть инструкции загрузки байта (lbu), загрузки полуслова (lhu) и загрузки слова (lw). Мне кажется, что все, на что способны lbu и lhu, можно сделать и с lw.

Так почему же разработчики MIPS представили lbu и lhu? В каких обстоятельствах (желательно неясных) они могут быть полезны? Возможно, lw выполняется дольше, чем lbu, хотя обе инструкции являются отдельными?


person flow2k    schedule 26.11.2016    source источник
comment
В оригинальной Alpha не было инструкций по загрузке/сохранению подслов. Без них можно довольно далеко продвинуться, но со временем Alpha пришлось расширить набор инструкций этими инструкциями для многопроцессорных систем.   -  person EOF    schedule 26.11.2016


Ответы (1)


lw требует, чтобы адрес, с которого вы загружаетесь, был выровнен по слову (т. е. адрес должен быть кратен 4).

Итак, допустим, что у вас есть этот массив, расположенный по адресу 0x1000:

array: .byte 0,1,2,3

И вы хотите загрузить второй байт (1), расположенный по адресу 0x1001, который не выровнен по слову. Это явно не сработает, если только вы не выполнили lw с адреса 0x1000, а затем не выполнили сдвиг и операцию И, чтобы получить нужный байт, что было бы настоящей проблемой для программиста.

Или предположим, что вы хотите загрузить 0, который находится по адресу, выровненному по слову, и сравнить его с некоторым значением. Таким образом, вы выполняете lw с адреса 0x1000, но теперь ваш целевой регистр будет содержать либо 0x00010203, либо 0x03020100 (в зависимости от порядка байтов), а не только 0. Поэтому перед выполнением сравнения вам нужно будет выполнить побитовое И, чтобы извлечь нужный байт.

Я уверен, вы понимаете, что было бы очень неудобно выполнять эти дополнительные шаги всякий раз, когда вы хотите обработать отдельные байты данных, что в большинстве программ является довольно распространенной операцией.

person Michael    schedule 26.11.2016
comment
Михаил - спасибо. Что касается моих сомнений по поводу времени выполнения, я полагаю, что lw и lbu займут одинаковое количество времени, верно? То есть, если бы нам нужно было ждать памяти, требуемое время ожидания не отличалось бы между ними, верно? - person flow2k; 27.11.2016
comment
@flow2k: нулевое расширение байта в 32-битный регистр практически бесплатно аппаратно, и, надеюсь, хорошая реализация может эффективно выбирать правильное слово для извлечения из кеша. Я ожидаю, что LW и LBU будут работать одинаково, но возможно, что LBU имеет немного большую задержку в некоторых реализациях. Если LHU работает с невыровненными полусловами, ему может потребоваться загрузить по одному байту из каждой из двух соседних строк кэша. Это может быть медленнее все время или медленнее только при разделении строк кэша. (Полностью придумываю здесь, основываясь на моих знаниях архитектуры x86 и ЦП; IDK, на что похож MIPS HW). - person Peter Cordes; 27.11.2016