На 32-битном компьютере команда «добавить с переносом», используемая как часть последовательности сложения с множественной точностью, должна принимать операнды на 65 битов и вычислять сумму в 33 бита. Спецификации регистра источника будут определять, откуда должны поступить 64 бита операнда, а спецификация регистра назначения скажет, куда должны идти младшие 32 бита результата, но что делать с операндом «добавить один дополнительный» или старшим битом. результата? Разрешить указывать в качестве части инструкции, откуда должен поступать дополнительный операнд и куда должен идти дополнительный результирующий бит, было бы умеренно полезно, но, как правило, это было бы не так полезно, чтобы оправдать дополнительное поле в коде операции. Наличие фиксированного «местоположения» для обработки флага переноса может быть немного неудобным с точки зрения планирования команд, но это '
Если кто-то пытался создать набор команд, чтобы разрешить арифметику с множественной точностью, но каждая команда была ограничена двумя 32-разрядными операндами и одним 32-разрядным операндом-адресатом, можно было бы реализовать 64-разрядное «добавление» в четырех инструкциях: «набор От r5 до 1, если r0 + r2 будет нести или обнулять иначе; вычислить r4 = r1 + r3; вычислить r5 = r4 + r5; вычислить r4 = r0 + r2 ", но для выхода за пределы этого потребуется три инструкции для каждого дополнительного слова. Наличие флага переноса в качестве дополнительного источника и места назначения снижает стоимость до одной инструкции на слово.
Отметим, между прочим, что наличие бита инструкции, управляющего тем, обновляет ли команда регистр флага, может способствовать выполнению не по порядку, поскольку команды, которые используют или модифицируют биты флага, должны сохранять свою последовательность относительно друг друга, но инструкции, которые не могут ни того, ни другого не могут быть свободно переставленным. Учитывая последовательность:
ldr r0,[r1]
add r0,r0,r2
eors r4,r5,r6
исполнительный модуль может довольно легко распознать, что третья инструкция может быть выполнена без необходимости ждать чтения данных [r1]
, но если бы была вторая инструкция, это было adds r0,r0,r2
бы возможно только в том случае, если исполнительный модуль мог гарантировать, что к тому времени что-либо попытается использовать В флагах нулевой флаг будет содержать значение, установленное в третьей инструкции, но флаг переноса будет содержать значение во второй.