246 lines
5.2 KiB
C
Executable File
246 lines
5.2 KiB
C
Executable File
/*
|
|
|
|
This program is part of the TACLeBench benchmark suite.
|
|
Version V 2.0
|
|
|
|
Name: quicksort
|
|
|
|
Author: Matthew R. Guthaus
|
|
|
|
Function: quicksort applies a recursive quicksort algorithm to two different
|
|
input sets.
|
|
|
|
Source: MiBench
|
|
http://wwweb.eecs.umich.edu/mibench
|
|
|
|
Original name: qsort
|
|
|
|
Changes: No major functional changes.
|
|
|
|
License: GPL
|
|
|
|
*/
|
|
|
|
|
|
/*
|
|
Include section
|
|
*/
|
|
|
|
#include "quicksort.h"
|
|
#include "quicksortlibm.h"
|
|
#include "quicksortstdlib.h"
|
|
|
|
|
|
/*
|
|
Forward declaration of functions
|
|
*/
|
|
|
|
void quicksort_init( void );
|
|
int quicksort_return( void );
|
|
void quicksort_str( char *, unsigned long, unsigned long );
|
|
void quicksort_vec( char *, unsigned long, unsigned long );
|
|
void quicksort_main( void );
|
|
int main( void );
|
|
|
|
|
|
/*
|
|
Declaration of global variables
|
|
*/
|
|
|
|
extern const char *quicksort_input_string[ 681 ];
|
|
char quicksort_strings[ 681 ][ 20 ];
|
|
|
|
extern unsigned int quicksort_input_vector[ 1000 * 3 ];
|
|
struct quicksort_3DVertexStruct quicksort_vectors[ 1000 ];
|
|
|
|
volatile int quicksort_const_prop_border_i = 0;
|
|
volatile char quicksort_const_prop_border_c = 0;
|
|
|
|
|
|
/*
|
|
Initialization- and return-value-related functions
|
|
*/
|
|
|
|
void quicksort_init( void )
|
|
{
|
|
unsigned int i, j;
|
|
unsigned int x, y, z;
|
|
unsigned int read_counter = 0;
|
|
|
|
/* constant propagation border */
|
|
_Pragma( "loopbound min 3000 max 3000" )
|
|
for ( i = 0; i < 3000; i++ )
|
|
quicksort_input_vector[ i ] += quicksort_const_prop_border_i;
|
|
|
|
/* Init arrays */
|
|
_Pragma( "loopbound min 681 max 681" )
|
|
for ( i = 0; i < 681; i++ ) {
|
|
_Pragma( "loopbound min 1 max 20" )
|
|
for ( j = 0; j < 20 - 1; j++ ) {
|
|
quicksort_strings[ i ][ j ] = quicksort_input_string[ i ][ j ];
|
|
quicksort_strings[ i ][ j ] += quicksort_const_prop_border_c;
|
|
|
|
if ( quicksort_input_string[ i ][ j ] == '\0' )
|
|
break;
|
|
}
|
|
|
|
/* Terminate with '\0' anyways. */
|
|
quicksort_strings[ i ][ 20 - 1 ] = '\0';
|
|
}
|
|
|
|
_Pragma( "loopbound min 1000 max 1000" )
|
|
for ( i = 0; i < 1000; i++ ) {
|
|
x = quicksort_vectors[ i ].x = quicksort_input_vector[ read_counter++ ];
|
|
y = quicksort_vectors[ i ].y = quicksort_input_vector[ read_counter++ ];
|
|
z = quicksort_vectors[ i ].z = quicksort_input_vector[ read_counter++ ];
|
|
|
|
quicksort_vectors[ i ].distance =
|
|
quicksort_sqrt(
|
|
quicksort_pow( x, 2 ) + quicksort_pow( y, 2 ) + quicksort_pow( z, 2 ) );
|
|
}
|
|
}
|
|
|
|
|
|
int quicksort_return( void )
|
|
{
|
|
int checksum = 0;
|
|
|
|
checksum +=
|
|
quicksort_strings[ 42 ][ 1 ] +
|
|
quicksort_vectors[ 42 ].x + quicksort_vectors[ 42 ].y +
|
|
quicksort_vectors[ 42 ].z;
|
|
|
|
return ( checksum );
|
|
}
|
|
|
|
|
|
/*
|
|
Algorithm core functions
|
|
*/
|
|
|
|
void quicksort_str( char *a, unsigned long n, unsigned long es )
|
|
{
|
|
unsigned long j;
|
|
char *pi, *pj, *pn;
|
|
|
|
|
|
_Pragma( "loopbound min 0 max 8" )
|
|
while ( n > 1 ) {
|
|
if ( n > 10 )
|
|
pi = quicksort_pivot_strings( a, n, es );
|
|
else
|
|
pi = a + ( n >> 1 ) * es;
|
|
|
|
quicksort_swapi( a, pi, es );
|
|
pi = a;
|
|
pn = a + n * es;
|
|
pj = pn;
|
|
|
|
_Pragma( "loopbound min 0 max 169" )
|
|
while ( 1 ) {
|
|
_Pragma( "loopbound min 1 max 26" )
|
|
do
|
|
pi += es;
|
|
while ( ( pi < pn ) && ( quicksort_compare_strings( pi, a ) < 0 ) );
|
|
|
|
_Pragma( "loopbound min 1 max 23" )
|
|
do
|
|
pj -= es;
|
|
while ( ( pj > a ) && ( quicksort_compare_strings( pj, a ) > 0 ) );
|
|
|
|
if ( pj < pi )
|
|
break;
|
|
quicksort_swapi( pi, pj, es );
|
|
}
|
|
quicksort_swapi( a, pj, es );
|
|
j = ( pj - a ) / es;
|
|
n = n - j - 1;
|
|
|
|
if ( j >= n ) {
|
|
quicksort_str( a, j, es );
|
|
a += ( j + 1 ) * es;
|
|
} else {
|
|
quicksort_str( a + ( j + 1 ) * es, n, es );
|
|
n = j;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void quicksort_vec( char *a, unsigned long n, unsigned long es )
|
|
{
|
|
unsigned long j;
|
|
char *pi, *pj, *pn;
|
|
|
|
|
|
_Pragma( "loopbound min 0 max 15" )
|
|
while ( n > 1 ) {
|
|
if ( n > 10 )
|
|
pi = quicksort_pivot_vectors( a, n, es );
|
|
else
|
|
pi = a + ( n >> 1 ) * es;
|
|
|
|
quicksort_swapi( a, pi, es );
|
|
pi = a;
|
|
pn = a + n * es;
|
|
pj = pn;
|
|
|
|
_Pragma( "loopbound min 1 max 250" )
|
|
while ( 1 ) {
|
|
_Pragma( "loopbound min 1 max 51" )
|
|
do
|
|
pi += es;
|
|
while ( ( pi < pn ) && ( quicksort_compare_vectors( pi, a ) < 0 ) );
|
|
|
|
_Pragma( "loopbound min 1 max 27" )
|
|
do
|
|
pj -= es;
|
|
while ( ( pj > a ) && ( quicksort_compare_vectors( pj, a ) > 0 ) );
|
|
|
|
if ( pj < pi )
|
|
break;
|
|
|
|
quicksort_swapi( pi, pj, es );
|
|
}
|
|
|
|
quicksort_swapi( a, pj, es );
|
|
j = ( pj - a ) / es;
|
|
n = n - j - 1;
|
|
|
|
if ( j >= n ) {
|
|
quicksort_vec( a, j, es );
|
|
a += ( j + 1 ) * es;
|
|
} else {
|
|
quicksort_vec( a + ( j + 1 ) * es, n, es );
|
|
n = j;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
Main functions
|
|
*/
|
|
|
|
void _Pragma ( "entrypoint" ) quicksort_main( void )
|
|
{
|
|
_Pragma( "marker recursivecall" )
|
|
_Pragma( "flowrestriction 1*quicksort_str <= 521*recursivecall" )
|
|
quicksort_str( *quicksort_strings, 681, sizeof( char[ 20 ] ) );
|
|
|
|
_Pragma( "marker recursivecall2" )
|
|
_Pragma( "flowrestriction 1*quicksort_vec <= 650*recursivecall2" )
|
|
quicksort_vec(
|
|
( char * ) quicksort_vectors, 1000,
|
|
sizeof( struct quicksort_3DVertexStruct ) );
|
|
}
|
|
|
|
|
|
int main( void )
|
|
{
|
|
quicksort_init();
|
|
quicksort_main();
|
|
|
|
return ( quicksort_return() - 1527923179 != 0 );
|
|
}
|