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 
IA64_Convert(Byte * data,SizeT size,UInt32 ip,int encoding)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