Source code

Revision control

Copy as Markdown

Other Tools

/* Bra.c -- Converters for RISC code↩
2017-04-04 : Igor Pavlov : Public domain */
#include "Precomp.h"
#include "CpuArch.h"
#include "Bra.h"
SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)↩
{↩
Byte *p;↩
const Byte *lim;↩
size &= ~(size_t)3;↩
ip += 4;↩
p = data;↩
lim = data + size;↩
if (encoding)↩
for (;;)↩
{↩
for (;;)↩
{↩
if (p >= lim)↩
return p - data;↩
p += 4;↩
if (p[-1] == 0xEB)↩
break;↩
}↩
{↩
UInt32 v = GetUi32(p - 4);↩
v <<= 2;↩
v += ip + (UInt32)(p - data);↩
v >>= 2;↩
v &= 0x00FFFFFF;↩
v |= 0xEB000000;↩
SetUi32(p - 4, v);↩
}↩
}↩
for (;;)↩
{↩
for (;;)↩
{↩
if (p >= lim)↩
return p - data;↩
p += 4;↩
if (p[-1] == 0xEB)↩
break;↩
}↩
{↩
UInt32 v = GetUi32(p - 4);↩
v <<= 2;↩
v -= ip + (UInt32)(p - data);↩
v >>= 2;↩
v &= 0x00FFFFFF;↩
v |= 0xEB000000;↩
SetUi32(p - 4, v);↩
}↩
}↩
}↩
SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)↩
{↩
Byte *p;↩
const Byte *lim;↩
size &= ~(size_t)1;↩
p = data;↩
lim = data + size - 4;↩
if (encoding)↩
for (;;)↩
{↩
UInt32 b1;↩
for (;;)↩
{↩
UInt32 b3;↩
if (p > lim)↩
return p - data;↩
b1 = p[1];↩
b3 = p[3];↩
p += 2;↩
b1 ^= 8;↩
if ((b3 & b1) >= 0xF8)↩
break;↩
}↩
{↩
UInt32 v =↩
((UInt32)b1 << 19)↩
+ (((UInt32)p[1] & 0x7) << 8)↩
+ (((UInt32)p[-2] << 11))↩
+ (p[0]);↩
p += 2;↩
{↩
UInt32 cur = (ip + (UInt32)(p - data)) >> 1;↩
v += cur;↩
}↩
p[-4] = (Byte)(v >> 11);↩
p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));↩
p[-2] = (Byte)v;↩
p[-1] = (Byte)(0xF8 | (v >> 8));↩
}↩
}↩
for (;;)↩
{↩
UInt32 b1;↩
for (;;)↩
{↩
UInt32 b3;↩
if (p > lim)↩
return p - data;↩
b1 = p[1];↩
b3 = p[3];↩
p += 2;↩
b1 ^= 8;↩
if ((b3 & b1) >= 0xF8)↩
break;↩
}↩
{↩
UInt32 v =↩
((UInt32)b1 << 19)↩
+ (((UInt32)p[1] & 0x7) << 8)↩
+ (((UInt32)p[-2] << 11))↩
+ (p[0]);↩
p += 2;↩
{↩
UInt32 cur = (ip + (UInt32)(p - data)) >> 1;↩
v -= cur;↩
}↩
/*↩
SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000));↩
SetUi16(p - 2, (UInt16)(v | 0xF800));↩
*/
p[-4] = (Byte)(v >> 11);↩
p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));↩
p[-2] = (Byte)v;↩
p[-1] = (Byte)(0xF8 | (v >> 8));↩
}↩
}↩
}↩
SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)↩
{↩
Byte *p;↩
const Byte *lim;↩
size &= ~(size_t)3;↩
ip -= 4;↩
p = data;↩
lim = data + size;↩
for (;;)↩
{↩
for (;;)↩
{↩
if (p >= lim)↩
return p - data;↩
p += 4;↩
/* if ((v & 0xFC000003) == 0x48000001) */
if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1)↩
break;↩
}↩
{↩
UInt32 v = GetBe32(p - 4);↩
if (encoding)↩
v += ip + (UInt32)(p - data);↩
else
v -= ip + (UInt32)(p - data);↩
v &= 0x03FFFFFF;↩
v |= 0x48000000;↩
SetBe32(p - 4, v);↩
}↩
}↩
}↩
SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)↩
{↩
Byte *p;↩
const Byte *lim;↩
size &= ~(size_t)3;↩
ip -= 4;↩
p = data;↩
lim = data + size;↩
for (;;)↩
{↩
for (;;)↩
{↩
if (p >= lim)↩
return p - data;↩
/*↩
v = GetBe32(p);↩
p += 4;↩
m = v + ((UInt32)5 << 29);↩
m ^= (UInt32)7 << 29;↩
m += (UInt32)1 << 22;↩
if ((m & ((UInt32)0x1FF << 23)) == 0)↩
break;↩
*/
p += 4;↩
if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) ||↩
(p[-4] == 0x7F && (p[-3] >= 0xC0)))↩
break;↩
}↩
{↩
UInt32 v = GetBe32(p - 4);↩
v <<= 2;↩
if (encoding)↩
v += ip + (UInt32)(p - data);↩
else
v -= ip + (UInt32)(p - data);↩
v &= 0x01FFFFFF;↩
v -= (UInt32)1 << 24;↩
v ^= 0xFF000000;↩
v >>= 2;↩
v |= 0x40000000;↩
SetBe32(p - 4, v);↩
}↩
}↩
}↩