В статье трижды повторяется фрагмент ассемблерного кода для архитектуры PowerPC. Код начинается с сохранения контекста: stwu r1, -0x20(r1), mflr r0, stw r0, 0x24(r1), stw r31, 0x1c(r1), затем mr r31, r3. После этого загружаются два 32-битных числа с плавающей точкой из памяти по адресу из регистра r3 со смещением 0x40 и 0x44: lfs f1, 0x40(r3) и lfs f0, 0x44(r3). Вычисляется сумма квадратов: fmuls f1, f1, f1, fmadds f1, f0, f0, f1. Затем используется инструкция frsqrte f0, f1 для получения приближённого обратного квадратного корня. Дальше выполняется одна итерация уточнения методом Ньютона — Рафсона: fmuls f2, f0, f0, fnmsubs f2, f2, f1, f13, fmadds f0, f0, f2, f0. После этого проверяется, равен ли нулю регистр r4 (cmplwi r4, 0, beq- .L_0x4c). Если не равен, то вычисляется индекс в массиве через rlwinm r0, r5, 2, 0, 29, загружается элемент lwzx r6, r3, r0, к нему прибавляется смещение add r6, r6, r0, и результат записывается обратно stwx r6, r3, r0. Затем вызывается внешняя функция Vec_Normalize (инструкция bl). После возврата в регистр r3 помещается значение 1 (инструкция li r3, 1), восстанавливаются регистры (lwz r0, 0x24(r1), mtlr r0) и выполняется возврат из функции (blr). Весь фрагмент повторяется дословно три раза, без каких-либо изменений. Никаких пояснений, имён, названий компаний или продуктов в статье не приводится. Только машинный код.
Статья трижды использует ассемблер PowerPC: frsqrte и Vec_Normalize
28.06.2026 01:21 · hackernews