/* Copyright (c) 2014 The Regents of the University of California
 * Kevin KLues <klueska@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * xmm_test: test the reading/writing of the xmm registers */

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <benchutil/pvcalarm.h>

static void nothing() {}

static void read_xmm(int id)
{
	char array[16*16] __attribute__((aligned(128))) = {0};
    asm volatile (
		"movdqa %%xmm0,  %0;"
		"movdqa %%xmm1,  %1;"
		"movdqa %%xmm2,  %2;"
		"movdqa %%xmm3,  %3;"
		"movdqa %%xmm4,  %4;"
		"movdqa %%xmm5,  %5;"
		"movdqa %%xmm6,  %6;"
		"movdqa %%xmm7,  %7;"
		"movdqa %%xmm8,  %8;"
		"movdqa %%xmm9,  %9;"
		"movdqa %%xmm10, %10;"
		"movdqa %%xmm11, %11;"
		"movdqa %%xmm12, %12;"
		"movdqa %%xmm13, %13;"
		"movdqa %%xmm14, %14;"
		"movdqa %%xmm15, %15;"
		:"=m"(array[0*16]), 
		 "=m"(array[1*16]), 
		 "=m"(array[2*16]), 
		 "=m"(array[3*16]), 
		 "=m"(array[4*16]), 
		 "=m"(array[5*16]), 
		 "=m"(array[6*16]), 
		 "=m"(array[7*16]), 
		 "=m"(array[8*16]), 
		 "=m"(array[9*16]), 
		 "=m"(array[10*16]), 
		 "=m"(array[11*16]), 
		 "=m"(array[12*16]), 
		 "=m"(array[13*16]), 
		 "=m"(array[14*16]), 
		 "=m"(array[15*16])
		:
        :
    );
	for (int i=0; i<16; i++) {
		int *addr = (int*)(array + i*16);
		if (*addr != id) {
			printf("ERROR: xmm%d, id: %d, *addr: %d\n", i, id, *addr);
			abort();
		}
	}
}

static void write_xmm(int __id)
{
	char id[16] __attribute__((aligned(128)));
	*((int*)id) = __id;
	asm volatile (
		"movdqa %0, %%xmm0;"
		"movdqa %0, %%xmm1;"
		"movdqa %0, %%xmm2;"
		"movdqa %0, %%xmm3;"
		"movdqa %0, %%xmm4;"
		"movdqa %0, %%xmm5;"
		"movdqa %0, %%xmm6;"
		"movdqa %0, %%xmm7;"
		"movdqa %0, %%xmm8;"
		"movdqa %0, %%xmm9;"
		"movdqa %0, %%xmm10;"
		"movdqa %0, %%xmm11;"
		"movdqa %0, %%xmm12;"
		"movdqa %0, %%xmm13;"
		"movdqa %0, %%xmm14;"
		"movdqa %0, %%xmm15;"
		:
		:"m"(id[0])
	    :"%xmm0","%xmm1","%xmm2","%xmm3",
		 "%xmm4","%xmm5","%xmm6","%xmm7",
		 "%xmm8","%xmm9","%xmm10","%xmm11",
		 "%xmm12","%xmm13","%xmm14","%xmm15"
	);
}

void *worker_thread(void* arg)
{	
	write_xmm((int)(long)arg);
	while (1)
		read_xmm((int)(long)arg);
	return 0;
}

int main(int argc, char** argv) 
{
	#define NUM_THREADS	1000
	pthread_t children[NUM_THREADS];

	enable_pvcalarms(PVCALARM_REAL, 10000, nothing);
	for (int i=0; i<NUM_THREADS; i++)
		pthread_create(&children[i], NULL, &worker_thread, (void*)(long)i+2);
	worker_thread((void*)(long)1);
	return 0;
} 

