× К оглавлению На главную Об авторе

   Дата и время публикации:

Быстродействующая краткая форма 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 байт.

Примечание. В процессорах микроархитектуреархитектуры Intel и AMD введены функциональные флаги CPUID, характиризующие процессор в виде поддержки им специфических расширений наборов команд, к числу которых относится быстродействующая краткая форма REP MOVSB. Cоответственно, для быстродействующей краткой формы REP MOVSB определен характиризующий ЦПУ(Устройство Центрального Процессора) функциональный флаг CPUID: [EAX=7H, ECX=0H).EDX.FAST_SHORT_REP_MOVSB[bit 4] = 1

В качестве примера рассмотрим код, который был предложен в виде оптимизирующего патча функции __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 общей библиографии