GNU Linux-libre 4.14.266-gnu1
[releases.git] / arch / metag / lib / muldi3.S
1 ! SPDX-License-Identifier: GPL-2.0
2 ! Copyright (C) 2012 by Imagination Technologies Ltd.
3 !
4 ! 64-bit multiply routine.
5 !
6
7 !
8 ! 64-bit signed/unsigned multiply
9 !
10 ! A = D1Ar1:D0Ar2 = a 2^48 + b 2^32 +  c 2^16 + d 2^0
11 !
12 ! B = D1Ar3:D0Ar4 = w 2^48 + x 2^32 +  y 2^16 + z 2^0
13 !
14         .text
15         .global ___muldi3
16         .type   ___muldi3,function
17
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
22
23         MULW    D0Re0,D0Ar2,D0Ar4       ! (d 2^0)  * (z 2^0)
24
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
33
34         MULW    D0Ar6,D0Ar2,D0Ar4       ! (c 2^16)(y 2^16)
35         ADD     D1Re0,D1Re0,D0Ar6
36
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