Обсуждение статьи "Кодирование fpu инструкций Intel x87"

Тема в разделе "WASM.ARTICLES", создана пользователем rmn, 8 окт 2021.

  1. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    > aa_dav нравится это.
    Это ты еще не видел, как fpu-опкоды кодируются. Увидеть там логику по таблицам, а не битфилдам весьма напряжно :)
    Код (Text):
    1.  
    2. FPU
    3. -----------------------------------------------------
    4. FADD        11011 000 : 11 000 ST(i)    st(0), st(i)
    5. FMUL         11011 000 : 11 001 ST(i)    st(0), st(i)
    6. FCOM        11011 000 : 11 010 ST(i)    st(i)
    7. FCOMP         11011 000 : 11 011 ST(i)    st(i)
    8. FSUB         11011 000 : 11 100 ST(i)    st(0), st(i)
    9. FSUBR        11011 000 : 11 101 ST(i)    st(0), st(i)
    10. FDIV          11011 000 : 11 110 ST(i)    st(0), st(i)
    11. FDIVR          11011 000 : 11 111 ST(i)    st(0), st(i)
    12. FADD        11011 000 : mod 000 r/m        real4 ptr
    13. FMUL        11011 000 : mod 001 r/m        real4 ptr
    14. FCOM        11011 000 : mod 010 r/m        real4 ptr
    15. FCOMP        11011 000 : mod 011 r/m        real4 ptr
    16. FSUB        11011 000 : mod 100 r/m        real4 ptr
    17. FSUBR        11011 000 : mod 101 r/m        real4 ptr
    18. FDIV        11011 000 : mod 110 r/m        real4 ptr
    19. FDIVR        11011 000 : mod 111 r/m        real4 ptr
    20.  
    21. FLD         11011 001 : 11 000 ST(i)    st(i)
    22. FXCH        11011 001 : 11 001 ST(i)    st(i)
    23. FNOP        11011 001 : 11 010 000
    24.  
    25. FCHS        11011 001 : 11 100 000
    26. FABS        11011 001 : 11 100 001
    27. ???        11011 001 : 11 100 010
    28. ???        11011 001 : 11 100 011
    29. FTST        11011 001 : 11 100 100
    30. FXAM        11011 001 : 11 100 101
    31. ???        11011 001 : 11 100 110
    32. ???        11011 001 : 11 100 111
    33.  
    34. FLD1        11011 001 : 11 101 000
    35. FLDL2T        11011 001 : 11 101 001
    36. FLDL2E        11011 001 : 11 101 010
    37. FLDPI        11011 001 : 11 101 011
    38. FLDLG2        11011 001 : 11 101 100
    39. FLDLN2        11011 001 : 11 101 101
    40. FLDZ        11011 001 : 11 101 110
    41. ???        11011 001 : 11 101 111
    42.  
    43. F2XM1        11011 001 : 11 110 000
    44. FYL2X        11011 001 : 11 110 001
    45. FPTAN        11011 001 : 11 110 010
    46. FPATAN        11011 001 : 11 110 011
    47. FXTRACT        11011 001 : 11 110 100
    48. FPREM1        11011 001 : 11 110 101
    49. FDECSTP        11011 001 : 11 110 110
    50. FINCSTP        11011 001 : 11 110 111
    51.  
    52. FPREM        11011 001 : 11 111 000
    53. FYL2XP1        11011 001 : 11 111 001
    54. FSQRT        11011 001 : 11 111 010
    55. FSINCOS        11011 001 : 11 111 011
    56. FRNDINT        11011 001 : 11 111 100
    57. FSCALE        11011 001 : 11 111 101
    58. FSIN        11011 001 : 11 111 110
    59. FCOS        11011 001 : 11 111 111
    60.  
    61. FLD        11011 001 : mod 000 r/m        real4 ptr
    62. ???        11011 001 : mod 001 r/m        real4 ptr
    63. FST        11011 001 : mod 010 r/m        real4 ptr
    64. FSTP        11011 001 : mod 011 r/m        real4 ptr
    65. FLDENV        11011 001 : mod 100 r/m        14-byte/28-byte ptr (OS)
    66. FLDCW        11011 001 : mod 101 r/m        word ptr
    67. FNSTENV        11011 001 : mod 110 r/m        14-byte/28-byte ptr (OS)
    68. FNSTCW        11011 001 : mod 111 r/m        word ptr
    69.  
    70. FUCOMPP        11011 010 : 11 101 001
    71. FIADD        11011 010 : mod 000 r/m        dword ptr
    72. FIMUL        11011 010 : mod 001 r/m        dword ptr
    73. FICOM        11011 010 : mod 010 r/m        dword ptr
    74. FICOMP        11011 010 : mod 011 r/m        dword ptr
    75. FISUB        11011 010 : mod 100 r/m        dword ptr
    76. FISUBR        11011 010 : mod 101 r/m        dword ptr
    77. FIDIV        11011 010 : mod 110 r/m        dword ptr
    78. FIDIVR        11011 010 : mod 111 r/m        dword ptr
    79.  
    80. FNCLEX        11011 011 : 11 100 010
    81. FNINIT        11011 011 : 11 100 011
    82. FUCOMI        11011 011 : 11 101 ST(i)    st(0), st(i)
    83. FILD        11011 011 : mod 000 r/m        dword ptr
    84. ???        11011 011 : mod 001 r/m        dword ptr
    85. FIST        11011 011 : mod 010 r/m        dword ptr
    86. FISTP        11011 011 : mod 011 r/m        dword ptr
    87. ???        11011 011 : mod 100 r/m        dword ptr
    88. FLD         11011 011 : mod 101 r/m        tbyte ptr
    89. ???        11011 011 : mod 110 r/m        dword ptr
    90. FSTP         11011 011 : mod 111 r/m        tbyte ptr
    91.  
    92. FADD        11011 100 : 11 000 ST(i)    st(i), st(0)
    93. FMUL         11011 100 : 11 001 ST(i)    st(i), st(0)
    94. ???        11011 100 : 11 010 ???
    95. ???        11011 100 : 11 011 ???
    96. FSUB         11011 100 : 11 101 ST(i)    st(i), st(0)
    97. FSUBR        11011 100 : 11 100 ST(i)    st(i), st(0)
    98. FDIVR          11011 100 : 11 110 ST(i)    st(i), st(0)
    99. FDIV          11011 100 : 11 111 ST(i)    st(i), st(0)
    100.  
    101. FADD        11011 100 : mod 000 r/m        real8 ptr
    102. FMUL        11011 100 : mod 001 r/m        real8 ptr
    103. FCOM        11011 100 : mod 010 r/m        real8 ptr
    104. FCOMP        11011 100 : mod 011 r/m        real8 ptr
    105. FSUB        11011 100 : mod 100 r/m        real8 ptr
    106. FSUBR        11011 100 : mod 101 r/m        real8 ptr
    107. FDIV        11011 100 : mod 110 r/m        real8 ptr
    108. FDIVR        11011 100 : mod 111 r/m        real8 ptr
    109.  
    110. FFREE        11011 101 : 11 000 ST(i)    st(i)
    111. ???            11011 101 : 11 001 ???
    112. FST            11011 101 : 11 010 ST(i)    st(i)
    113. FSTP         11011 101 : 11 011 ST(i)    st(i)
    114. FUCOM        11011 101 : 11 100 ST(i)    st(i)
    115. FUCOMP        11011 101 : 11 101 ST(i)    st(i)
    116. ???            11011 101 : 11 110 ???
    117. ???            11011 101 : 11 111 ???
    118. FLD            11011 101 : mod 000 r/m        real8 ptr
    119. ???            11011 101 : mod 001 r/m
    120. FST            11011 101 : mod 010 r/m        real8 ptr
    121. FSTP        11011 101 : mod 011 r/m        real8 ptr
    122. FRSTOR        11011 101 : mod 100 r/m        94-byte/108-byte ptr (OS)
    123. ???            11011 101 : mod 101 r/m
    124. FNSAVE        11011 101 : mod 110 r/m        94-byte/108-byte ptr (OS)
    125. FNSTSW        11011 101 : mod 111 r/m        word ptr
    126.  
    127. FADDP        11011 110 : 11 000 ST(i)    st(i), st(0)
    128. FMULP         11011 110 : 11 001 ST(i)    st(i), st(0)
    129. ???            11011 110 : 11 010 ???
    130. FCOMPP        11011 110 : 11 011 001
    131. FSUBRP        11011 110 : 11 100 ST(i)    st(i), st(0)
    132. FSUBP        11011 110 : 11 101 ST(i)    st(i), st(0)
    133. FDIVRP        11011 110 : 11 110 ST(i)    st(i), st(0)
    134. FDIVP        11011 110 : 11 111 ST(i)    st(i), st(0)
    135. FIADD        11011 110 : mod 000 r/m        word ptr
    136. FIMUL        11011 110 : mod 001 r/m        word ptr
    137. FICOM        11011 110 : mod 010 r/m        word ptr
    138. FICOMP        11011 110 : mod 011 r/m        word ptr
    139. FISUB        11011 110 : mod 100 r/m        word ptr
    140. FISUBR        11011 110 : mod 101 r/m        word ptr
    141. FIDIV        11011 110 : mod 110 r/m        word ptr
    142. FIDIVR        11011 110 : mod 111 r/m        word ptr
    143.  
    144. FNSTSW        11011 111 : 11 100 000        AX
    145. FUCOMIP        11011 111 : 11 101 ST(i)    st(0), st(i)
    146. FCOMIP        11011 111 : 11 110 ST(i)    st(0), st(i)
    147. FILD        11011 111 : mod 000 r/m        word ptr
    148. ???            11011 111 : mod 001 r/m
    149. FIST        11011 111 : mod 010 r/m        word ptr
    150. FISTP        11011 111 : mod 011 r/m        word ptr
    151. FBLD        11011 111 : mod 100 r/m        tbyte ptr
    152. FILD        11011 111 : mod 101 r/m        qword ptr
    153. FBSTP        11011 111 : mod 110 r/m        tbyte ptr
    154. FIST        11011 111 : mod 111 r/m        qword ptr
    155.  
     
  2. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Да нет, почему же не видел - чтобы написать предыдущую статью 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, действительно атипично.
     
  3. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Меня в FPU больше удивило, что ему отдали все восемь ESC-последовательностей. Я лично ожидал бы, что одним внешним дейвайсом будет занят один ESC-код чтобы можно было надобавлять потом еще всяких штук. У ARM-ов если не ошибаюсь так и сделано и MMU выглядит для процессора как внешний девайс.
     
  4. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Печально даже, что всю такую работу в итоге выкинули на мороз. И 80-битность long double-в тоже.
    При этом опять таки из всех API выкинули, а пользоваться то можно, но компиляторы уже не используют.
    Это специально надо в ассемблер перейти или намутить с опциями компилятора (последнее грозит отваливанием библиотек).
    И что характерно регистры FPU как бы отлетают при этом вместе с регистрами MMX, т.к. это действительно одно и то же. Просто больше в регулярном API не используются, но сохранять и загружать их ОС обязана, т.к. надо блюсти совместимость.
    И вот опять упрекну и в этой части систему команд Intel надо всё-таки было при переходе в 64 бита менять тут всё полностью и коренным образом.
    Но AMD пошли по пути минимальных изменений, хотя, имхо смена битности могла бы быть произведена и с большей архитектурной перестройкой.
     
    Mikl___ нравится это.
  5. Artem_N

    Artem_N Artem N

    Публикаций:
    0
    Регистрация:
    1 мар 2009
    Сообщения:
    74
    ИМХО, 64 бита от АМД - это лучшее, что случилось с x86! Так красиво и элегантно добавить всё это - моё почтение инженерам. Единственный момент, который до сих пор вызывает удивление - почему xor eax, eax обнуляет rax.
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Не только xor, но и любые инструкции, изменяющие 32-битный регистр, обнуляют старший дворд. Сделано для экономии памяти.
     
  7. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Потому что суперскалярность. Разрыв зависимостей. Любые операции с регистрами меньшей разрядности чтобы разрывали зависимости.
    И это еще одна причина что переход на x64 получился скомканным и неполным - не хватило мощи.
    Но то правило что любые операции с 32-битными регистрами зануляют верхние 64 бита как раз здравое и осмысленное решение.
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Не тот случай, к тому же операции над 16 и 8-битными регистрами не обнуляют старшие биты. Просто в реальном коде загрузка 32-битного значения в регистр - это одна из основных операций и zero-extend by default экономит значительно места, укорачивая в два раза загружаемые константы и делая необязательным использование префикса rex во многих случаях.
     
    Artem_N нравится это.
  9. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Костыльность, да.
    А зачем тебе загружать 64 бита в Rreg если ты заранее планируешь использовать только Ereg?
    Не надо выдумывать - сами разработчики в мануалах чётко обозначили почему и зачем.
    И факап с тем что при распространении на 64 бита этих же правил на 8-битные или 16-битные операции тоже чётко в мануалах обозначен: зачастую быстрее будет 32-битную инструкцию воткнуть вместо 8-битной потому что 8-битная создаёт иллюзию зависимостей которые не ложаться хорошо на суперскалярный конвеер.
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    aa_dav,

    Я вот чего не пойму, знаешь отлично формат IA, но так ничего не сделал. Не написал диз получше кседа, нет ничего кроме недовольства на которое всем пх. Я например реализовал давно очень динамический декодер длин(rlde), но а ты что сделал ?
     
  11. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Сделал, но инженеры Intel отказали.
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    aa_dav,

    Что именно, хотелось бы узнать подробности. Отказали наверно потому что инженеры.
     
  13. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Забыли указать в каких процессорах появились данные команды.