Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / arch / metag / lib / muldi3.S
blob9d106790244deabd8208b83a3004d960875a6210
1 ! SPDX-License-Identifier: GPL-2.0
2 ! Copyright (C) 2012 by Imagination Technologies Ltd.
4 ! 64-bit multiply routine.
8 ! 64-bit signed/unsigned multiply
10 ! A = D1Ar1:D0Ar2 = a 2^48 + b 2^32 +  c 2^16 + d 2^0
12 ! B = D1Ar3:D0Ar4 = w 2^48 + x 2^32 +  y 2^16 + z 2^0
14         .text
15         .global ___muldi3
16         .type   ___muldi3,function
18 ___muldi3:
19         MULD    D1Re0,D1Ar1,D0Ar4       ! (a 2^48 + b 2^32)(y 2^16 + z 2^0)
20         MULD    D0Re0,D0Ar2,D1Ar3       ! (w 2^48 + x 2^32)(c 2^16 + d 2^0)
21         ADD     D1Re0,D1Re0,D0Re0
23         MULW    D0Re0,D0Ar2,D0Ar4       ! (d 2^0)  * (z 2^0)
25         RTDW    D0Ar2,D0Ar2
26         MULW    D0Ar6,D0Ar2,D0Ar4       ! (c 2^16)(z 2^0)
27         LSR     D1Ar5,D0Ar6,#16
28         LSL     D0Ar6,D0Ar6,#16
29         ADDS    D0Re0,D0Re0,D0Ar6
30         ADDCS   D1Re0,D1Re0,#1
31         RTDW    D0Ar4,D0Ar4
32         ADD     D1Re0,D1Re0,D1Ar5
34         MULW    D0Ar6,D0Ar2,D0Ar4       ! (c 2^16)(y 2^16)
35         ADD     D1Re0,D1Re0,D0Ar6
37         RTDW    D0Ar2,D0Ar2
38         MULW    D0Ar6,D0Ar2,D0Ar4       ! (d 2^0)(y 2^16)
39         LSR     D1Ar5,D0Ar6,#16
40         LSL     D0Ar6,D0Ar6,#16
41         ADDS    D0Re0,D0Re0,D0Ar6
42         ADD     D1Re0,D1Re0,D1Ar5
43         ADDCS   D1Re0,D1Re0,#1
44         MOV     PC, D1RtP
45         .size ___muldi3,.-___muldi3