Advertisement
Guest User

Untitled

a guest
May 21st, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement