MIPS (любопытство) более быстрый способ очистки регистра? - PullRequest
5 голосов
/ 26 октября 2010

Какой самый быстрый способ очистки регистра (= 0) в сборке MIPS?

Некоторые примеры:

xor    $t0, $t0, $t0
and    $t0, $t0, $0
move   $t0, $0
li     $t0, 0
add    $t0, $0, $0

Какой самый эффективный?

Ответы [ 6 ]

4 голосов
/ 27 октября 2010

Во многих реализациях MIPS эти операции будут компилироваться в одну и ту же инструкцию, потому что обычно "mov $ a, $ b" - это идиома для or $a, $b, $0, а li $r, x - сокращение для ori $r, $0, x:

move $t0, $0
li $t0, 0

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

xor $t0, $t0, $t0
and $t0, $t0, $0

, и в каждой реализации RISC, с которой я когда-либо работал, add находится в той же трубе, что и xor /и / ни / и т.д..

По сути, все это относится к реализации конкретного чипа, но все они должны быть однократными.Если чип вышел из строя, li или and x, $0, $0 могут быть самыми быстрыми, поскольку они минимизируют ложные зависимости от других регистров.

2 голосов
/ 27 октября 2010

Кажется, я помню, что $ 0 было создано специально для этого случая, поэтому я ожидаю, что move $t0 $0 должен быть рекомендованным способом очистки регистра.Но я не делал MIPS почти 10 лет ...

1 голос
/ 26 октября 2010

Учитывая, что все эти инструкции занимают один конвейерный цикл, между ними не должно быть большой разницы.

Если таковые имеются, я ожидал бы, что xor $t0, $t0, $t0 будет наилучшим по скорости, потому что он не использует никаких других регистров, таким образом, оставляя их свободными для других значений и потенциально уменьшая конфликт файлов регистра.

Метод xor также рассматривается как специфическая идиома на некоторых процессорах, что позволяет ему использовать еще меньше ресурсов (например, не нужно выполнять операцию XOR ALU.

0 голосов
/ 28 августа 2011

Как насчет MOVZ?Это должно просто сделать операцию MOV и ничего больше.

MOVZ $t0, $0, $0
0 голосов
/ 27 октября 2010

Вероятно, это зависит от того, какие другие инструкции будут в конвейере одновременно: когда последний раз использовался регистр, когда он будет использоваться в следующий раз и какие внутренние блоки используются в настоящее время.

I 'Я не знаком со структурой конвейера какого-либо конкретного процессора MIPS, но ваш компилятор должен быть, и я ожидаю, что он выберет тот, который будет самым быстрым в данной последовательности кода.

0 голосов
/ 27 октября 2010

В большинстве реализаций архитектуры MIPS все они должны обеспечивать одинаковую производительность. Тем не менее, можно представить суперскалярную систему, которая может выполнять несколько инструкций одновременно, если они используют различные внутренние единицы. У меня нет реального примера системы MIPS, которая работает подобным образом, но именно так происходит в системах PowerPC. Код операции xor $t0, $t0, $t0 будет выполняться на модуле «целочисленных вычислений» (потому что это xor), в то время как move $t0, $0 не будет использовать этот модуль; концептуально последний может выполняться параллельно с другим кодом операции, который выполняет целочисленные вычисления.

Вкратце, если вы обнаружите систему, в которой все перечисленные способы не одинаково эффективны, , то Я бы ожидал, что метод move $t0, $0 будет наиболее эффективным. 1011 *

...