.file "shr_Xsig.S" /*---------------------------------------------------------------------------+ | shr_Xsig.S | | | | 12 byte right shift function | | | | Copyright (C) 1992,1994 | | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | | Australia. E-mail billm@vaxc.cc.monash.edu.au | | | | Call from C as: | | void shr_Xsig(Xsig *arg, unsigned nr) | | | | Extended shift right function. | | Fastest for small shifts. | | Shifts the 12 byte quantity pointed to by the first arg (arg) | | right by the number of bits specified by the second arg (nr). | | | +---------------------------------------------------------------------------*/ #include "fpu_asm.h" .text ENTRY(shr_Xsig) push %ebp movl %esp,%ebp pushl %esi movl PARAM2,%ecx movl PARAM1,%esi cmpl $32,%ecx /* shrd only works for 0..31 bits */ jnc L_more_than_31 /* less than 32 bits */ pushl %ebx movl (%esi),%eax /* lsl */ movl 4(%esi),%ebx /* midl */ movl 8(%esi),%edx /* msl */ shrd %cl,%ebx,%eax shrd %cl,%edx,%ebx shr %cl,%edx movl %eax,(%esi) movl %ebx,4(%esi) movl %edx,8(%esi) popl %ebx popl %esi leave ret L_more_than_31: cmpl $64,%ecx jnc L_more_than_63 subb $32,%cl movl 4(%esi),%eax /* midl */ movl 8(%esi),%edx /* msl */ shrd %cl,%edx,%eax shr %cl,%edx movl %eax,(%esi) movl %edx,4(%esi) movl $0,8(%esi) popl %esi leave ret L_more_than_63: cmpl $96,%ecx jnc L_more_than_95 subb $64,%cl movl 8(%esi),%eax /* msl */ shr %cl,%eax xorl %edx,%edx movl %eax,(%esi) movl %edx,4(%esi) movl %edx,8(%esi) popl %esi leave ret L_more_than_95: xorl %eax,%eax movl %eax,(%esi) movl %eax,4(%esi) movl %eax,8(%esi) popl %esi leave ret