Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / x86 / math-emu / shr_Xsig.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2         .file   "shr_Xsig.S"
3 /*---------------------------------------------------------------------------+
4  |  shr_Xsig.S                                                               |
5  |                                                                           |
6  | 12 byte right shift function                                              |
7  |                                                                           |
8  | Copyright (C) 1992,1994,1995                                              |
9  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
10  |                       Australia.  E-mail billm@jacobi.maths.monash.edu.au |
11  |                                                                           |
12  | Call from C as:                                                           |
13  |   void shr_Xsig(Xsig *arg, unsigned nr)                                   |
14  |                                                                           |
15  |   Extended shift right function.                                          |
16  |   Fastest for small shifts.                                               |
17  |   Shifts the 12 byte quantity pointed to by the first arg (arg)           |
18  |   right by the number of bits specified by the second arg (nr).           |
19  |                                                                           |
20  +---------------------------------------------------------------------------*/
21
22 #include "fpu_emu.h"
23
24 .text
25 ENTRY(shr_Xsig)
26         push    %ebp
27         movl    %esp,%ebp
28         pushl   %esi
29         movl    PARAM2,%ecx
30         movl    PARAM1,%esi
31         cmpl    $32,%ecx        /* shrd only works for 0..31 bits */
32         jnc     L_more_than_31
33
34 /* less than 32 bits */
35         pushl   %ebx
36         movl    (%esi),%eax     /* lsl */
37         movl    4(%esi),%ebx    /* midl */
38         movl    8(%esi),%edx    /* msl */
39         shrd    %cl,%ebx,%eax
40         shrd    %cl,%edx,%ebx
41         shr     %cl,%edx
42         movl    %eax,(%esi)
43         movl    %ebx,4(%esi)
44         movl    %edx,8(%esi)
45         popl    %ebx
46         popl    %esi
47         leave
48         ret
49
50 L_more_than_31:
51         cmpl    $64,%ecx
52         jnc     L_more_than_63
53
54         subb    $32,%cl
55         movl    4(%esi),%eax    /* midl */
56         movl    8(%esi),%edx    /* msl */
57         shrd    %cl,%edx,%eax
58         shr     %cl,%edx
59         movl    %eax,(%esi)
60         movl    %edx,4(%esi)
61         movl    $0,8(%esi)
62         popl    %esi
63         leave
64         ret
65
66 L_more_than_63:
67         cmpl    $96,%ecx
68         jnc     L_more_than_95
69
70         subb    $64,%cl
71         movl    8(%esi),%eax    /* msl */
72         shr     %cl,%eax
73         xorl    %edx,%edx
74         movl    %eax,(%esi)
75         movl    %edx,4(%esi)
76         movl    %edx,8(%esi)
77         popl    %esi
78         leave
79         ret
80
81 L_more_than_95:
82         xorl    %eax,%eax
83         movl    %eax,(%esi)
84         movl    %eax,4(%esi)
85         movl    %eax,8(%esi)
86         popl    %esi
87         leave
88         ret
89 ENDPROC(shr_Xsig)