summaryrefslogtreecommitdiffstats
path: root/baseline/source/anagram/anagram_stdlib.c
diff options
context:
space:
mode:
authorJoshua Bakita <bakitajoshua@gmail.com>2019-10-07 19:13:39 -0400
committerJoshua Bakita <bakitajoshua@gmail.com>2019-10-07 19:13:39 -0400
commit386b7d3366f1359a265da207a9cafa3edf553b64 (patch)
treec76120c2c138faed822e4ae386be6ef22a738a78 /baseline/source/anagram/anagram_stdlib.c
parent54a3f7091a2146b29c73a6fdc4b62a5c4ad7a3d8 (diff)
Reorganize and commit all the modified TACLeBench code and run scripts
Diffstat (limited to 'baseline/source/anagram/anagram_stdlib.c')
-rw-r--r--baseline/source/anagram/anagram_stdlib.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/baseline/source/anagram/anagram_stdlib.c b/baseline/source/anagram/anagram_stdlib.c
new file mode 100644
index 0000000..994350b
--- /dev/null
+++ b/baseline/source/anagram/anagram_stdlib.c
@@ -0,0 +1,153 @@
1/*
2
3 This file is part of the TACLeBench benchmark suite.
4 Version 2.0
5
6 Name: anagram_stdlib.c
7
8 Author: Raymond Chen
9
10 Function: This file contains the C standard library functions used by anagram.
11
12 Source: anagram
13
14 Original name: anagram
15
16 Changes: See ChangeLog.txt
17
18 License: See anagram.c
19
20*/
21
22#include "anagram_stdlib.h"
23#include "anagram_strings.h"
24
25/* Includes anagram_CompareFrequency */
26/* This function is included here because the WCC does not */
27/* support function pointers */
28#include "anagram_compare.h"
29
30
31void anagram_swapi( char *ii, char *ij, unsigned long es )
32{
33 char *i, *j, c;
34
35 i = ( char * )ii;
36 j = ( char * )ij;
37 _Pragma( "loopbound min 1 max 1" )
38 do {
39 c = *i;
40 *i ++ = *j;
41 *j ++ = c;
42 es -= sizeof( char );
43 } while ( es != 0 );
44}
45
46char *anagram_pivot( char *a, unsigned long n, unsigned long es )
47{
48 unsigned long j;
49 char *pi, *pj, *pk;
50
51 j = n / 6 * es;
52 pi = a + j; /* 1/6 */
53 j += j;
54 pj = pi + j; /* 1/2 */
55 pk = pj + j; /* 5/6 */
56 if ( anagram_CompareFrequency( pi, pj ) < 0 ) {
57 if ( anagram_CompareFrequency( pi, pk ) < 0 ) {
58 if ( anagram_CompareFrequency( pj, pk ) < 0 )
59 return pj;
60 return pk;
61 }
62 return pi;
63 }
64 if ( anagram_CompareFrequency( pj, pk ) < 0 ) {
65 if ( anagram_CompareFrequency( pi, pk ) < 0 )
66 return pi;
67 return pk;
68 }
69 return pj;
70}
71
72void anagram_qsorts( char *a, unsigned long n, unsigned long es )
73{
74 unsigned long j;
75 char *pi, *pj, *pn;
76 volatile unsigned int flowfactdummy = 0;
77
78 _Pragma( "loopbound min 0 max 6" )
79 while ( n > 1 ) {
80 if ( n > 10 )
81 pi = anagram_pivot( a, n, es );
82 else
83 pi = a + ( n >> 1 ) * es;
84
85 anagram_swapi( a, pi, es );
86 pi = a;
87 pn = a + n * es;
88 pj = pn;
89 _Pragma( "loopbound min 1 max 11" )
90 while ( 1 ) {
91 /* wcc note: this assignment expression was added to avoid assignment of
92 multiple loop bound annotations to same loop (cf. Ticket #0002323). */
93 flowfactdummy ++;
94 _Pragma( "loopbound min 1 max 5" )
95 do {
96 pi += es;
97 } while ( pi < pn && anagram_CompareFrequency( pi, a ) < 0 );
98 _Pragma( "loopbound min 1 max 4" )
99 do {
100 pj -= es;
101 } while ( pj > a && anagram_CompareFrequency( pj, a ) > 0 );
102 if ( pj < pi )
103 break;
104 anagram_swapi( pi, pj, es );
105 }
106 anagram_swapi( a, pj, es );
107 j = ( unsigned long )( pj - a ) / es;
108
109 n = n - j - 1;
110 if ( j >= n ) {
111 anagram_qsorts( a, j, es );
112 a += ( j + 1 ) * es;
113 } else {
114 anagram_qsorts( a + ( j + 1 )*es, n, es );
115 n = j;
116 }
117 }
118}
119
120void anagram_qsort( void *va, unsigned long n, unsigned long es )
121{
122 _Pragma( "marker call_qsorts" )
123 anagram_qsorts( ( char * )va, n, es );
124 _Pragma( "flowrestriction 1*anagram_qsorts <= 17*call_qsorts" )
125}
126
127
128/* This must be redefined for each new benchmark */
129#define ANAGRAM_HEAP_SIZE 18000
130
131static char anagram_simulated_heap[ANAGRAM_HEAP_SIZE];
132static unsigned int anagram_freeHeapPos;
133
134void *anagram_malloc( unsigned int numberOfBytes )
135{
136 void *currentPos = ( void * )&anagram_simulated_heap[ anagram_freeHeapPos ];
137 /* Get a 4-byte address for alignment purposes */
138 //anagram_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int )0xfffffffc );
139 unsigned int rem = (numberOfBytes & ( unsigned int )0x3 );
140 unsigned int adjustment = rem ? 4 - rem : 0;
141 anagram_freeHeapPos += numberOfBytes + adjustment;
142 return currentPos;
143}
144
145void anagram_bzero( char *p, unsigned long len )
146{
147 unsigned long i;
148
149 _Pragma( "loopbound min 8 max 416" )
150 for ( i = 0; i < len; ++ i )
151 *p ++ = '\0';
152}
153