XmShrdOp

_WORD *__fastcall XmShrdOp(INT64 a1){
  unsigned __int8 v1; 
  __int16 v2; 
  int v3; 
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v6; 
  unsigned int v7; 
  unsigned __int8 v8; 
  v1 = *(_BYTE *)(a1 + 144);
  v2 = 0;
  v3 = *(_DWORD *)(a1 + 108);
  v4 = *(_DWORD *)(a1 + 104);
  if( v1 )
  {
    if( *(_DWORD *)(a1 + 120) == 3 )
    {
      if( v1 == 1 )
        *(_DWORD *)(a1 + 16) ^= (*(_DWORD *)(a1 + 16) ^ (v3 << 11) ^ (v4 >> 20)) & 0x800;
      v5 = v4 >> (v1 - 1);
      v4 = (v4 >> v1) | (v3 << (32 - v1));
      v6 = v4 >> 31;
    }
    else
    {
      if( v1 == 1 )
        *(_DWORD *)(a1 + 16) ^= (*(_DWORD *)(a1 + 16) ^ (v3 << 11) ^ (v4 >> 4)) & 0x800;
      v7 = (unsigned __int16)v3;
      v8 = v1 - 16;
      if( v1 <= 0x10u )
        v8 = v1;
      if( v1 <= 0x10u )
        v7 = v4;
      v5 = v7 >> (v8 - 1);
      if( v1 <= 0x10u )
        v2 = v3;
      v4 = (unsigned __int16)((v7 >> v8) | (v2 << (16 - v8)));
      v6 = v4 >> 15;
    }
    *(_DWORD *)(a1 + 16) = v5 & 1 | *(_DWORD *)(a1 + 16) & 0xFFFFFF3A | (v4 == 0 ? 0x40 : 0) | (4
                                                                                              * ((32 * v6) | (((*((_BYTE *)XmBitCount + (v4 & 0xF)) + *((_BYTE *)XmBitCount + ((unsigned __int8)v4 >> 4))) & 1) == 0)));
  }
  return XmStoreResult(a1, v4);
}

Referenced by:

No references.