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 | SYM_FUNC_START(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 | SYM_FUNC_END(shr_Xsig) |
90 | |