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