summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/arch/ppc/timebase.S
blob: 19faed49dc112479bf0200e98442201764557204 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "asm/asmdefs.h"
#include "asm/processor.h"

/*
 * unsigned long long _get_ticks(void);
 */
_GLOBAL(_get_ticks):
1:      mftbu   r3
        mftb    r4
        mftbu   r5
        cmpw    0,r3,r5
        bne     1b
        blr

/*
 * Delay for a number of ticks
 */
_GLOBAL(_wait_ticks):
        mflr    r8              /* save link register */
        mr      r7, r3          /* save tick count */
        bl      BRANCH_LABEL(_get_ticks)       /* Get start time */

        /* Calculate end time */
        addc    r7, r4, r7      /* Compute end time lower */
        addze   r6, r3          /*     and end time upper */

1:      bl      BRANCH_LABEL(_get_ticks)       /* Get current time */
        subfc   r4, r4, r7      /* Subtract current time from end time */
        subfe.  r3, r3, r6
        bge     1b              /* Loop until time expired */

        mtlr    r8              /* restore link register */
        blr