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