Files
failnix/targets/wasm-tacle/sequential/anagram/anagram_stdlib.c

150 lines
3.5 KiB
C
Executable File

/*
This file is part of the TACLeBench benchmark suite.
Version 2.0
Name: anagram_stdlib.c
Author: Raymond Chen
Function: This file contains the C standard library functions used by anagram.
Source: anagram
Original name: anagram
Changes: See ChangeLog.txt
License: See anagram.c
*/
#include "anagram_stdlib.h"
#include "anagram_strings.h"
/* Includes anagram_CompareFrequency */
/* This function is included here because the WCC does not */
/* support function pointers */
#include "anagram_compare.h"
void anagram_swapi( char *ii, char *ij, unsigned long es )
{
char *i, *j, c;
i = ( char * )ii;
j = ( char * )ij;
_Pragma( "loopbound min 4 max 4" )
do {
c = *i;
*i ++ = *j;
*j ++ = c;
es -= sizeof( char );
} while ( es != 0 );
}
char *anagram_pivot( char *a, unsigned long n, unsigned long es )
{
unsigned long j;
char *pi, *pj, *pk;
j = n / 6 * es;
pi = a + j; /* 1/6 */
j += j;
pj = pi + j; /* 1/2 */
pk = pj + j; /* 5/6 */
if ( anagram_CompareFrequency( pi, pj ) < 0 ) {
if ( anagram_CompareFrequency( pi, pk ) < 0 ) {
if ( anagram_CompareFrequency( pj, pk ) < 0 )
return pj;
return pk;
}
return pi;
}
if ( anagram_CompareFrequency( pj, pk ) < 0 ) {
if ( anagram_CompareFrequency( pi, pk ) < 0 )
return pi;
return pk;
}
return pj;
}
void anagram_qsorts( char *a, unsigned long n, unsigned long es )
{
unsigned long j;
char *pi, *pj, *pn;
volatile unsigned int flowfactdummy = 0;
_Pragma( "loopbound min 0 max 3" )
while ( n > 1 ) {
if ( n > 10 )
pi = anagram_pivot( a, n, es );
else
pi = a + ( n >> 1 ) * es;
anagram_swapi( a, pi, es );
pi = a;
pn = a + n * es;
pj = pn;
_Pragma( "loopbound min 0 max 10" )
while ( 1 ) {
/* wcc note: this assignment expression was added to avoid assignment of
multiple loop bound annotations to same loop (cf. Ticket #0002323). */
flowfactdummy ++;
_Pragma( "loopbound min 1 max 6" )
do {
pi += es;
} while ( pi < pn && anagram_CompareFrequency( pi, a ) < 0 );
_Pragma( "loopbound min 1 max 7" )
do {
pj -= es;
} while ( pj > a && anagram_CompareFrequency( pj, a ) > 0 );
if ( pj < pi )
break;
anagram_swapi( pi, pj, es );
}
anagram_swapi( a, pj, es );
j = ( unsigned long )( pj - a ) / es;
n = n - j - 1;
if ( j >= n ) {
anagram_qsorts( a, j, es );
a += ( j + 1 ) * es;
} else {
anagram_qsorts( a + ( j + 1 )*es, n, es );
n = j;
}
}
}
void anagram_qsort( void *va, unsigned long n, unsigned long es )
{
_Pragma( "marker call_qsorts" )
anagram_qsorts( ( char * )va, n, es );
_Pragma( "flowrestriction 1*anagram_qsorts <= 17*call_qsorts" );
}
/* This must be redefined for each new benchmark */
#define ANAGRAM_HEAP_SIZE 21000
static char anagram_simulated_heap[ANAGRAM_HEAP_SIZE];
static unsigned int anagram_freeHeapPos;
void *anagram_malloc( unsigned int numberOfBytes )
{
void *currentPos = ( void * )&anagram_simulated_heap[ anagram_freeHeapPos ];
/* Get a 4-byte address for alignment purposes */
//anagram_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int )0xfffffffc );
unsigned int rem = ( numberOfBytes & ( unsigned int )0x3 );
unsigned int adjustment = rem ? 4 - rem : 0;
anagram_freeHeapPos += numberOfBytes + adjustment;
return currentPos;
}
void anagram_bzero( char *p, unsigned long len )
{
unsigned long i;
_Pragma( "loopbound min 8 max 800" )
for ( i = 0; i < len; ++ i ){
*p ++ = '\0';}
}