Дата и время публикации:
Быстродействующая краткая форма REP MOV (англ. Fast Short REP MOV,FSRM)
СИНТАКСИС
REP MOVSB ( побайтовая, 8-ми разрядная операция)АРГУМЕНТЫ
Отсутствуют. Вместо них используется регистры rcx, rsi и rdi, в которых указывается значение:
в регистре rcx — число перемещаемых байт, в регистре rsi — адрес источника, в регистре rdi — в адрес приемника.
ОПИСАНИЕБыстродействующая краткая форма REP MOVSB является безоперандовой и неявной формой представления инструкций, осуществляющие циклическую операцию по перемещению данных из одной области хранения в другую.
Была включена начиная с процессоров Intel, базирующихся на микроархитектуре Ice Lake (Client), в которых было произведено улучшение REP MOVSB для применения в высокопроизводительных циклических операциях (high-performance REP string operations) для обеспечения копирования строк, имеющих длину от 1 до 128 байт.
В качестве примера рассмотрим код, который был предложен в виде оптимизирующего патча функции __memmove() в версии 5.6 ядра GNU/Linux, код (файл arch/x86/lib/memmove_64.S) которого показан в листинге 1
Листинг 1
...
15 /*
16 * В архитектуре amd64 функция __memmove() в своем
17 * 1-м аргументе адрес приемника dest передается через регистр %rdi
18 * 2-м аргументе адрес источника src передается через регистр %rsi
19 * 3-м аргументе число копируемых байт из адреса src в адрес dest передаваемых
20 * через регистр %rdx
21 *
22 * возвращает адрес приемника dest в регистeре %rax
23 */
24 .weak memmove
...
27
28 ENTRY(__memmove)
29 CFI_STARTPROC
30
31 /* Обработка более 32-х байт в цикле */
32 mov %rdi, %rax
33 cmp $0x20, %rdx
34 jb 1f
35
36 /* решаем прямой или обратный режим копирования в случае перекрытия адресов */
37 cmp %rdi, %rsi
38 jge .Lmemmove_begin_forward
39 mov %rsi, %r8
40 add %rdx, %r8
41 cmp %rdi, %r8
42 jg 2f
43
44 .Lmemmove_begin_forward:
45 ALTERNATIVE "", "movq %rdx, %rcx; rep movsb; retq", X86_FEATURE_ERMS
...
В строке 31 производится проверка на превышение размера копируемых байт более чем 32-х, что является разумным, потому что процессор затрачивает на выполнение быстродействующей краткой формы REP MOVSB не менее 4-7 тактов, но и не более 9 тактов, в операциях копирования начиная с 32-х байт.
В строке 37 производится проверка перекрытия адреса источника с приемником. Таким признаком является наступление события, когда адрес приемника заведомо меньше адреса источника. В этом случае, применяется режим обратного копирования, несовместимого с рассмотриваемой быстродействующей краткой формы REP MOVSB.
В противном случае, в строке 45 производится выполнение REP MOVSB путем передачи числа копируемых байт в регистр %rcx из %rdx, в то время как значения адресов приемника и источника уже помещены по своим местам во время вызова функции __memmove() .
Библиография
См. п.п.39-43 общей библиографии