Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Копаем клиент (http://mangos.ytdb.ru/forumdisplay.php?f=35)
-   -   [13329] Quaternion [Packed] <-> [Unpacked] (http://mangos.ytdb.ru/showthread.php?t=3198)

Konctantin 12.12.2010 17:10

[13329] Quaternion [Packed] <-> [Unpacked]
 
Вот разбирался с ротацией ГО и дошел до упаковки данных этой структуры обратно в тип ulong, но в клиенте нашел только одну функцию, которая могла бы это сделать:
Код:

//----- (0041F2A0) --------------------------------------------------------
// PackedQuaternion
void *__thiscall sub_41F2A0(void *this, Quaternion *a2)
{
  int _EDI; // edi@1
  unsigned __int8 _CF; // cf@1
  unsigned __int8 _ZF; // zf@1
  signed int v8; // esi@2
  void *result; // eax@4
  float v12; // ST00_4@4
  int v13; // eax@4
  int v16; // ebx@4
  float v17; // ST00_4@4
  int v18; // ST14_4@4
  signed __int64 _QAX; // qax@4
  int v20; // ebx@4
  __int64 _QT0; // qt0@4
  int v22; // edi@4
  float v23; // ST00_4@4
  int v24; // eax@4
  __int64 v25; // qax@4
  int v26; // ebx@4
  void *v27; // [sp+10h] [bp-8h]@1

  __asm { xorps  xmm0, xmm0 }
  _EDI = (int)a2;
  __asm { comiss  xmm0, dword ptr [edi+0Ch] }
  v27 = this;
  if ( _CF | _ZF )
    v8 = 1;
  else
    v8 = -1;
  __asm
  {
    movss  xmm0, dword ptr [edi+4]
    mulss  xmm0, ds:dword_AB2C64
    movss  [esp+18h+var_18], xmm0
  }
  v13 = v8 * sub_408BC0(v12);
  __asm
  {
    movss  xmm0, dword ptr [edi]
    mulss  xmm0, ds:dword_AB2C60
  }
  v13 &= 0x1FFFFFu;
  v16 = v13;
  __asm { movss  [esp+18h+var_18], xmm0 }
  v18 = (unsigned __int64)v13 >> 32;
  _QAX = (signed __int64)(v8 * sub_408BC0(v17)) << 21;
  v20 = _QAX | v16;
  HIDWORD(_QT0) = HIDWORD(_QAX) | v18;
  LODWORD(_QT0) = v20;
  v22 = (unsigned __int64)(_QT0 << 21) >> 32;
  LODWORD(_QAX) = a2;
  __asm
  {
    movss  xmm0, dword ptr [eax+8]
    mulss  xmm0, ds:dword_AB2C64
    movss  [esp+18h+var_18], xmm0
  }
  v24 = v8 * sub_408BC0(v23);
  v25 = v24 & 0x1FFFFF;
  v26 = v25 | (v20 << 21);
  result = v27;
  *((_DWORD *)v27 + 1) = HIDWORD(v25) | v22;
  *(_DWORD *)v27 = v26;
  return result;
}

Но не получается привести ее в читабельный вид, Не подскажите, как это сделать.

ЗЫ. если кому-то интересно - то вот сама структура:
http://paste2.org/p/1138036

TOM_RUS 12.12.2010 17:39

Ну вид не читабельный потому что SSE инструкции в hexrays 1.1 не поддерживаются, а утечек более свежей версии не было.
Код:

2010/02/01 Hex-Rays v1.2
+ SSE scalar floating point support

http://www.hex-rays.com/news1.shtml#101001

zergtmn 12.12.2010 22:13

А что в SIMD непонятного?

Konctantin 12.12.2010 22:58

меня смущает то, что я не знаю, что возвращает эта функция
Код:

sub_408BC0(v17)
и то, что делается тут
Код:

  __asm
  {
    movss  xmm0, dword ptr [eax+8]
    mulss  xmm0, ds:dword_AB2C64
    movss  [esp+18h+var_18], xmm0
  }

я понимаю, что тут идет упаковка данных, но воспроизвести не получается, по этому и написал на форуме...


Текущее время: 03:06. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS