Merge branch 'for-linus' of git://linux-nfs.org/~bfields/linux
[linux-2.6] / arch / mn10300 / lib / __lshrdi3.S
1 /* MN10300 64-bit logical right shift
2  *
3  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public Licence
8  * as published by the Free Software Foundation; either version
9  * 2 of the Licence, or (at your option) any later version.
10  */
11
12 #include <asm/cache.h>
13
14         .text
15         .balign L1_CACHE_BYTES
16
17 ###############################################################################
18 #
19 # unsigned long long __lshrdi3(unsigned long long value [D1:D0],
20 #                              unsigned by [(12,SP)])
21 #
22 ###############################################################################
23         .globl  __lshrdi3
24         .type   __lshrdi3,@function
25 __lshrdi3:
26         mov     (12,sp),a0
27         and     +63,a0
28         beq     __lshrdi3_zero
29
30         cmp     +31,a0
31         bhi     __lshrdi3_32plus
32
33         # the count is in the range 1-31
34         lsr     a0,d0
35
36         mov     +32,a1
37         sub     a0,a1,a1                        # a1 = 32 - count
38         asl     a1,d1,a1                        # get underflow from MSW -> LSW
39
40         or_lsr  a1,d0,a0,d1                     # insert underflow into LSW and
41                                                 # shift the MSW
42         rets
43
44         .balign L1_CACHE_BYTES
45         # the count is in the range 32-63
46 __lshrdi3_32plus:
47         lsr     a0,d1,d0
48         clr     d1
49 __lshrdi3_zero:
50         rets
51
52         .size   __lshrdi3, .-__lshrdi3