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 25SYM_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 50L_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 66L_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 81L_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 89SYM_FUNC_END(shr_Xsig) 90