SHARE
TWEET

Untitled

a guest May 21st, 2019 57 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5.  
  6. #define NCOUNT  (100000)
  7. #define TCOUNT  (4)
  8.  
  9. volatile uint64_t u = 0;
  10. volatile uint64_t *casvar = &u;
  11.  
  12. uint64_t
  13. cas(volatile uint64_t *v, uint64_t old, uint64_t new)
  14. {
  15.         volatile uint64_t ret = 0;
  16.  
  17.         asm volatile (
  18.             " add %0, zero, 1\n\t"
  19.             " fence iorw, iorw\n\t"
  20.             " lr.d.aq a0, (%1)\n\t"
  21.             " bne %2, a0, done\n\t"
  22.             " sc.d.rl %0, %3, (%1)\n\t"
  23.             " fence iorw, iorw\n\t"
  24.             "done:\n"
  25.             : "+r" (ret)
  26.             : "r" (v), "r" (old), "r" (new)
  27.             : "a0"
  28.         );
  29.  
  30.         return ret;
  31. }
  32.  
  33. void *
  34. thread(void *args) {
  35.         volatile uint64_t val = 0;
  36.         int i;
  37.  
  38.         for (i = 0; i < NCOUNT; i++) {
  39.                 for (;;) {
  40.                         volatile uint64_t *vp = &val;
  41.                         asm volatile (
  42.                             " fence iorw, iorw\n\t"
  43.                             " lr.d.aqrl a0, (%1)\n"
  44.                             " fence iorw, iorw\n\t"
  45.                             " sd a0, (%0)\n"
  46.                             : "+r" (vp)
  47.                             : "r" (casvar)
  48.                             : "a0"
  49.                         );
  50.                         if (cas(casvar, val, val+1) == 0)
  51.                                 break;
  52.                 }
  53.         }
  54.  
  55.         return (NULL);
  56. }
  57.  
  58. int
  59. main(int argc, char **argv)
  60. {
  61.         uint64_t        i;
  62.         pthread_t       tid[TCOUNT];
  63.         volatile uint64_t result;
  64.  
  65.         for (i = 0; i < TCOUNT; i++)
  66.                 pthread_create(&tid[i], NULL, thread, (void *)i+10);
  67.  
  68.         for (i = 0; i < TCOUNT; i++) {
  69.                 if (pthread_join(tid[i], NULL))
  70.                         printf("pthread_join failed %d\n", i+10);
  71.         }
  72.  
  73.         __atomic_load(casvar, &result, __ATOMIC_CONSUME);
  74.         if (result != TCOUNT*NCOUNT) {
  75.                 printf("womp womp %d %d\n", result, TCOUNT*NCOUNT);
  76.                 return (1);
  77.         }
  78.         printf("ok %d %d\n", result, TCOUNT*NCOUNT);
  79.         return (0);
  80. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top