Препроцессор команд ХММ-расширения
В табл. 10.1 приведены коды регистров общего назначения и соответствующих им ХММ-регистров. В правом столбце этой таблицы содержится условное обозначение ХММ-регистров, принятое в файле iaxmm.inc. Это же соответствие закреплено рядом определений в этом файле, которые иллюстрирует следующая программа.
DefineXMMxRegs Macro IFDEF APPJ.6BIT rxmm0 TEXTEQU<AX> rxmm1 TEXTEQU<CX> rxmm2 TEXTEQU<DX> rxmm3 TEXTEQU<BX> rxmm4 TEXTEQU<SP> rxmm5 TEXTEQU<BP> rxmm6 TEXTEQU<SI> rxmm7 TEXTEQU<DI> RXMM0 TEXTEQU<AX> RXMM1 TEXTEQU<CX> RXMM2 TEXTEQU<DX> RXMM3 TEXTEQU<BX> RXMM4 TEXTEQU<SP> RXMM5 TEXTEQU<BP> RXMM6 TEXTEQU<SI> RXMM7 TEXTEQU<DI> rxmml TEXTEQU<ECX> rxmm2 TEXTEQU<EDX> rxmm3 TEXTEQU<EBX> rxmm4 TEXTEQU<ESP> rxmm5 TEXTEQU<EBP> rxmm6 TEXTEQU<ESI> rxmm7 TEXTEQU<EDI> RXMM0 TEXTEQU<EAX> RXMM1 TEXTEQU<ECX> RXMM2 TEXTEQU<EDX> RXMM3 TEXTEQU<EBX> RXMM4 TEXTEQU<ESP> RXMM5 TEXTEQU<EBP> RXMM6 TEXTEQU<ESI> RXMM7 TEXTEQU<EDI> ENDIF endm
Таблица 10.1. Кодировка регистров в машинном коде команды.
Код в поле reg | Регистр целочисленного устройства | ХММ-регистр |
---|---|---|
000 | АХ/ЕАХ | RXMM0 |
001 | СХ/ЕСХ | RXMM1 |
010 | DX/EDX | RXMM2 |
011 | ВХ/ЕВХ | RXMM3 |
100 | SP/ESP | RXMM4 |
101 | ВР/ЕВР | RXMM5 |
110 | SI/ESI | RXMM6 |
111 | DI/EDI | RXMM7 |
Теперь в исходном тексте программы можно использовать символические имена ХММ-регистров в качестве аргументов макрокоманд, моделирующих ХММ-команды.
Рассмотрим, как в файле iammx.inc описано макроопределение для моделирования ХММ-команды скалярной пересылки MOVSS.
:F3 OF 10 /г movss xrrnil .xmm2/m32:F3 OF 11 /r movss xmm2/m32 .xnrnl movss macro dst:req .src:req XMMld_st_f3 opc_Mo"s .dst, src endm
Понимание структуры приведенного макроопределения не должно вызвать у читателя трудностей. Начать следует с того, что данная команда содержит вложенный вызов макрокоманды XMMld_st_f3, у которой две задачи – определить вариант сочетания операндов, после чего сформировать правильный код операции и подставить его на место соответствующих байтов в команде CMPXCHG. В результате этих действий команда CMPXCHG "превращается" в ХММ-команду MOVSS.
1. XMMld_St f3 macro op:req.dst:req, src:req 2 .local x. у 3. Defin'eXMMxRegs 4. IF (OPATTR(dst)) AND OOOlOOOOy – .register 5 .x: lock cmpxchg src .dst 6. у: org x 7 .byte OF3H.0Fh .op& Id 8 .org у 9. ELSE 10 .x: lock cmpxchgdst .src 11 .y: orgx 12 .byte 0F3H.0Fh .op&_st 13 .orgy 14. ENDIF 15. UnDefineXMMxRegs 16 .endm