File Index
Files and directories
Sign in
FILE

round_Xsig.S

File preview with syntax highlighting.

linux-6.19.14/arch/x86/math-emu/round_Xsig.S GAS
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*---------------------------------------------------------------------------+
  3 |  round_Xsig.S                                                             |
  4 |                                                                           |
  5 | Copyright (C) 1992,1993,1994,1995                                         |
  6 |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
  7 |                       Australia.  E-mail billm@jacobi.maths.monash.edu.au |
  8 |                                                                           |
  9 | Normalize and round a 12 byte quantity.                                   |
 10 | Call from C as:                                                           |
 11 |   int round_Xsig(Xsig *n)                                                 |
 12 |                                                                           |
 13 | Normalize a 12 byte quantity.                                             |
 14 | Call from C as:                                                           |
 15 |   int norm_Xsig(Xsig *n)                                                  |
 16 |                                                                           |
 17 | Each function returns the size of the shift (nr of bits).                 |
 18 |                                                                           |
 19 +---------------------------------------------------------------------------*/
 20	.file	"round_Xsig.S"
 21
 22#include "fpu_emu.h"
 23
 24
 25.text
 26SYM_FUNC_START(round_Xsig)
 27	pushl	%ebp
 28	movl	%esp,%ebp
 29	pushl	%ebx		/* Reserve some space */
 30	pushl	%ebx
 31	pushl	%esi
 32
 33	movl	PARAM1,%esi
 34
 35	movl	8(%esi),%edx
 36	movl	4(%esi),%ebx
 37	movl	(%esi),%eax
 38
 39	movl	$0,-4(%ebp)
 40
 41	orl	%edx,%edx	/* ms bits */
 42	js	L_round		/* Already normalized */
 43	jnz	L_shift_1	/* Shift left 1 - 31 bits */
 44
 45	movl	%ebx,%edx
 46	movl	%eax,%ebx
 47	xorl	%eax,%eax
 48	movl	$-32,-4(%ebp)
 49
 50/* We need to shift left by 1 - 31 bits */
 51L_shift_1:
 52	bsrl	%edx,%ecx	/* get the required shift in %ecx */
 53	subl	$31,%ecx
 54	negl	%ecx
 55	subl	%ecx,-4(%ebp)
 56	shld	%cl,%ebx,%edx
 57	shld	%cl,%eax,%ebx
 58	shl	%cl,%eax
 59
 60L_round:
 61	testl	$0x80000000,%eax
 62	jz	L_exit
 63
 64	addl	$1,%ebx
 65	adcl	$0,%edx
 66	jnz	L_exit
 67
 68	movl	$0x80000000,%edx
 69	incl	-4(%ebp)
 70
 71L_exit:
 72	movl	%edx,8(%esi)
 73	movl	%ebx,4(%esi)
 74	movl	%eax,(%esi)
 75
 76	movl	-4(%ebp),%eax
 77
 78	popl	%esi
 79	popl	%ebx
 80	leave
 81	RET
 82SYM_FUNC_END(round_Xsig)
 83
 84
 85
 86SYM_FUNC_START(norm_Xsig)
 87	pushl	%ebp
 88	movl	%esp,%ebp
 89	pushl	%ebx		/* Reserve some space */
 90	pushl	%ebx
 91	pushl	%esi
 92
 93	movl	PARAM1,%esi
 94
 95	movl	8(%esi),%edx
 96	movl	4(%esi),%ebx
 97	movl	(%esi),%eax
 98
 99	movl	$0,-4(%ebp)
100
101	orl	%edx,%edx	/* ms bits */
102	js	L_n_exit		/* Already normalized */
103	jnz	L_n_shift_1	/* Shift left 1 - 31 bits */
104
105	movl	%ebx,%edx
106	movl	%eax,%ebx
107	xorl	%eax,%eax
108	movl	$-32,-4(%ebp)
109
110	orl	%edx,%edx	/* ms bits */
111	js	L_n_exit	/* Normalized now */
112	jnz	L_n_shift_1	/* Shift left 1 - 31 bits */
113
114	movl	%ebx,%edx
115	movl	%eax,%ebx
116	xorl	%eax,%eax
117	addl	$-32,-4(%ebp)
118	jmp	L_n_exit	/* Might not be normalized,
119	                           but shift no more. */
120
121/* We need to shift left by 1 - 31 bits */
122L_n_shift_1:
123	bsrl	%edx,%ecx	/* get the required shift in %ecx */
124	subl	$31,%ecx
125	negl	%ecx
126	subl	%ecx,-4(%ebp)
127	shld	%cl,%ebx,%edx
128	shld	%cl,%eax,%ebx
129	shl	%cl,%eax
130
131L_n_exit:
132	movl	%edx,8(%esi)
133	movl	%ebx,4(%esi)
134	movl	%eax,(%esi)
135
136	movl	-4(%ebp),%eax
137
138	popl	%esi
139	popl	%ebx
140	leave
141	RET
142SYM_FUNC_END(norm_Xsig)
~/ Read-only file preview.