142 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*---------------------------------------------------------------------------+
 | |
|  |  round_Xsig.S                                                             |
 | |
|  |                                                                           |
 | |
|  | Copyright (C) 1992,1993,1994,1995                                         |
 | |
|  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
 | |
|  |                       Australia.  E-mail billm@jacobi.maths.monash.edu.au |
 | |
|  |                                                                           |
 | |
|  | Normalize and round a 12 byte quantity.                                   |
 | |
|  | Call from C as:                                                           |
 | |
|  |   int round_Xsig(Xsig *n)                                                 |
 | |
|  |                                                                           |
 | |
|  | Normalize a 12 byte quantity.                                             |
 | |
|  | Call from C as:                                                           |
 | |
|  |   int norm_Xsig(Xsig *n)                                                  |
 | |
|  |                                                                           |
 | |
|  | Each function returns the size of the shift (nr of bits).                 |
 | |
|  |                                                                           |
 | |
|  +---------------------------------------------------------------------------*/
 | |
| 	.file	"round_Xsig.S"
 | |
| 
 | |
| #include "fpu_emu.h"
 | |
| 
 | |
| 
 | |
| .text
 | |
| ENTRY(round_Xsig)
 | |
| 	pushl	%ebp
 | |
| 	movl	%esp,%ebp
 | |
| 	pushl	%ebx		/* Reserve some space */
 | |
| 	pushl	%ebx
 | |
| 	pushl	%esi
 | |
| 
 | |
| 	movl	PARAM1,%esi
 | |
| 
 | |
| 	movl	8(%esi),%edx
 | |
| 	movl	4(%esi),%ebx
 | |
| 	movl	(%esi),%eax
 | |
| 
 | |
| 	movl	$0,-4(%ebp)
 | |
| 
 | |
| 	orl	%edx,%edx	/* ms bits */
 | |
| 	js	L_round		/* Already normalized */
 | |
| 	jnz	L_shift_1	/* Shift left 1 - 31 bits */
 | |
| 
 | |
| 	movl	%ebx,%edx
 | |
| 	movl	%eax,%ebx
 | |
| 	xorl	%eax,%eax
 | |
| 	movl	$-32,-4(%ebp)
 | |
| 
 | |
| /* We need to shift left by 1 - 31 bits */
 | |
| L_shift_1:
 | |
| 	bsrl	%edx,%ecx	/* get the required shift in %ecx */
 | |
| 	subl	$31,%ecx
 | |
| 	negl	%ecx
 | |
| 	subl	%ecx,-4(%ebp)
 | |
| 	shld	%cl,%ebx,%edx
 | |
| 	shld	%cl,%eax,%ebx
 | |
| 	shl	%cl,%eax
 | |
| 
 | |
| L_round:
 | |
| 	testl	$0x80000000,%eax
 | |
| 	jz	L_exit
 | |
| 
 | |
| 	addl	$1,%ebx
 | |
| 	adcl	$0,%edx
 | |
| 	jnz	L_exit
 | |
| 
 | |
| 	movl	$0x80000000,%edx
 | |
| 	incl	-4(%ebp)
 | |
| 
 | |
| L_exit:
 | |
| 	movl	%edx,8(%esi)
 | |
| 	movl	%ebx,4(%esi)
 | |
| 	movl	%eax,(%esi)
 | |
| 
 | |
| 	movl	-4(%ebp),%eax
 | |
| 
 | |
| 	popl	%esi
 | |
| 	popl	%ebx
 | |
| 	leave
 | |
| 	ret
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| ENTRY(norm_Xsig)
 | |
| 	pushl	%ebp
 | |
| 	movl	%esp,%ebp
 | |
| 	pushl	%ebx		/* Reserve some space */
 | |
| 	pushl	%ebx
 | |
| 	pushl	%esi
 | |
| 
 | |
| 	movl	PARAM1,%esi
 | |
| 
 | |
| 	movl	8(%esi),%edx
 | |
| 	movl	4(%esi),%ebx
 | |
| 	movl	(%esi),%eax
 | |
| 
 | |
| 	movl	$0,-4(%ebp)
 | |
| 
 | |
| 	orl	%edx,%edx	/* ms bits */
 | |
| 	js	L_n_exit		/* Already normalized */
 | |
| 	jnz	L_n_shift_1	/* Shift left 1 - 31 bits */
 | |
| 
 | |
| 	movl	%ebx,%edx
 | |
| 	movl	%eax,%ebx
 | |
| 	xorl	%eax,%eax
 | |
| 	movl	$-32,-4(%ebp)
 | |
| 
 | |
| 	orl	%edx,%edx	/* ms bits */
 | |
| 	js	L_n_exit	/* Normalized now */
 | |
| 	jnz	L_n_shift_1	/* Shift left 1 - 31 bits */
 | |
| 
 | |
| 	movl	%ebx,%edx
 | |
| 	movl	%eax,%ebx
 | |
| 	xorl	%eax,%eax
 | |
| 	addl	$-32,-4(%ebp)
 | |
| 	jmp	L_n_exit	/* Might not be normalized,
 | |
| 	                           but shift no more. */
 | |
| 
 | |
| /* We need to shift left by 1 - 31 bits */
 | |
| L_n_shift_1:
 | |
| 	bsrl	%edx,%ecx	/* get the required shift in %ecx */
 | |
| 	subl	$31,%ecx
 | |
| 	negl	%ecx
 | |
| 	subl	%ecx,-4(%ebp)
 | |
| 	shld	%cl,%ebx,%edx
 | |
| 	shld	%cl,%eax,%ebx
 | |
| 	shl	%cl,%eax
 | |
| 
 | |
| L_n_exit:
 | |
| 	movl	%edx,8(%esi)
 | |
| 	movl	%ebx,4(%esi)
 | |
| 	movl	%eax,(%esi)
 | |
| 
 | |
| 	movl	-4(%ebp),%eax
 | |
| 
 | |
| 	popl	%esi
 | |
| 	popl	%ebx
 | |
| 	leave
 | |
| 	ret
 | |
| 
 |