Встроенный ассемблер работает аналогично макропроцессору.Операнды с ровно одним начальным процентом заменяются входными параметрами в том порядке, в котором они отображаются в списке параметров, в этом случае:
%0 h output, register, r/w
%1 blk1 output, register, r/w
%2 blk2 output, register, r/w
%3 (x86_reg)stride input, register, read only
Параметры являются обычными выражениями C.Они могут быть дополнительно определены с помощью «ограничений», в этом случае «r» означает, что значение должно быть в регистре, а не «m», который является операндом памяти.Модификатор ограничения "= r" делает этот операнд только для записи, "+ r" - операнд для чтения и записи, а "r" - операнд для обычного чтения.
После первого двоеточия выходные операнды появляются послевторой - входные операнды, а после необязательной третьей - засоренные регистры.
Таким образом, последовательность команд вычисляет сумму абсолютных разностей в каждом байте blk1
и blk2
.Это происходит в 16-байтовых блоках, поэтому, если stride
равно 16, блоки являются смежными, в противном случае имеются дыры.Каждая инструкция появляется дважды, поскольку выполняется минимальное развертывание цикла, параметр h
- это число 32-байтовых блоков для обработки.Второй блок asm кажется бесполезным, поскольку инструкция psadbw
суммируется только в младшем 16-битовом регистре назначения.(Вы пропустили какой-то код?)