aboutsummaryrefslogtreecommitdiff
path: root/bug-2684/bug-2684.cpp
blob: f1da22d3098d3f1da3aa799965e90fb7e9d51994 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define FUNC_MACRO (sizeof(unsigned long) - 1)

void FUNC(void* d, void const* s, unsigned long n)
{
  const unsigned long *ass = (const unsigned long *)s;
  unsigned long* adt = (unsigned long*)d;
  const unsigned char* ss = (const unsigned char*)s;
  unsigned char* dt = (unsigned char*)d;
  unsigned long i = 0;

  if (n >= 16)
  {
    if (((((unsigned long)ss) & FUNC_MACRO) == 0) && ((((unsigned long)dt) & FUNC_MACRO) == 0))
    {
      unsigned long asize = n / sizeof(unsigned long);
      unsigned long rem = n & FUNC_MACRO;
      for (i = 0; i < (asize - 3); i += 4)
      {
        adt[i] = ass[i];
        adt[i+1] = ass[i+1];
        adt[i+2] = ass[i+2];
        adt[i+3] = ass[i+3];
      }

      while (i < asize)
      {
        adt[i] = ass[i];
        ++i;
      }
      i = n - rem;
    }
    else
    {
      for (i = 0 ; (i + 15) < n; i += 16)
      {
        dt[i] = ss[i];
        dt[i+1] = ss[i+1];
        dt[i+2] = ss[i+2];
        dt[i+3] = ss[i+3];
        dt[i+4] = ss[i+4];
        dt[i+5] = ss[i+5];
        dt[i+6] = ss[i+6];
        dt[i+7] = ss[i+7];
        dt[i+8] = ss[i+8];
        dt[i+9] = ss[i+9];
        dt[i+10] = ss[i+10];
        dt[i+11] = ss[i+11];
        dt[i+12] = ss[i+12];
        dt[i+13] = ss[i+13];
        dt[i+14] = ss[i+14];
        dt[i+15] = ss[i+15];
      }
    }

  }
  while (i < n)
  {
    dt[i] = ss[i];
    ++i;
  }
}