> aa_dav нравится это. Это ты еще не видел, как fpu-опкоды кодируются. Увидеть там логику по таблицам, а не битфилдам весьма напряжно Код (Text): FPU ----------------------------------------------------- FADD 11011 000 : 11 000 ST(i) st(0), st(i) FMUL 11011 000 : 11 001 ST(i) st(0), st(i) FCOM 11011 000 : 11 010 ST(i) st(i) FCOMP 11011 000 : 11 011 ST(i) st(i) FSUB 11011 000 : 11 100 ST(i) st(0), st(i) FSUBR 11011 000 : 11 101 ST(i) st(0), st(i) FDIV 11011 000 : 11 110 ST(i) st(0), st(i) FDIVR 11011 000 : 11 111 ST(i) st(0), st(i) FADD 11011 000 : mod 000 r/m real4 ptr FMUL 11011 000 : mod 001 r/m real4 ptr FCOM 11011 000 : mod 010 r/m real4 ptr FCOMP 11011 000 : mod 011 r/m real4 ptr FSUB 11011 000 : mod 100 r/m real4 ptr FSUBR 11011 000 : mod 101 r/m real4 ptr FDIV 11011 000 : mod 110 r/m real4 ptr FDIVR 11011 000 : mod 111 r/m real4 ptr FLD 11011 001 : 11 000 ST(i) st(i) FXCH 11011 001 : 11 001 ST(i) st(i) FNOP 11011 001 : 11 010 000 FCHS 11011 001 : 11 100 000 FABS 11011 001 : 11 100 001 ??? 11011 001 : 11 100 010 ??? 11011 001 : 11 100 011 FTST 11011 001 : 11 100 100 FXAM 11011 001 : 11 100 101 ??? 11011 001 : 11 100 110 ??? 11011 001 : 11 100 111 FLD1 11011 001 : 11 101 000 FLDL2T 11011 001 : 11 101 001 FLDL2E 11011 001 : 11 101 010 FLDPI 11011 001 : 11 101 011 FLDLG2 11011 001 : 11 101 100 FLDLN2 11011 001 : 11 101 101 FLDZ 11011 001 : 11 101 110 ??? 11011 001 : 11 101 111 F2XM1 11011 001 : 11 110 000 FYL2X 11011 001 : 11 110 001 FPTAN 11011 001 : 11 110 010 FPATAN 11011 001 : 11 110 011 FXTRACT 11011 001 : 11 110 100 FPREM1 11011 001 : 11 110 101 FDECSTP 11011 001 : 11 110 110 FINCSTP 11011 001 : 11 110 111 FPREM 11011 001 : 11 111 000 FYL2XP1 11011 001 : 11 111 001 FSQRT 11011 001 : 11 111 010 FSINCOS 11011 001 : 11 111 011 FRNDINT 11011 001 : 11 111 100 FSCALE 11011 001 : 11 111 101 FSIN 11011 001 : 11 111 110 FCOS 11011 001 : 11 111 111 FLD 11011 001 : mod 000 r/m real4 ptr ??? 11011 001 : mod 001 r/m real4 ptr FST 11011 001 : mod 010 r/m real4 ptr FSTP 11011 001 : mod 011 r/m real4 ptr FLDENV 11011 001 : mod 100 r/m 14-byte/28-byte ptr (OS) FLDCW 11011 001 : mod 101 r/m word ptr FNSTENV 11011 001 : mod 110 r/m 14-byte/28-byte ptr (OS) FNSTCW 11011 001 : mod 111 r/m word ptr FUCOMPP 11011 010 : 11 101 001 FIADD 11011 010 : mod 000 r/m dword ptr FIMUL 11011 010 : mod 001 r/m dword ptr FICOM 11011 010 : mod 010 r/m dword ptr FICOMP 11011 010 : mod 011 r/m dword ptr FISUB 11011 010 : mod 100 r/m dword ptr FISUBR 11011 010 : mod 101 r/m dword ptr FIDIV 11011 010 : mod 110 r/m dword ptr FIDIVR 11011 010 : mod 111 r/m dword ptr FNCLEX 11011 011 : 11 100 010 FNINIT 11011 011 : 11 100 011 FUCOMI 11011 011 : 11 101 ST(i) st(0), st(i) FILD 11011 011 : mod 000 r/m dword ptr ??? 11011 011 : mod 001 r/m dword ptr FIST 11011 011 : mod 010 r/m dword ptr FISTP 11011 011 : mod 011 r/m dword ptr ??? 11011 011 : mod 100 r/m dword ptr FLD 11011 011 : mod 101 r/m tbyte ptr ??? 11011 011 : mod 110 r/m dword ptr FSTP 11011 011 : mod 111 r/m tbyte ptr FADD 11011 100 : 11 000 ST(i) st(i), st(0) FMUL 11011 100 : 11 001 ST(i) st(i), st(0) ??? 11011 100 : 11 010 ??? ??? 11011 100 : 11 011 ??? FSUB 11011 100 : 11 101 ST(i) st(i), st(0) FSUBR 11011 100 : 11 100 ST(i) st(i), st(0) FDIVR 11011 100 : 11 110 ST(i) st(i), st(0) FDIV 11011 100 : 11 111 ST(i) st(i), st(0) FADD 11011 100 : mod 000 r/m real8 ptr FMUL 11011 100 : mod 001 r/m real8 ptr FCOM 11011 100 : mod 010 r/m real8 ptr FCOMP 11011 100 : mod 011 r/m real8 ptr FSUB 11011 100 : mod 100 r/m real8 ptr FSUBR 11011 100 : mod 101 r/m real8 ptr FDIV 11011 100 : mod 110 r/m real8 ptr FDIVR 11011 100 : mod 111 r/m real8 ptr FFREE 11011 101 : 11 000 ST(i) st(i) ??? 11011 101 : 11 001 ??? FST 11011 101 : 11 010 ST(i) st(i) FSTP 11011 101 : 11 011 ST(i) st(i) FUCOM 11011 101 : 11 100 ST(i) st(i) FUCOMP 11011 101 : 11 101 ST(i) st(i) ??? 11011 101 : 11 110 ??? ??? 11011 101 : 11 111 ??? FLD 11011 101 : mod 000 r/m real8 ptr ??? 11011 101 : mod 001 r/m FST 11011 101 : mod 010 r/m real8 ptr FSTP 11011 101 : mod 011 r/m real8 ptr FRSTOR 11011 101 : mod 100 r/m 94-byte/108-byte ptr (OS) ??? 11011 101 : mod 101 r/m FNSAVE 11011 101 : mod 110 r/m 94-byte/108-byte ptr (OS) FNSTSW 11011 101 : mod 111 r/m word ptr FADDP 11011 110 : 11 000 ST(i) st(i), st(0) FMULP 11011 110 : 11 001 ST(i) st(i), st(0) ??? 11011 110 : 11 010 ??? FCOMPP 11011 110 : 11 011 001 FSUBRP 11011 110 : 11 100 ST(i) st(i), st(0) FSUBP 11011 110 : 11 101 ST(i) st(i), st(0) FDIVRP 11011 110 : 11 110 ST(i) st(i), st(0) FDIVP 11011 110 : 11 111 ST(i) st(i), st(0) FIADD 11011 110 : mod 000 r/m word ptr FIMUL 11011 110 : mod 001 r/m word ptr FICOM 11011 110 : mod 010 r/m word ptr FICOMP 11011 110 : mod 011 r/m word ptr FISUB 11011 110 : mod 100 r/m word ptr FISUBR 11011 110 : mod 101 r/m word ptr FIDIV 11011 110 : mod 110 r/m word ptr FIDIVR 11011 110 : mod 111 r/m word ptr FNSTSW 11011 111 : 11 100 000 AX FUCOMIP 11011 111 : 11 101 ST(i) st(0), st(i) FCOMIP 11011 111 : 11 110 ST(i) st(0), st(i) FILD 11011 111 : mod 000 r/m word ptr ??? 11011 111 : mod 001 r/m FIST 11011 111 : mod 010 r/m word ptr FISTP 11011 111 : mod 011 r/m word ptr FBLD 11011 111 : mod 100 r/m tbyte ptr FILD 11011 111 : mod 101 r/m qword ptr FBSTP 11011 111 : mod 110 r/m tbyte ptr FIST 11011 111 : mod 111 r/m qword ptr
Да нет, почему же не видел - чтобы написать предыдущую статью https://wasm.in/threads/principy-ko...x86-64-ili-exal-prefiks-cherez-prefiks.34390/ и их пришлось поразглядывать. По ссылке http://ref.x86asm.net/coder32.html прекрасно всё разглядывается. Чаще ESC-префикс через поле GGG в modR/M засунуто до 8 разных опкодов, но у серий начинающихся с F2XM1 похоже опкод еще и переполз в поле R/M, действительно атипично.
Меня в FPU больше удивило, что ему отдали все восемь ESC-последовательностей. Я лично ожидал бы, что одним внешним дейвайсом будет занят один ESC-код чтобы можно было надобавлять потом еще всяких штук. У ARM-ов если не ошибаюсь так и сделано и MMU выглядит для процессора как внешний девайс.
Печально даже, что всю такую работу в итоге выкинули на мороз. И 80-битность long double-в тоже. При этом опять таки из всех API выкинули, а пользоваться то можно, но компиляторы уже не используют. Это специально надо в ассемблер перейти или намутить с опциями компилятора (последнее грозит отваливанием библиотек). И что характерно регистры FPU как бы отлетают при этом вместе с регистрами MMX, т.к. это действительно одно и то же. Просто больше в регулярном API не используются, но сохранять и загружать их ОС обязана, т.к. надо блюсти совместимость. И вот опять упрекну и в этой части систему команд Intel надо всё-таки было при переходе в 64 бита менять тут всё полностью и коренным образом. Но AMD пошли по пути минимальных изменений, хотя, имхо смена битности могла бы быть произведена и с большей архитектурной перестройкой.
ИМХО, 64 бита от АМД - это лучшее, что случилось с x86! Так красиво и элегантно добавить всё это - моё почтение инженерам. Единственный момент, который до сих пор вызывает удивление - почему xor eax, eax обнуляет rax.
Не только xor, но и любые инструкции, изменяющие 32-битный регистр, обнуляют старший дворд. Сделано для экономии памяти.
Потому что суперскалярность. Разрыв зависимостей. Любые операции с регистрами меньшей разрядности чтобы разрывали зависимости. И это еще одна причина что переход на x64 получился скомканным и неполным - не хватило мощи. Но то правило что любые операции с 32-битными регистрами зануляют верхние 64 бита как раз здравое и осмысленное решение.
Не тот случай, к тому же операции над 16 и 8-битными регистрами не обнуляют старшие биты. Просто в реальном коде загрузка 32-битного значения в регистр - это одна из основных операций и zero-extend by default экономит значительно места, укорачивая в два раза загружаемые константы и делая необязательным использование префикса rex во многих случаях.
Костыльность, да. А зачем тебе загружать 64 бита в Rreg если ты заранее планируешь использовать только Ereg? Не надо выдумывать - сами разработчики в мануалах чётко обозначили почему и зачем. И факап с тем что при распространении на 64 бита этих же правил на 8-битные или 16-битные операции тоже чётко в мануалах обозначен: зачастую быстрее будет 32-битную инструкцию воткнуть вместо 8-битной потому что 8-битная создаёт иллюзию зависимостей которые не ложаться хорошо на суперскалярный конвеер.
aa_dav, Я вот чего не пойму, знаешь отлично формат IA, но так ничего не сделал. Не написал диз получше кседа, нет ничего кроме недовольства на которое всем пх. Я например реализовал давно очень динамический декодер длин(rlde), но а ты что сделал ?