Advertisement
Guest User

azanella

a guest
May 26th, 2014
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. = test.c =
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdint.h>
  6. #include <string.h>
  7.  
  8. uint32_t test_rldimi ();
  9. uint32_t test_rlwimi ();
  10.  
  11. typedef unsigned long long int hp_timing_t;
  12.  
  13. #define HP_TIMING_ZERO(Var) (Var) = (0)
  14.  
  15. #define HP_TIMING_NOW(Var) \
  16. do { \
  17. unsigned int hi, lo, tmp; \
  18. __asm__ __volatile__ ("1: mfspr %0,269;" \
  19. " mfspr %1,268;" \
  20. " mfspr %2,269;" \
  21. " cmpw %0,%2;" \
  22. " bne 1b;" \
  23. : "=&r" (hi), "=&r" (lo), "=&r" (tmp) \
  24. : : "cr0"); \
  25. Var = ((hp_timing_t) hi << 32) | lo; \
  26. } while (0)
  27.  
  28. static hp_timing_t hp_timing_overhead = 0ull;
  29.  
  30. #define HP_TIMING_DIFF_INIT() \
  31. do { \
  32. if (hp_timing_overhead == 0) \
  33. { \
  34. int __cnt = 5; \
  35. hp_timing_overhead = ~0ull; \
  36. do \
  37. { \
  38. hp_timing_t __t1, __t2; \
  39. HP_TIMING_NOW (__t1); \
  40. HP_TIMING_NOW (__t2); \
  41. if (__t2 - __t1 < hp_timing_overhead) \
  42. hp_timing_overhead = __t2 - __t1; \
  43. } \
  44. while (--__cnt > 0); \
  45. } \
  46. } while (0)
  47.  
  48. #define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
  49.  
  50. #define MIN(a,b) (((a)<(b))?(a):(b))
  51. #define MAX(a,b) (((a)<(b))?(b):(a))
  52.  
  53. #define NCALLS 1024
  54.  
  55. int main ()
  56. {
  57. hp_timing_t start, end, diff;
  58. hp_timing_t min, max;
  59. int i=0;
  60.  
  61. HP_TIMING_DIFF_INIT ();
  62.  
  63. min = ~0ull;
  64. max = 0ull;
  65.  
  66. for (i=0; i<NCALLS; ++i)
  67. {
  68. HP_TIMING_NOW (start);
  69. test_rldimi ();
  70. HP_TIMING_NOW (end);
  71. HP_TIMING_DIFF (diff, start, end);
  72. min = MIN (min, diff);
  73. max = MAX (max, diff);
  74. }
  75. printf ("rldimi: min: %llu | max: %llu\n", min, max);
  76.  
  77. for (i=0; i<NCALLS; ++i)
  78. {
  79. HP_TIMING_NOW (start);
  80. test_rlwimi ();
  81. HP_TIMING_NOW (end);
  82. HP_TIMING_DIFF (diff, start, end);
  83. min = MIN (min, diff);
  84. max = MAX (max, diff);
  85. }
  86. printf ("rlwimi: min: %llu | max: %llu\n", min, max);
  87.  
  88. return 0;
  89. }
  90.  
  91. = test_impl.S =
  92.  
  93. #define CALL_MCOUNT
  94. #define ALIGNARG(X) X
  95. #define C_SYMBOL_NAME(name) name
  96. #define C_LABEL(name) name##:
  97. #define ASM_SIZE_DIRECTIVE(name) .size name,.-name
  98.  
  99. #define ENTRY(name) \
  100. .globl C_SYMBOL_NAME(name); \
  101. .type C_SYMBOL_NAME(name),@function; \
  102. .align ALIGNARG(2); \
  103. C_LABEL(name) \
  104. .cfi_startproc; \
  105. CALL_MCOUNT
  106.  
  107. #define END(name) \
  108. .cfi_endproc; \
  109. ASM_SIZE_DIRECTIVE(name)
  110.  
  111.  
  112. ENTRY (test_rldimi)
  113. rldimi 3, 3, 8, 16
  114. blr
  115. END (test_rldimi)
  116.  
  117. ENTRY (test_rlwimi)
  118. rlwimi 3, 3, 16, 32
  119. blr
  120. END (test_rlwimi)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement