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)9SizeT 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