Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- === test.c ===
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <string.h>
- uint32_t test_rldimi_1 ();
- uint32_t test_rldimi_4 ();
- uint32_t test_rldimi_8 ();
- uint32_t test_rldimi_16 ();
- uint32_t test_rlwimi_1 ();
- uint32_t test_rlwimi_4 ();
- uint32_t test_rlwimi_8 ();
- uint32_t test_rlwimi_16 ();
- typedef unsigned long long int hp_timing_t;
- #define HP_TIMING_ZERO(Var) (Var) = (0)
- #define HP_TIMING_NOW(Var) \
- do { \
- unsigned int hi, lo, tmp; \
- __asm__ __volatile__ ("1: mfspr %0,269;" \
- " mfspr %1,268;" \
- " mfspr %2,269;" \
- " cmpw %0,%2;" \
- " bne 1b;" \
- : "=&r" (hi), "=&r" (lo), "=&r" (tmp) \
- : : "cr0"); \
- Var = ((hp_timing_t) hi << 32) | lo; \
- } while (0)
- static hp_timing_t hp_timing_overhead = 0ull;
- #define HP_TIMING_DIFF_INIT() \
- do { \
- if (hp_timing_overhead == 0) \
- { \
- int __cnt = 5; \
- hp_timing_overhead = ~0ull; \
- do \
- { \
- hp_timing_t __t1, __t2; \
- HP_TIMING_NOW (__t1); \
- HP_TIMING_NOW (__t2); \
- if (__t2 - __t1 < hp_timing_overhead) \
- hp_timing_overhead = __t2 - __t1; \
- } \
- while (--__cnt > 0); \
- } \
- } while (0)
- #define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
- #define MIN(a,b) (((a)<(b))?(a):(b))
- #define MAX(a,b) (((a)<(b))?(b):(a))
- #define NCALLS 1024
- int main ()
- {
- hp_timing_t start, end, diff;
- hp_timing_t min, max;
- int i=0;
- HP_TIMING_DIFF_INIT ();
- min = ~0ull;
- max = 0ull;
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rldimi_1 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rldimi1: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rldimi_4 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rldimi4: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rldimi_8 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rldimi8: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rldimi_16 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rldimi16: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rlwimi_1 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rlwimi1: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rlwimi_4 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rlwimi4: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rlwimi_8 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rlwimi8: min: %llu | max: %llu\n", min, max);
- for (i=0; i<NCALLS; ++i)
- {
- HP_TIMING_NOW (start);
- test_rlwimi_16 ();
- HP_TIMING_NOW (end);
- HP_TIMING_DIFF (diff, start, end);
- min = MIN (min, diff);
- max = MAX (max, diff);
- }
- printf ("rlwimi16: min: %llu | max: %llu\n", min, max);
- return 0;
- }
- === test_impl.S ===
- #define CALL_MCOUNT
- #define ALIGNARG(X) X
- #define C_SYMBOL_NAME(name) name
- #define C_LABEL(name) name##:
- #define ASM_SIZE_DIRECTIVE(name) .size name,.-name
- #define ENTRY(name) \
- .globl C_SYMBOL_NAME(name); \
- .type C_SYMBOL_NAME(name),@function; \
- .align ALIGNARG(2); \
- C_LABEL(name) \
- .cfi_startproc; \
- CALL_MCOUNT
- #define END(name) \
- .cfi_endproc; \
- ASM_SIZE_DIRECTIVE(name)
- ENTRY (test_rldimi_1)
- rldimi 3, 3, 8, 16
- blr
- END (test_rldimi_1)
- ENTRY (test_rldimi_4)
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- blr
- END (test_rldimi_4)
- ENTRY (test_rldimi_8)
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- blr
- END (test_rldimi_8)
- ENTRY (test_rldimi_16)
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- rldimi 3, 3, 8, 16
- blr
- END (test_rldimi_16)
- ENTRY (test_rlwimi_1)
- rlwimi 3, 3, 16, 32
- blr
- END (test_rlwimi_1)
- ENTRY (test_rlwimi_4)
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- blr
- END (test_rlwimi_4)
- ENTRY (test_rlwimi_8)
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- blr
- END (test_rlwimi_8)
- ENTRY (test_rlwimi_16)
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- rlwimi 3, 3, 16, 32
- blr
- END (test_rlwimi_16)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement