all repos — mgba @ b2d406a411b31acce5bbf0246af32a80c22ca834

mGBA Game Boy Advance Emulator

src/third-party/lzma/BraIA64.c (view raw)

 1/* BraIA64.c -- Converter for IA-64 code
 22017-01-26 : Igor Pavlov : Public domain */
 3
 4#include "Precomp.h"
 5
 6#include "CpuArch.h"
 7#include "Bra.h"
 8
 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}