|
|
1.1 root 1: /*---------------------------------------------------------------------------+
2: | reg_norm.S |
3: | |
4: | Copyright (C) 1992 W. Metzenthen, 22 Parker St, Ormond, Vic 3163, |
5: | Australia. E-mail [email protected] |
6: | |
7: | Normalize the value in a FPU_REG. |
8: | |
9: | Call from C as: |
10: | void normalize(FPU_REG *n) |
11: | |
12: +---------------------------------------------------------------------------*/
13:
14: #include "fpu_asm.h"
15:
16:
17: .text
18:
19: .align 2,144
20: .globl normalize
21:
22: normalize:
23: pushl %ebp
24: movl %esp,%ebp
25: pushl %ebx
26:
27: movl PARAM1,%ebx
28:
29: movl SIGH(%ebx),%edx
30: movl SIGL(%ebx),%eax
31:
32: orl %edx,%edx // ms bits
33: js L_done // Already normalized
34: jnz L_shift_1 // Shift left 1 - 31 bits
35:
36: orl %eax,%eax
37: jz L_zero // The contents are zero
38:
39: L_shift_32:
40: movl %eax,%edx
41: xorl %eax,%eax
42: subl $32,EXP(%ebx) // This can cause an underflow
43:
44: /* We need to shift left by 1 - 31 bits */
45: L_shift_1:
46: bsrl %edx,%ecx /* get the required shift in %ecx */
47: subl $31,%ecx
48: negl %ecx
49: shld %cl,%eax,%edx
50: shl %cl,%eax
51: subl %ecx,EXP(%ebx) // This can cause an underflow
52:
53: movl %edx,SIGH(%ebx)
54: movl %eax,SIGL(%ebx)
55:
56: L_done:
57: cmpl EXP_OVER,EXP(%ebx)
58: jge L_overflow
59:
60: cmpl EXP_UNDER,EXP(%ebx)
61: jle L_underflow
62:
63: L_exit:
64: popl %ebx
65: leave
66: ret
67:
68:
69: L_zero:
70: movl EXP_UNDER,EXP(%ebx)
71: movb TW_Zero,TAG(%ebx)
72: jmp L_exit
73:
74: L_underflow:
75: push %ebx
76: call arith_underflow
77: pop %ebx
78: jmp L_exit
79:
80: L_overflow:
81: push %ebx
82: call arith_overflow
83: pop %ebx
84: jmp L_exit
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.