/* Bra86.c -- Converter for x86 code (BCJ)
2017-04-03 : Igor Pavlov : Public domain */
#include "Precomp.h"
#include "Bra.h"
#define Test86MSByte(b) ((((b) + 1 ) & 0 xFE) == 0 )
SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding)
{
SizeT pos = 0 ;
UInt32 mask = *state & 7 ;
if (size < 5 )
return 0 ;
size -= 4 ;
ip += 5 ;
for (;;)
{
Byte *p = data + pos;
const Byte *limit = data + size;
for (; p < limit; p++)
if ((*p & 0 xFE) == 0 xE8)
break ;
{
SizeT d = (SizeT)(p - data - pos);
pos = (SizeT)(p - data);
if (p >= limit)
{
*state = (d > 2 ? 0 : mask >> (unsigned )d);
return pos;
}
if (d > 2 )
mask = 0 ;
else
{
mask >>= (unsigned )d;
if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1 ) + 1 ])))
{
mask = (mask >> 1 ) | 4 ;
pos++;
continue ;
}
}
}
if (Test86MSByte(p[4 ]))
{
UInt32 v = ((UInt32)p[4 ] << 24 ) | ((UInt32)p[3 ] << 16 ) | ((UInt32)p[2 ] << 8 ) | ((UInt32)p[1 ]);
UInt32 cur = ip + (UInt32)pos;
pos += 5 ;
if (encoding)
v += cur;
else
v -= cur;
if (mask != 0 )
{
unsigned sh = (mask & 6 ) << 2 ;
if (Test86MSByte((Byte)(v >> sh)))
{
v ^= (((UInt32)0 x100 << sh) - 1 );
if (encoding)
v += cur;
else
v -= cur;
}
mask = 0 ;
}
p[1 ] = (Byte)v;
p[2 ] = (Byte)(v >> 8 );
p[3 ] = (Byte)(v >> 16 );
p[4 ] = (Byte)(0 - ((v >> 24 ) & 1 ));
}
else
{
mask = (mask >> 1 ) | 4 ;
pos++;
}
}
}
Messung V0.5 in Prozent C=93 H=96 G=94
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland