1 /* { dg-do run } */
2 
3 #include <stdlib.h>
4 
5 #define NUM_OF_STATES 4
6 typedef unsigned int entry_t[2];
7 typedef struct entries_item { entry_t metricEntries_[0]; } entries_item_t;
8 
9 void __attribute__((noinline,noclone))
test_00(size_t numOfStates,entries_item_t * p_bm,const unsigned int * polyArray,size_t polyArraySize)10 test_00(size_t numOfStates, entries_item_t* p_bm,
11 	const unsigned int* polyArray,
12 	size_t polyArraySize)
13 {
14   size_t idx;
15   unsigned int hlp0, hlp1;
16   for (idx = 0; idx < numOfStates; ++idx)
17     {
18       size_t idy;
19 
20       hlp0 = (idx << 1) | 0x00;
21       hlp1 = (idx << 1) | 0x01;
22       p_bm->metricEntries_[idx][0] = 0;
23       p_bm->metricEntries_[idx][1] = 0;
24       for (idy = 0; idy < polyArraySize; ++idy)
25 	{
26 	  p_bm->metricEntries_[idx][0]
27 	      |= __builtin_parity(hlp0 & polyArray[idy]) << idy;
28 	  p_bm->metricEntries_[idx][1]
29 	      |= __builtin_parity(hlp1 & polyArray[idy]) << idy;
30 	}
31     }
32 }
33 
main()34 int main()
35 {
36   unsigned int polyArray[] = { 0x07, 0x05 };
37   entries_item_t* pBranchMetrics;
38   pBranchMetrics = malloc(sizeof(entry_t) * NUM_OF_STATES);
39   test_00(NUM_OF_STATES, pBranchMetrics, polyArray,
40 	  sizeof(polyArray) / sizeof(polyArray[0]));
41   if (pBranchMetrics->metricEntries_[0][0] != 0
42       || pBranchMetrics->metricEntries_[0][1] != 3
43       || pBranchMetrics->metricEntries_[1][0] != 1
44       || pBranchMetrics->metricEntries_[1][1] != 2
45       || pBranchMetrics->metricEntries_[2][0] != 3
46       || pBranchMetrics->metricEntries_[2][1] != 0
47       || pBranchMetrics->metricEntries_[3][0] != 2
48       || pBranchMetrics->metricEntries_[3][1] != 1)
49     abort ();
50   free(pBranchMetrics);
51   return 0;
52 }
53