Blame view
arch/x86/math-emu/shr_Xsig.S
2.4 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
.file "shr_Xsig.S" /*---------------------------------------------------------------------------+ | shr_Xsig.S | | | | 12 byte right shift function | | | | Copyright (C) 1992,1994,1995 | | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | | Australia. E-mail billm@jacobi.maths.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_emu.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 |