mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-27 06:12:19 +00:00
53 lines
1.1 KiB
C
53 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;
|
|
}
|