XmSubOperands

INT64 __fastcall XmSubOperands(_DWORD *a1, UINT64 a2){
  int v2; 
  int v3; 
  char v4; 
  _DWORD *v5; 
  int v6; 
  int v7; 
  char v8; 
  unsigned __int8 v9; 
  int v10; 
  INT64 v11; 
  int v12; 
  int v13; 
  unsigned int v14; 
  INT64 result; 
  unsigned int v16; 
  unsigned __int16 v17; 
  unsigned __int16 v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  v2 = a1[30];
  v3 = 0;
  v21 = 0;
  v4 = a2;
  v5 = a1;
  v6 = 0;
  if( v2 )
  {
    if( v2 == 3 )
    {
      v19 = a1[26];
      v8 = 31;
      v20 = a1[27];
      LOBYTE(v6) = v19 - (unsigned int)a2 < v20;
      LOBYTE(v3) = v19 < (unsigned int)a2;
      v10 = v3 | v6;
      v11 = v19 - (_DWORD)a2 - v20;
      goto LABEL_4;
    }
    v17 = *((_WORD *)a1 + 52);
    v8 = 15;
    v18 = *((_WORD *)a1 + 54);
    LOBYTE(v6) = (unsigned __int16)(v17 - a2) < v18;
    LOBYTE(v3) = v17 < (unsigned __int16)a2;
    v10 = v3 | v6;
    LOWORD(v21) = v17 - a2 - v18;
  }
  else
  {
    v7 = *((unsigned __int8 *)a1 + 104);
    v8 = 7;
    v9 = *((_BYTE *)a1 + 108);
    LOBYTE(v6) = (unsigned __int8)(v7 - a2) < v9;
    LOBYTE(v3) = (unsigned __int8)v7 < (unsigned __int8)a2;
    v10 = v3 | v6;
    LOBYTE(v21) = v7 - a2 - v9;
  }
  v11 = v21;
LABEL_4:
  v12 = v5[31];
  v13 = v12;
  if( v12 != 13 && v12 != 87 )
  {
    XmStoreResult((INT64)v5, v11);
    v13 = v5[31];
  }
  v14 = v5[4];
  if( v13 != 31 )
    v14 = v10 | v14 & 0xFFFFFFFE;
  result = v5[27] & 0xF;
  v16 = v14 & 0xFFFFFFEB | ((v5[26] & 0xF) - (_BYTE)result - v4) & 0x10 | (4
                                                                         * (((*((_BYTE *)XmBitCount + (v11 & 0xF))
                                                                            + *((_BYTE *)XmBitCount
                                                                              + ((unsigned __int8)v11 >> 4))) & 1) == 0));
  if( v13 != 87 )
  {
    result = (unsigned int)-(int)v11;
    v16 = ((_DWORD)v11 == 0 ? 0x40 : 0) | v16 & 0xFFFFFFBF;
  }
  v5[4] = v16 & 0xFFFFF77F | ((((unsigned int)v11 >> v8) & 1 | (16
                                                              * (((unsigned __int8)v10 ^ (unsigned __int8)(((unsigned int)v11 ^ v5[26] ^ v5[27]) >> v8)) & 1))) << 7);
  return result;
}

Referenced by:

XmCmpxchgOp
XmDecOp
XmNegOp
XmSbbOp
XmSubOp