blob: df385516f486b90245b54dd747414126709ca08a [file] [log] [blame]
#include <immintrin.h>
#include <stdint.h>
#include <pthread.h>
#include <string.h>
#ifdef DEBUG
#include <stdio.h>
#endif
#include "cpuid.h"
typedef struct {
uint32_t id; /* filled in by launch_threads. */
} state_t;
static pthread_t* threads = 0;
static state_t* thread_state = 0;
static const unsigned int num_threads = 4;
static void* threads_worker (state_t *tstate);
void launch_threads (uint32_t nthreads,
void* (*worker)(state_t*),
state_t* tstate_proto)
{
int i;
thread_state = malloc (sizeof (state_t) *nthreads);
threads = malloc (sizeof (pthread_t) *nthreads);
memset (threads, 0, sizeof (pthread_t) *nthreads);
for(i = 0; i < nthreads; i++)
{
memcpy (thread_state + i, tstate_proto, sizeof (state_t));
thread_state[i].id = i;
pthread_create (threads+i, NULL,
(void* (*)(void*))worker,
(void*) (thread_state+i));
}
}
void wait()
{
int i;
for(i = 0; i < num_threads; i++)
pthread_join (threads[i], 0);
free (threads);
threads = 0;
free (thread_state);
thread_state = 0;
}
#ifndef DO_TEST
#define DO_TEST do_test
static void rao_test (void);
__attribute__ ((noinline))
static void
do_test (void)
{
state_t tstate_proto;
launch_threads(num_threads, threads_worker, &tstate_proto);
wait();
rao_test ();
}
#endif
int
main()
{
if (__builtin_cpu_supports ("raoint"))
{
DO_TEST ();
#ifdef DEBUG
printf ("PASSED\n");
#endif
}
#ifdef DEBUG
else
printf ("SKIPPED\n");
#endif
return 0;
}