Известно, что у процессоров есть специальные инструкции для декрементации счетчика и ответвления, если счетчик равен нулю с очень низкой задержкой, так как команда перехода не нуждается в ожидании декремент счетчика, проходящий через целочисленную единицу.Как написать цикл в C, поэтому компилятор может использовать ветвь на ноль после декремента
Вот ссылка на инструкцию ррс:
https://www.ibm.com/support/knowledgecenter/ssw_aix_53/com.ibm.aix.aixassem/doc/alangref/bc.htm
Мой обычный способ делать то, что я считаю, запускает компилятор генерировать соответствующие инструкции выглядит следующим образом:
unsigned int ctr = n;
while(ctr--)
a[ctr] += b[ctr];
Читаемость является высоким, и это декрементирующий цикл, разветвляющийся на ноль. Как видите, ветка технически возникает, если счетчик равен нулю до декремента. Я надеялся, что компилятор сможет сделать магию и заставить ее работать в любом случае. Вопрос. Должен ли компилятор нарушить какие-либо фундаментальные правила C, чтобы отменить его к специальным инструкциям условного декремента и ветвления (если они есть)?
Другой подход:
unsigned int ctr = n+1;
while(--ctr) {
a[ctr-1] += b[ctr-1];
}
Филиала в настоящее время произойдет после декремента, но есть постоянный роуминг сделать уродливый код. Переменная «index», которая меньше, чем счетчик, заставит ее выглядеть немного красивее, я думаю. Рассматривая доступные команды ppc, дополнительный расчет при поиске а и b-адреса может по-прежнему соответствовать одной команде, так как загрузка также может выполнять арифметику адреса (добавить). Не так уверен в других наборах инструкций. Моя основная проблема заключается в том, что если n + 1 больше макс. Q: Будет ли декремент возвращать его до максимума и петли, как обычно?
В: Существует ли более распространенный шаблон в C для разрешения общей инструкции?
Редактировать: ARM имеет операцию декремента и ветвления, но ветви, только если значение не равно нулю. Кажется, что есть дополнительное условие, подобное ppc bc. Как я вижу, это с точки зрения C, это очень одно и то же, поэтому я ожидаю, что фрагмент кода будет скомбинирован с этой формой без какого-либо стандартного нарушения C. http://www.heyrick.co.uk/armwiki/Conditional_execution
Edit: Intel имеет практически тот же разветвление инструкцию как ARM: http://cse.unl.edu/~goddard/Courses/CSCE351/IntelArchitecture/InstructionSetSummary.pdf
Считываемость высокая? Считываемость настолько высока, что до/пост приращение/декремент были удалены из Swift3. Я бы попробовал memcpy или memmove. – gnasher729
У меня лично нет проблем с приращением до/после. memcpy/memmove не является вариантом: он не копирует, он добавляет значения ('+ =' вместо '='). – Aconcagua