54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* 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;
							 | 
						||
| 
								 | 
							
								}
							 |