Coverage Report

Created: 2026-01-17 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/lzma-fuzz/sdk/C/Bra.c
Line
Count
Source
1
/* Bra.c -- Converters for RISC code
2
2017-04-04 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include "CpuArch.h"
7
#include "Bra.h"
8
9
SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
10
4.87k
{
11
4.87k
  Byte *p;
12
4.87k
  const Byte *lim;
13
4.87k
  size &= ~(size_t)3;
14
4.87k
  ip += 4;
15
4.87k
  p = data;
16
4.87k
  lim = data + size;
17
18
4.87k
  if (encoding)
19
20
2.08k
  for (;;)
21
105k
  {
22
105k
    for (;;)
23
15.1M
    {
24
15.1M
      if (p >= lim)
25
2.08k
        return p - data;
26
15.1M
      p += 4;
27
15.1M
      if (p[-1] == 0xEB)
28
103k
        break;
29
15.1M
    }
30
103k
    {
31
103k
      UInt32 v = GetUi32(p - 4);
32
103k
      v <<= 2;
33
103k
        v += ip + (UInt32)(p - data);
34
103k
      v >>= 2;
35
103k
      v &= 0x00FFFFFF;
36
103k
      v |= 0xEB000000;
37
103k
      SetUi32(p - 4, v);
38
103k
    }
39
103k
  }
40
41
2.79k
  for (;;)
42
788k
  {
43
788k
    for (;;)
44
15.9M
    {
45
15.9M
      if (p >= lim)
46
2.79k
        return p - data;
47
15.9M
      p += 4;
48
15.9M
      if (p[-1] == 0xEB)
49
785k
        break;
50
15.9M
    }
51
785k
    {
52
785k
      UInt32 v = GetUi32(p - 4);
53
785k
      v <<= 2;
54
785k
        v -= ip + (UInt32)(p - data);
55
785k
      v >>= 2;
56
785k
      v &= 0x00FFFFFF;
57
785k
      v |= 0xEB000000;
58
785k
      SetUi32(p - 4, v);
59
785k
    }
60
785k
  }
61
2.79k
}
62
63
64
SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
65
6.16k
{
66
6.16k
  Byte *p;
67
6.16k
  const Byte *lim;
68
6.16k
  size &= ~(size_t)1;
69
6.16k
  p = data;
70
6.16k
  lim = data + size - 4;
71
72
6.16k
  if (encoding)
73
  
74
2.23k
  for (;;)
75
17.7k
  {
76
17.7k
    UInt32 b1;
77
17.7k
    for (;;)
78
32.9M
    {
79
32.9M
      UInt32 b3;
80
32.9M
      if (p > lim)
81
2.23k
        return p - data;
82
32.9M
      b1 = p[1];
83
32.9M
      b3 = p[3];
84
32.9M
      p += 2;
85
32.9M
      b1 ^= 8;
86
32.9M
      if ((b3 & b1) >= 0xF8)
87
15.5k
        break;
88
32.9M
    }
89
15.5k
    {
90
15.5k
      UInt32 v =
91
15.5k
             ((UInt32)b1 << 19)
92
15.5k
          + (((UInt32)p[1] & 0x7) << 8)
93
15.5k
          + (((UInt32)p[-2] << 11))
94
15.5k
          + (p[0]);
95
96
15.5k
      p += 2;
97
15.5k
      {
98
15.5k
        UInt32 cur = (ip + (UInt32)(p - data)) >> 1;
99
15.5k
          v += cur;
100
15.5k
      }
101
102
15.5k
      p[-4] = (Byte)(v >> 11);
103
15.5k
      p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));
104
15.5k
      p[-2] = (Byte)v;
105
15.5k
      p[-1] = (Byte)(0xF8 | (v >> 8));
106
15.5k
    }
107
15.5k
  }
108
  
109
3.93k
  for (;;)
110
19.7k
  {
111
19.7k
    UInt32 b1;
112
19.7k
    for (;;)
113
36.7M
    {
114
36.7M
      UInt32 b3;
115
36.7M
      if (p > lim)
116
3.93k
        return p - data;
117
36.7M
      b1 = p[1];
118
36.7M
      b3 = p[3];
119
36.7M
      p += 2;
120
36.7M
      b1 ^= 8;
121
36.7M
      if ((b3 & b1) >= 0xF8)
122
15.8k
        break;
123
36.7M
    }
124
15.8k
    {
125
15.8k
      UInt32 v =
126
15.8k
             ((UInt32)b1 << 19)
127
15.8k
          + (((UInt32)p[1] & 0x7) << 8)
128
15.8k
          + (((UInt32)p[-2] << 11))
129
15.8k
          + (p[0]);
130
131
15.8k
      p += 2;
132
15.8k
      {
133
15.8k
        UInt32 cur = (ip + (UInt32)(p - data)) >> 1;
134
15.8k
          v -= cur;
135
15.8k
      }
136
137
      /*
138
      SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000));
139
      SetUi16(p - 2, (UInt16)(v | 0xF800));
140
      */
141
      
142
15.8k
      p[-4] = (Byte)(v >> 11);
143
15.8k
      p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));
144
15.8k
      p[-2] = (Byte)v;
145
15.8k
      p[-1] = (Byte)(0xF8 | (v >> 8));
146
15.8k
    }
147
15.8k
  }
148
3.93k
}
149
150
151
SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
152
9.46k
{
153
9.46k
  Byte *p;
154
9.46k
  const Byte *lim;
155
9.46k
  size &= ~(size_t)3;
156
9.46k
  ip -= 4;
157
9.46k
  p = data;
158
9.46k
  lim = data + size;
159
160
9.46k
  for (;;)
161
6.02M
  {
162
6.02M
    for (;;)
163
44.0M
    {
164
44.0M
      if (p >= lim)
165
9.46k
        return p - data;
166
44.0M
      p += 4;
167
      /* if ((v & 0xFC000003) == 0x48000001) */
168
44.0M
      if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1)
169
6.01M
        break;
170
44.0M
    }
171
6.01M
    {
172
6.01M
      UInt32 v = GetBe32(p - 4);
173
6.01M
      if (encoding)
174
2.18M
        v += ip + (UInt32)(p - data);
175
3.82M
      else
176
3.82M
        v -= ip + (UInt32)(p - data);
177
6.01M
      v &= 0x03FFFFFF;
178
6.01M
      v |= 0x48000000;
179
6.01M
      SetBe32(p - 4, v);
180
6.01M
    }
181
6.01M
  }
182
9.46k
}
183
184
185
SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
186
10.4k
{
187
10.4k
  Byte *p;
188
10.4k
  const Byte *lim;
189
10.4k
  size &= ~(size_t)3;
190
10.4k
  ip -= 4;
191
10.4k
  p = data;
192
10.4k
  lim = data + size;
193
194
10.4k
  for (;;)
195
3.24M
  {
196
3.24M
    for (;;)
197
47.0M
    {
198
47.0M
      if (p >= lim)
199
10.4k
        return p - data;
200
      /*
201
      v = GetBe32(p);
202
      p += 4;
203
      m = v + ((UInt32)5 << 29);
204
      m ^= (UInt32)7 << 29;
205
      m += (UInt32)1 << 22;
206
      if ((m & ((UInt32)0x1FF << 23)) == 0)
207
        break;
208
      */
209
47.0M
      p += 4;
210
47.0M
      if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) ||
211
45.0M
          (p[-4] == 0x7F && (p[-3] >= 0xC0)))
212
3.23M
        break;
213
47.0M
    }
214
3.23M
    {
215
3.23M
      UInt32 v = GetBe32(p - 4);
216
3.23M
      v <<= 2;
217
3.23M
      if (encoding)
218
1.25M
        v += ip + (UInt32)(p - data);
219
1.98M
      else
220
1.98M
        v -= ip + (UInt32)(p - data);
221
      
222
3.23M
      v &= 0x01FFFFFF;
223
3.23M
      v -= (UInt32)1 << 24;
224
3.23M
      v ^= 0xFF000000;
225
3.23M
      v >>= 2;
226
3.23M
      v |= 0x40000000;
227
3.23M
      SetBe32(p - 4, v);
228
3.23M
    }
229
3.23M
  }
230
10.4k
}