Поскольку это связано с iPhone и ассемблерным кодом, я приведу пример, который будет актуален в мире iPhone (а не какой-нибудь sse или x86 asm).
Если кто-то решит написать ассемблерный код для какого-либо реального приложения, то, скорее всего, это будет своего рода цифровая обработка сигналов или манипулирование изображениями. Примеры: преобразование цветового пространства пикселей RGB, кодирование изображений в формат jpeg / png или кодирование звука в mp3, amr или g729 для приложений voip.
В случае кодирования звука есть много подпрограмм, которые не могут быть преобразованы компилятором в эффективный асм-код, они просто не имеют эквивалента в C. Примеры часто используемых вещей в обработке звука: насыщенная математика, подпрограммы с множественным накоплением, умножение матриц.
Пример насыщенного сложения: 32-битное целое со знаком имеет диапазон: 0x8000 0000 <= int32 <= 0x7fff ffff. Если вы добавите два целых числа, результат может переполниться, но в некоторых случаях это может быть неприемлемо при цифровой обработке сигналов. По сути, если результат переполнения или насыщения переполнен, add должен вернуть 0x8000 0000 или 0x7fff ffff. Это была бы полная функция c, чтобы проверить это.
оптимизированная версия насыщенного добавления может быть: </p>
int saturated_add(int a, int b)
{
int result = a + b;
if (((a ^ b) & 0x80000000) == 0)
{
if ((result ^ a) & 0x80000000)
{
result = (a < 0) ? 0x80000000 : 0x7fffffff;
}
}
return result;
}
вы также можете сделать несколько if / else для проверки на переполнение или на x86 вы можете проверить флаг переполнения (который также требует использования asm). iPhone использует процессор armv6 или v7, у которого есть dsp asm. Таким образом, функция saturated_add
с несколькими ответвлениями (операторы if / else) и 2 32-битными константами может быть одной простой инструкцией asm, которая использует только один цикл процессора.
Таким образом, просто сделав насыщенный_адд с использованием инструкции asm, можно сделать весь алгоритм в два-три раза быстрее (и меньше по размеру). Вот руководство QADD:
QADD
другими примерами кода, который часто выполняется в длинных циклах, являются
res1 = a + b1*c1;
res2 = a + b2*c2;
res3 = a + b3*c3;
похоже, что здесь ничего нельзя оптимизировать, но в процессоре ARM вы можете использовать специальные инструкции dsp, которые занимают меньше циклов, чем простое умножение! Это верно, a + b * c с конкретными инструкциями может выполняться быстрее, чем простой a * b. Для такого рода случаев компиляторы просто не могут понять логику вашего кода и не могут напрямую использовать эти инструкции dsp, и поэтому вам нужно вручную написать asm для оптимизации кода, НО вам нужно только вручную написать некоторые части кода, которые необходимо оптимизировано. Если вы начнете писать простые циклы вручную, то почти наверняка вы не победите компилятор!
В Интернете есть много хороших статей для встроенной сборки, чтобы кодировать фильтры, кодировать / декодировать amr и т. Д.