понимание MIPS csum_partial - PullRequest
       1

понимание MIPS csum_partial

0 голосов
/ 01 марта 2012

Я пытаюсь понять код функции csum_partial (), расположенный в arch / mips / lib / csum_partial.S в ванильном ядре 2.6.35.Похоже, в этом есть ошибка в том случае, если длина ввода меньше 8 байт.Я знаю, что это не звучит разумно, поэтому я спрашиваю здесь. Функция запускается следующим образомкоманда перемещения, верно?И там у нас есть:

.Lsmall_csumcpy:

   move a1, t2
   ...

Мой вопрос, где регистр t2 инициализируется ?!Заранее большое спасибо!

1 Ответ

1 голос
/ 02 марта 2012

move в следующем коде находится в Слот задержки ветвления

bnez    t8, .Lsmall_csumcpy     /* < 8 bytes to copy */
 move   t2, a1

Регистр t2 назначается до выполнения ветвления, поэтому t2 имеетправильное значение в .Lsmall_csumcpy:.Инструкция move в коде имеет отступ, чтобы показать читателю, что она находится в слоте задержки.

Обычно ассемблер заполняет слоты задержки с помощью NOP s, но из-за директивы .set noreorderАссемблер собирает инструкции в этом коде в точном порядке, в котором они написаны.

Некоторые симуляторы MIPS, используемые в классах, по умолчанию не включают интервалы задержки ветвления, поэтому этот код может работать некорректно в таком симуляторе, еслиСлоты задержки включены.

...