Home | History | Annotate | Download | only in C
      1 /* BraIA64.c -- Converter for IA-64 code
      2 2017-01-26 : Igor Pavlov : Public domain */
      3 
      4 #include "Precomp.h"
      5 
      6 #include "CpuArch.h"
      7 #include "Bra.h"
      8 
      9 SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
     10 {
     11   SizeT i;
     12   if (size < 16)
     13     return 0;
     14   size -= 16;
     15   i = 0;
     16   do
     17   {
     18     unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3;
     19     if (m)
     20     {
     21       m++;
     22       do
     23       {
     24         Byte *p = data + (i + (size_t)m * 5 - 8);
     25         if (((p[3] >> m) & 15) == 5
     26             && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0)
     27         {
     28           unsigned raw = GetUi32(p);
     29           unsigned v = raw >> m;
     30           v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3);
     31 
     32           v <<= 4;
     33           if (encoding)
     34             v += ip + (UInt32)i;
     35           else
     36             v -= ip + (UInt32)i;
     37           v >>= 4;
     38 
     39           v &= 0x1FFFFF;
     40           v += 0x700000;
     41           v &= 0x8FFFFF;
     42           raw &= ~((UInt32)0x8FFFFF << m);
     43           raw |= (v << m);
     44           SetUi32(p, raw);
     45         }
     46       }
     47       while (++m <= 4);
     48     }
     49     i += 16;
     50   }
     51   while (i <= size);
     52   return i;
     53 }
     54