An interpreted, interactive, object-oriented programming language
CentOS Sources
2017-08-01 71084d584ff953f5463757ec6536406320560b4d
commit | author | age
6e8c2f 1 diff -up Python-2.7.2/Python/ceval.c.tsc-on-ppc Python-2.7.2/Python/ceval.c
CB 2 --- Python-2.7.2/Python/ceval.c.tsc-on-ppc    2011-08-23 14:59:48.051300849 -0400
3 +++ Python-2.7.2/Python/ceval.c    2011-08-23 15:33:25.412162902 -0400
4 @@ -37,24 +37,42 @@ typedef unsigned long long uint64;
5  */
6  #if defined(__ppc__) || defined (__powerpc__)
7  
8 -#define READ_TIMESTAMP(var) ppc_getcounter(&var)
9 +#if defined( __powerpc64__) || defined(__LP64__)
10 +/* 64-bit PowerPC */
11 +#define READ_TIMESTAMP(var) ppc64_getcounter(&var)
12 +static void
13 +ppc64_getcounter(uint64 *v)
14 +{
15 +    /* On 64-bit PowerPC we can read the 64-bit timebase directly into a
16 +       64-bit register */
17 +    uint64 timebase;
18 +#ifdef _ARCH_PWR4
19 +    asm volatile ("mfspr %0,268" : "=r" (timebase));
20 +#else
21 +    asm volatile ("mftb %0" : "=r" (timebase));
22 +#endif
23 +    *v = timebase;
24 +}
25 +
26 +#else
27 +/* 32-bit PowerPC */
28 +#define READ_TIMESTAMP(var) ppc32_getcounter(&var)
29  
30  static void
31 -ppc_getcounter(uint64 *v)
32 +ppc32_getcounter(uint64 *v)
33  {
34 -    register unsigned long tbu, tb, tbu2;
35 +    union { long long ll; long ii[2]; } u;
36 +    long tmp;
37  
38    loop:
39 -    asm volatile ("mftbu %0" : "=r" (tbu) );
40 -    asm volatile ("mftb  %0" : "=r" (tb)  );
41 -    asm volatile ("mftbu %0" : "=r" (tbu2));
42 -    if (__builtin_expect(tbu != tbu2, 0)) goto loop;
43 -
44 -    /* The slightly peculiar way of writing the next lines is
45 -       compiled better by GCC than any other way I tried. */
46 -    ((long*)(v))[0] = tbu;
47 -    ((long*)(v))[1] = tb;
48 +    asm volatile ("mftbu %0" : "=r" (u.ii[0]) );
49 +    asm volatile ("mftb  %0" : "=r" (u.ii[1]) );
50 +    asm volatile ("mftbu %0" : "=r" (tmp));
51 +    if (__builtin_expect(u.ii[0] != tmp, 0)) goto loop;
52 +
53 +    *v = u.ll;
54  }
55 +#endif /* powerpc 32/64 bit */
56  
57  #elif defined(__i386__)
58