text: /* BraIA64.c -- Converter for IA-64 code
  2017-01-26 : Igor Pavlov : Public domain */
  
  #include "Precomp.h"
  
  #include "CpuArch.h"
  #include "Bra.h"
  
  SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
  {
    SizeT i;
    if (size < 16)
      return 0;
    size -= 16;
    i = 0;
    do
    {
      unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3;
      if (m)
      {
        m++;
        do
        {
          Byte *p = data + (i + (size_t)m * 5 - 8);
          if (((p[3] >> m) & 15) == 5
              && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0)
          {
            unsigned raw = GetUi32(p);
            unsigned v = raw >> m;
            v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3);
            
            v <<= 4;
            if (encoding)
              v += ip + (UInt32)i;
            else
              v -= ip + (UInt32)i;
            v >>= 4;
            
            v &= 0x1FFFFF;
            v += 0x700000;
            v &= 0x8FFFFF;
            raw &= ~((UInt32)0x8FFFFF << m);
            raw |= (v << m);
            SetUi32(p, raw);
          }
        }
        while (++m <= 4);
      }
      i += 16;
    }
    while (i <= size);
    return i;
  }
  