XmEvaluateAddressSpecifier

NTSTATUS __stdcall XmEvaluateAddressSpecifier(INT64 a1, INT64 *a2, VOID *a3){
  unsigned int v4; 
  unsigned __int8 CodeByte; 
  INT64 v7; 
  VOID *v8; 
  unsigned int v9; 
  bool v10; 
  NTSTATUS result; 
  unsigned int v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned __int64 v16; 
  unsigned int v17; 
  __int16 v18; 
  __int16 v19; 
  unsigned __int16 WordImmediate; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned __int16 v23; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int LongImmediate; 
  unsigned int v31; 
  unsigned int v32; 
  unsigned int v33; 
  unsigned int v34; 
  NTSTATUS v35; 
  NTSTATUS v36; 
  NTSTATUS v37; 
  NTSTATUS v38; 
  unsigned int v39; 
  unsigned int v40; 
  unsigned int v41; 
  unsigned int v42; 
  unsigned int v43; 
  NTSTATUS v44; 
  NTSTATUS v45; 
  NTSTATUS v46; 
  __int16 v47; 
  unsigned __int16 v48; 
  __int16 v49; 
  __int16 v50; 
  unsigned __int16 v51; 
  __int16 v52; 
  unsigned int v53; 
  unsigned int v54; 
  unsigned int v55; 
  CHAR v56; 
  __int16 v57; 
  CHAR v58; 
  __int16 v59; 
  unsigned int v60; 
  unsigned int v61; 

  v4 = 0;
  CodeByte = XmGetCodeByte(a1, (INT64)a2, a3);
  *(_BYTE *)(a1 + 142) = 0;
  v7 = CodeByte >> 6;
  v8 = (VOID *)(CodeByte & 7);
  v9 = (unsigned int)v8 | (8 * v7);
  *(_DWORD *)a2 = (CodeByte >> 3) & 7;
  if( !*(_BYTE *)(a1 + 137) )
  {
    if( v9 <= 0xC )
    {
      if( v9 == 12 )
      {
        v18 = XmGetCodeByte(a1, v7, v8);
        v19 = *(_WORD *)(a1 + 48);
LABEL_24:
        WordImmediate = v18 + v19;
        goto LABEL_25;
      }
      if( v9 == 6 )
      {
        WordImmediate = XmGetWordImmediate(a1);
        goto LABEL_25;
      }
      if( v9 > 6 )
      {
        v24 = v9 - 7;
        if( !v24 )
        {
          v4 = *(unsigned __int16 *)(a1 + 36);
          goto LABEL_19;
        }
        v53 = v24 - 1;
        if( v53 )
        {
          v54 = v53 - 1;
          if( v54 )
          {
            v55 = v54 - 1;
            if( v55 )
            {
              if( v55 != 1 )
                goto LABEL_19;
              v56 = XmGetCodeByte(a1, v7, v8);
              v57 = *(_WORD *)(a1 + 52);
            }
            else
            {
              v56 = XmGetCodeByte(a1, v7, v8);
              v57 = *(_WORD *)(a1 + 48);
            }
            v48 = v56 + *(_WORD *)(a1 + 44) + v57;
            goto LABEL_103;
          }
          v58 = XmGetCodeByte(a1, v7, v8);
          v59 = *(_WORD *)(a1 + 52);
        }
        else
        {
          v58 = XmGetCodeByte(a1, v7, v8);
          v59 = *(_WORD *)(a1 + 48);
        }
        v51 = v58 + *(_WORD *)(a1 + 36) + v59;
      }
      else
      {
        if( v9 )
        {
          v12 = v9 - 1;
          if( v12 )
          {
            v13 = v12 - 1;
            if( v13 )
            {
              v14 = v13 - 1;
              if( v14 )
              {
                v15 = v14 - 1;
                if( v15 )
                {
                  if( v15 == 1 )
                    v4 = *(unsigned __int16 *)(a1 + 52);
                }
                else
                {
                  v4 = *(unsigned __int16 *)(a1 + 48);
                }
                goto LABEL_19;
              }
              v47 = *(_WORD *)(a1 + 52);
            }
            else
            {
              v47 = *(_WORD *)(a1 + 48);
            }
            v48 = *(_WORD *)(a1 + 44) + v47;
            goto LABEL_103;
          }
          v50 = *(_WORD *)(a1 + 52);
        }
        else
        {
          v50 = *(_WORD *)(a1 + 48);
        }
        v51 = *(_WORD *)(a1 + 36) + v50;
      }
    }
    else
    {
      if( v9 > 0x13 )
      {
        if( v9 == 20 )
        {
          WordImmediate = *(_WORD *)(a1 + 48) + XmGetWordImmediate(a1);
          goto LABEL_25;
        }
        if( v9 == 21 )
        {
          WordImmediate = *(_WORD *)(a1 + 52) + XmGetWordImmediate(a1);
          goto LABEL_25;
        }
        if( v9 != 22 )
        {
          v10 = v9 <= 0x17;
          if( v9 != 23 )
            goto LABEL_8;
          WordImmediate = *(_WORD *)(a1 + 36) + XmGetWordImmediate(a1);
LABEL_25:
          v4 = WordImmediate;
          goto LABEL_19;
        }
        v23 = *(_WORD *)(a1 + 44) + XmGetWordImmediate(a1);
        goto LABEL_32;
      }
      if( v9 == 19 )
      {
        v49 = *(_WORD *)(a1 + 52) + XmGetWordImmediate(a1);
LABEL_102:
        v48 = v49 + *(_WORD *)(a1 + 44);
LABEL_103:
        v4 = v48;
LABEL_33:
        if( !*(_BYTE *)(a1 + 140) )
          *(_DWORD *)(a1 + 116) = 2;
        goto LABEL_19;
      }
      v21 = v9 - 13;
      if( !v21 )
      {
        v18 = XmGetCodeByte(a1, v7, v8);
        v19 = *(_WORD *)(a1 + 52);
        goto LABEL_24;
      }
      v22 = v21 - 1;
      if( !v22 )
      {
        v23 = XmGetCodeByte(a1, v7, v8) + *(_WORD *)(a1 + 44);
LABEL_32:
        v4 = v23;
        goto LABEL_33;
      }
      v25 = v22 - 1;
      if( !v25 )
      {
        v18 = XmGetCodeByte(a1, v7, v8);
        v19 = *(_WORD *)(a1 + 36);
        goto LABEL_24;
      }
      v60 = v25 - 1;
      if( v60 )
      {
        v61 = v60 - 1;
        if( v61 )
        {
          if( v61 != 1 )
            goto LABEL_19;
          v49 = *(_WORD *)(a1 + 48) + XmGetWordImmediate(a1);
          goto LABEL_102;
        }
        v52 = *(_WORD *)(a1 + 52) + XmGetWordImmediate(a1);
      }
      else
      {
        v52 = *(_WORD *)(a1 + 48) + XmGetWordImmediate(a1);
      }
      v51 = v52 + *(_WORD *)(a1 + 36);
    }
    v4 = v51;
    goto LABEL_19;
  }
  if( v9 <= 0xC )
  {
    if( v9 == 12 )
      goto LABEL_97;
    if( v9 <= 6 )
    {
      if( v9 == 6 )
      {
        v4 = *(_DWORD *)(a1 + 48);
        goto LABEL_19;
      }
      if( !v9 )
      {
        v4 = *(_DWORD *)(a1 + 24);
        goto LABEL_19;
      }
      v26 = v9 - 1;
      if( !v26 )
      {
        v4 = *(_DWORD *)(a1 + 28);
        goto LABEL_19;
      }
      v27 = v26 - 1;
      if( !v27 )
      {
        v4 = *(_DWORD *)(a1 + 32);
        goto LABEL_19;
      }
      v28 = v27 - 1;
      if( !v28 )
      {
        v4 = *(_DWORD *)(a1 + 36);
        goto LABEL_19;
      }
      v29 = v28 - 1;
      if( v29 )
      {
        if( v29 != 1 )
          goto LABEL_19;
        LongImmediate = XmGetLongImmediate(a1);
        goto LABEL_98;
      }
LABEL_97:
      LongImmediate = XmEvaluateIndexSpecifier(a1, v7, v8);
LABEL_98:
      v4 = LongImmediate;
      goto LABEL_19;
    }
    v31 = v9 - 7;
    if( !v31 )
    {
      v4 = *(_DWORD *)(a1 + 52);
      goto LABEL_19;
    }
    v32 = v31 - 1;
    if( v32 )
    {
      v33 = v32 - 1;
      if( v33 )
      {
        v34 = v33 - 1;
        if( v34 )
        {
          if( v34 != 1 )
            goto LABEL_19;
          v35 = XmGetCodeByte(a1, v7, v8);
          goto LABEL_64;
        }
        v36 = XmGetCodeByte(a1, v7, v8);
LABEL_66:
        v4 = *(_DWORD *)(a1 + 32) + v36;
        goto LABEL_19;
      }
      v37 = XmGetCodeByte(a1, v7, v8);
      goto LABEL_69;
    }
    v38 = XmGetCodeByte(a1, v7, v8);
    goto LABEL_72;
  }
  if( v9 <= 0x13 )
  {
    if( v9 == 19 )
    {
      v35 = XmGetLongImmediate(a1);
LABEL_64:
      v4 = *(_DWORD *)(a1 + 36) + v35;
      goto LABEL_19;
    }
    v39 = v9 - 13;
    if( v39 )
    {
      v40 = v39 - 1;
      if( v40 )
      {
        v41 = v40 - 1;
        if( v41 )
        {
          v42 = v41 - 1;
          if( v42 )
          {
            v43 = v42 - 1;
            if( v43 )
            {
              if( v43 != 1 )
                goto LABEL_19;
              v36 = XmGetLongImmediate(a1);
              goto LABEL_66;
            }
            v37 = XmGetLongImmediate(a1);
LABEL_69:
            v4 = *(_DWORD *)(a1 + 28) + v37;
            goto LABEL_19;
          }
          v38 = XmGetLongImmediate(a1);
LABEL_72:
          v4 = *(_DWORD *)(a1 + 24) + v38;
          goto LABEL_19;
        }
        v44 = XmGetCodeByte(a1, v7, v8);
LABEL_85:
        v4 = *(_DWORD *)(a1 + 52) + v44;
        goto LABEL_19;
      }
      v45 = XmGetCodeByte(a1, v7, v8);
LABEL_88:
      v4 = *(_DWORD *)(a1 + 48) + v45;
      goto LABEL_19;
    }
    v46 = XmGetCodeByte(a1, v7, v8);
LABEL_91:
    v4 = *(_DWORD *)(a1 + 44) + v46;
    goto LABEL_33;
  }
  switch( v9 )
  {
    case 0x14u:
      goto LABEL_97;
    case 0x15u:
      v46 = XmGetLongImmediate(a1);
      goto LABEL_91;
    case 0x16u:
      v45 = XmGetLongImmediate(a1);
      goto LABEL_88;
  }
  v10 = v9 <= 0x17;
  if( v9 == 23 )
  {
    v44 = XmGetLongImmediate(a1);
    goto LABEL_85;
  }
LABEL_8:
  if( !v10 )
  {
    *(_BYTE *)(a1 + 142) = 1;
    return XmGetRegisterAddress(a1, CodeByte & 7);
  }
LABEL_19:
  if( *(_BYTE *)(a1 + 143) )
  {
    result = (unsigned __int16)v4;
    if( *(_DWORD *)(a1 + 120) != 1 )
      result = v4;
    *(_DWORD *)(a1 + 128) = result;
  }
  else
  {
    v16 = *(unsigned int *)(a1 + 116);
    v17 = *(unsigned __int16 *)(a1 + 2 * v16 + 68);
    if( v4 > v17 || v4 + *(_DWORD *)(a1 + 120) > v17 )
      longjmp((unsigned __int64 *)(a1 + 160), (VOID *)0xE, (VOID *)v16);
    *(_DWORD *)(a1 + 128) = v4;
    return(unsigned int)x86BiosTranslateAddress(*(_WORD *)(a1 + 2 * v16 + 56), v4);
  }
  return result;
}

Referenced by:

XmBitScanGeneral
XmEffectiveOffset
XmGeneralBitOffset
XmGeneralRegister
XmGroup1General
XmGroup1Immediate
XmGroup2By1
XmGroup2ByByte
XmGroup2ByCL
XmGroup3General
XmGroup45General
XmGroup7General
XmGroup8BitOffset
XmImulImmediate
XmLoadSegment
XmMoveGeneral
XmMoveImmediate
XmMoveSegment
XmMoveXxGeneral
XmPopGeneral
XmSetccByte
XmShiftDouble