Add test for verifying xmm state is preserved
authorKevin Klues <klueska@gmail.com>
Thu, 9 Oct 2014 17:13:38 +0000 (10:13 -0700)
committerKevin Klues <klueska@gmail.com>
Thu, 9 Oct 2014 17:13:38 +0000 (10:13 -0700)
tests/xmm.c [new file with mode: 0644]

diff --git a/tests/xmm.c b/tests/xmm.c
new file mode 100644 (file)
index 0000000..0935064
--- /dev/null
@@ -0,0 +1,112 @@
+/* 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 <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;
+} 
+