4.4. IBM 370
Следующий пример на ассемблере для процессора IBM 370 суммирует по 4 байта одновременно. Для простоты опущен код дополнения, используемых для выравнивания данных по 4-байтовой границе и обращения порядка байтов, когда это требуется. Результат сохраняется в регистре RCARRY.
Этот код на процессоре IBM 3090 давал время расчета 27 мксек/кбайт при расчете контрольной суммы байтов, содержащих только единицы. Время расчета снижается до 24.3 мксек/кбайт, если применить средства выравнивания слов (специальная обработка в начале и в конце, а при необходимости замена местами байтов при расчете с нечетной позиции).
* Регистры RADDR и RCOUNT содержат адрес и размер суммируемого блока. * * (RCARRY, RSUM) должны быть парой регистров (четный/нечетный). * (RCOUNT, RMOD) должны быть парой регистров (четный/нечетный). * CHECKSUM SR RSUM,RSUM Сброс рабочих регистров. SR RCARRY,RCARRY LA RONE,1 Установка значения 1. * SRDA RCOUNT,6 Count/64 в RCOUNT. AR RCOUNT,RONE +1 = # число циклов. SRL RMOD,26 Размер частичного блока в RMOD. AR RADDR,R3 Выравнивание для компенсации перехода S RADDR,=F(64) в цикл. SRL RMOD,1 (RMOD/4)*2 - индекс "полуслов". LH RMOD,DOPEVEC9(RMOD) используется специальный вектор для B LOOP(RMOD) смещения и перехода в цикл... * * Внутренний цикл: * LOOP AL RSUM,0(,RADDR) Сложить логические слова BC 12,*+6 Переход, если нет переноса AR RCARRY,RONE Добавит ь 1 переноса AL RSUM,4(,RADDR) Сложить логические слова BC 12,*+6 Branch i f no carry AR RCARRY,RONE Добавить 1 переноса * * ... еще 14 повторов ... * A RADDR,=F'64' Увеличить адресный указатель BCT RCOUNT,LOOP Перейти к Count * * Прибавить переносы к сумме и "затолкнуть" в 16 битов * ALR RCARRY,RSUM Сложить слова SUM и CARRY BC 12,*+6 и учесть возможный перенос AR RCARRY,RONE SRDL RCARRY,16 Поместить 32-битовую сумму SRL RSUM,16 в 16 битов ALR RCARRY,RSUM C RCARRY,=X'0000FFFF' Прибавить оставшийся перенос BNH DONE S RCARRY,=X'0000FFFF' DONE X RCARRY,=X'0000FFFF' Дополнить до 1