aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/torture/crc-linux-5.c
blob: ff3cc25fb667778d906daba5cd684ed0fd14458d (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* { dg-do compile } */
/* { dg-options "-fdump-tree-crc-details" } */
/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Os" "-flto" } } */

#include <stddef.h>
#include <stdint.h>
/* We don't find, as we can't replace the first loop,
   and in the second loop polynomials leading 1 bit is kept too
   (second function's iteration count is 4).  */
typedef unsigned char  u8;
typedef unsigned short u16;
u8 drm_dp_msg_data_crc4(const uint8_t *data, u8 number_of_bytes)
{
  u8 bitmask = 0x80;
  u8 bitshift = 7;
  u8 array_index = 0;
  int number_of_bits = number_of_bytes * 8;
  u16 remainder = 0;

  while (number_of_bits != 0) {
      number_of_bits--;
      remainder <<= 1;
      remainder |= (data[array_index] & bitmask) >> bitshift;
      bitmask >>= 1;
      bitshift--;
      if (bitmask == 0) {
	  bitmask = 0x80;
	  bitshift = 7;
	  array_index++;
	}
      if ((remainder & 0x100) == 0x100)
	remainder ^= 0xd5;
    }

  number_of_bits = 8;
  while (number_of_bits != 0) {
      number_of_bits--;
      remainder <<= 1;
      if ((remainder & 0x100) != 0)
	remainder ^= 0xd5;
    }

  return remainder & 0xff;
}

/* sideband msg handling */
u8 drm_dp_msg_header_crc4(const uint8_t *data, size_t num_nibbles)
{
  u8 bitmask = 0x80;
  u8 bitshift = 7;
  u8 array_index = 0;
  int number_of_bits = num_nibbles * 4;
  u8 remainder = 0;

  while (number_of_bits != 0) {
      number_of_bits--;
      remainder <<= 1;
      remainder |= (data[array_index] & bitmask) >> bitshift;
      bitmask >>= 1;
      bitshift--;
      if (bitmask == 0) {
	  bitmask = 0x80;
	  bitshift = 7;
	  array_index++;
	}
      if ((remainder & 0x10) == 0x10)
	remainder ^= 0x13;
    }

  number_of_bits = 4;
  while (number_of_bits != 0) {
      number_of_bits--;
      remainder <<= 1;
      if ((remainder & 0x10) != 0)
	remainder ^= 0x13;
    }

  return remainder;
}

/* { dg-final { scan-tree-dump "drm_dp_msg_data_crc4 function maybe contains CRC calculation." "crc" } } */