Set representative license: LGPL-2.1
[platform/upstream/7zip.git] / C / Bra.c
1 /* Bra.c -- Converters for RISC code\r
2 2010-04-16 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Bra.h"\r
5 \r
6 SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
7 {\r
8   SizeT i;\r
9   if (size < 4)\r
10     return 0;\r
11   size -= 4;\r
12   ip += 8;\r
13   for (i = 0; i <= size; i += 4)\r
14   {\r
15     if (data[i + 3] == 0xEB)\r
16     {\r
17       UInt32 dest;\r
18       UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]);\r
19       src <<= 2;\r
20       if (encoding)\r
21         dest = ip + (UInt32)i + src;\r
22       else\r
23         dest = src - (ip + (UInt32)i);\r
24       dest >>= 2;\r
25       data[i + 2] = (Byte)(dest >> 16);\r
26       data[i + 1] = (Byte)(dest >> 8);\r
27       data[i + 0] = (Byte)dest;\r
28     }\r
29   }\r
30   return i;\r
31 }\r
32 \r
33 SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
34 {\r
35   SizeT i;\r
36   if (size < 4)\r
37     return 0;\r
38   size -= 4;\r
39   ip += 4;\r
40   for (i = 0; i <= size; i += 2)\r
41   {\r
42     if ((data[i + 1] & 0xF8) == 0xF0 &&\r
43         (data[i + 3] & 0xF8) == 0xF8)\r
44     {\r
45       UInt32 dest;\r
46       UInt32 src =\r
47         (((UInt32)data[i + 1] & 0x7) << 19) |\r
48         ((UInt32)data[i + 0] << 11) |\r
49         (((UInt32)data[i + 3] & 0x7) << 8) |\r
50         (data[i + 2]);\r
51       \r
52       src <<= 1;\r
53       if (encoding)\r
54         dest = ip + (UInt32)i + src;\r
55       else\r
56         dest = src - (ip + (UInt32)i);\r
57       dest >>= 1;\r
58       \r
59       data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7));\r
60       data[i + 0] = (Byte)(dest >> 11);\r
61       data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7));\r
62       data[i + 2] = (Byte)dest;\r
63       i += 2;\r
64     }\r
65   }\r
66   return i;\r
67 }\r
68 \r
69 SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
70 {\r
71   SizeT i;\r
72   if (size < 4)\r
73     return 0;\r
74   size -= 4;\r
75   for (i = 0; i <= size; i += 4)\r
76   {\r
77     if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1)\r
78     {\r
79       UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) |\r
80         ((UInt32)data[i + 1] << 16) |\r
81         ((UInt32)data[i + 2] << 8) |\r
82         ((UInt32)data[i + 3] & (~3));\r
83       \r
84       UInt32 dest;\r
85       if (encoding)\r
86         dest = ip + (UInt32)i + src;\r
87       else\r
88         dest = src - (ip + (UInt32)i);\r
89       data[i + 0] = (Byte)(0x48 | ((dest >> 24) &  0x3));\r
90       data[i + 1] = (Byte)(dest >> 16);\r
91       data[i + 2] = (Byte)(dest >> 8);\r
92       data[i + 3] &= 0x3;\r
93       data[i + 3] |= dest;\r
94     }\r
95   }\r
96   return i;\r
97 }\r
98 \r
99 SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)\r
100 {\r
101   UInt32 i;\r
102   if (size < 4)\r
103     return 0;\r
104   size -= 4;\r
105   for (i = 0; i <= size; i += 4)\r
106   {\r
107     if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) ||\r
108         (data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0))\r
109     {\r
110       UInt32 src =\r
111         ((UInt32)data[i + 0] << 24) |\r
112         ((UInt32)data[i + 1] << 16) |\r
113         ((UInt32)data[i + 2] << 8) |\r
114         ((UInt32)data[i + 3]);\r
115       UInt32 dest;\r
116       \r
117       src <<= 2;\r
118       if (encoding)\r
119         dest = ip + i + src;\r
120       else\r
121         dest = src - (ip + i);\r
122       dest >>= 2;\r
123       \r
124       dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000;\r
125 \r
126       data[i + 0] = (Byte)(dest >> 24);\r
127       data[i + 1] = (Byte)(dest >> 16);\r
128       data[i + 2] = (Byte)(dest >> 8);\r
129       data[i + 3] = (Byte)dest;\r
130     }\r
131   }\r
132   return i;\r
133 }\r