Какой вариант выполнение инструкций будет более быстрый

Создаю виртуальный процессор, и пришло время реализовать инструкцию mov

В реальном процессоре mov имеет много вариаций, где сам опкод указывает с каким регистром надо работать

Если у меня память не подводит то получается так: 0xB8 - (mov eax, ...), 0xBB - (mov ebx,...)

Соответственно инструкция имеет длину 5 байт (32 битный режим) где 1 байт это опкод а 4 - значение

Но также я придумал другой способ, это непосредственно указывать номер регистра после опкода, в таком случае будет только одна инструкция mov, с длиной 6 байт

Ну и эти 2 способа будут отрицательно влиять на скорость

1 способ, цепочка switch case будет иметь большую длину (особенно если mov будет иметь в моем случае 30 вариаций) это возможно будет влиять на скорость выполнения всех инструкций

В 2 случае конкретно инструкция mov будет выполняться медленнее, так как программе нужно будет узнать с каким регистром надо работать сейчас, и это также увеличит размер инструкции на один байт и соответственно исполняемого файла

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

(Процессор пишу на с++, компилятор g++ если надо)


Ответы (1 шт):

Автор решения: Chorkov

Длинна цепочки switvh-case не имеет значения, если у вас заполнены все или почти все возможные значения op-кодов. Для коротких цепочек компилятор, обычно, генерирует дерево сравнений, а для длинных - таблицу переходов (пример).

Вполне нормально, если какая-то инструкция занимает несколько op-кодов. Или один op-код используется для нескольких команд, с учетом того, что для некоторых команд имеют смысл не все возможные значения значения.

Например:

Инструкция mov из регистра, и mov по адресу, указанному в регистре - разные по сути операции, хотя и имеют одно обозначение. Разумно дать им разные op-коды.

Инструкция xor с фиксированным значением 0 - не имеет смысла. Если компилятору она понадобится - можно использовать nop, а код соответствующий xor AX, 0 использовать для какой ни будь другой операции (те-же ret или nop)...

→ Ссылка