88 lines
		
	
	
	
		
			2.4 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
	
		
			2.4 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| 
								 | 
							
									.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
							 |