projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
merge from gcc
[deliverable/binutils-gdb.git]
/
gas
/
flonum-mult.c
diff --git
a/gas/flonum-mult.c
b/gas/flonum-mult.c
index 434a73b0411ca9f98e3cea7aeeed8f9306fa199d..6d17f0a86970e907e34ac9b7f268f3541b629d41 100644
(file)
--- a/
gas/flonum-mult.c
+++ b/
gas/flonum-mult.c
@@
-1,5
+1,6
@@
/* flonum_mult.c - multiply two flonums
/* flonum_mult.c - multiply two flonums
- Copyright (C) 1987, 1990, 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1987, 1990, 1991, 1992, 1995, 2000, 2002
+ Free Software Foundation, Inc.
This file is part of Gas, the GNU Assembler.
This file is part of Gas, the GNU Assembler.
@@
-18,29
+19,26
@@
in a file named COPYING. Among other things, the copyright
notice and this notice must be preserved on all copies. */
in a file named COPYING. Among other things, the copyright
notice and this notice must be preserved on all copies. */
-#include
<ansidecl.h>
+#include
"ansidecl.h"
#include "flonum.h"
/* plan for a . b => p(roduct)
#include "flonum.h"
/* plan for a . b => p(roduct)
-
-
+
+-------+-------+-/ /-+-------+-------+
| a | a | ... | a | a |
| A | A-1 | | 1 | 0 |
+-------+-------+-/ /-+-------+-------+
+-------+-------+-/ /-+-------+-------+
| a | a | ... | a | a |
| A | A-1 | | 1 | 0 |
+-------+-------+-/ /-+-------+-------+
-
-
+
+-------+-------+-/ /-+-------+-------+
| b | b | ... | b | b |
| B | B-1 | | 1 | 0 |
+-------+-------+-/ /-+-------+-------+
+-------+-------+-/ /-+-------+-------+
| b | b | ... | b | b |
| B | B-1 | | 1 | 0 |
+-------+-------+-/ /-+-------+-------+
-
-
+
+-------+-------+-/ /-+-------+-/ /-+-------+-------+
| p | p | ... | p | ... | p | p |
| A+B+1| A+B | | N | | 1 | 0 |
+-------+-------+-/ /-+-------+-/ /-+-------+-------+
+-------+-------+-/ /-+-------+-/ /-+-------+-------+
| p | p | ... | p | ... | p | p |
| A+B+1| A+B | | N | | 1 | 0 |
+-------+-------+-/ /-+-------+-/ /-+-------+-------+
-
+
/^\
(carry) a .b ... | ... a .b a .b
A B | 0 1 0 0
/^\
(carry) a .b ... | ... a .b a .b
A B | 0 1 0 0
@@
-56,49
+54,46
@@
| \
+----- P = > a .b
N /__ i j
| \
+----- P = > a .b
N /__ i j
-
+
N = 0 ... A+B
N = 0 ... A+B
-
+
for all i,j where i+j=N
[i,j integers > 0]
for all i,j where i+j=N
[i,j integers > 0]
-
+
a[], b[], p[] may not intersect.
Zero length factors signify 0 significant bits: treat as 0.0.
0.0 factors do the right thing.
Zero length product OK.
a[], b[], p[] may not intersect.
Zero length factors signify 0 significant bits: treat as 0.0.
0.0 factors do the right thing.
Zero length product OK.
-
+
I chose the ForTran accent "foo[bar]" instead of the C accent "*garply"
because I felt the ForTran way was more intuitive. The C way would
probably yield better code on most C compilers. Dean Elsner.
I chose the ForTran accent "foo[bar]" instead of the C accent "*garply"
because I felt the ForTran way was more intuitive. The C way would
probably yield better code on most C compilers. Dean Elsner.
- (C style also gives deeper insight [to me] ... oh well ...)
- */
+ (C style also gives deeper insight [to me] ... oh well ...) */
\f
\f
-void
-flonum_multip (a, b, product)
- const FLONUM_TYPE *a;
- const FLONUM_TYPE *b;
- FLONUM_TYPE *product;
+void
+flonum_multip (const FLONUM_TYPE *a, const FLONUM_TYPE *b,
+ FLONUM_TYPE *product)
{
{
- int size_of_a; /* 0 origin */
- int size_of_b; /* 0 origin */
- int size_of_product; /* 0 origin */
- int size_of_sum; /* 0 origin */
- int extra_product_positions; /* 1 origin */
+ int size_of_a; /* 0 origin
*/
+ int size_of_b; /* 0 origin
*/
+ int size_of_product; /* 0 origin
*/
+ int size_of_sum; /* 0 origin
*/
+ int extra_product_positions; /* 1 origin
*/
unsigned long work;
unsigned long carry;
long exponent;
LITTLENUM_TYPE *q;
long significant; /* TRUE when we emit a non-0 littlenum */
unsigned long work;
unsigned long carry;
long exponent;
LITTLENUM_TYPE *q;
long significant; /* TRUE when we emit a non-0 littlenum */
- /* ForTran accent follows. */
- int P; /* Scan product low-order -> high. */
+ /* ForTran accent follows.
*/
+ int P; /* Scan product low-order -> high.
*/
int N; /* As in sum above. */
int N; /* As in sum above. */
- int A; /* Which [] of a? */
- int B; /* Which [] of b? */
+ int A; /* Which [] of a?
*/
+ int B; /* Which [] of b?
*/
- if ((a->sign != '-' && a->sign != '+') || (b->sign != '-' && b->sign != '+'))
+ if ((a->sign != '-' && a->sign != '+')
+ || (b->sign != '-' && b->sign != '+'))
{
{
- /* ...
- Got to fail somehow. Any suggestions? */
+ /* Got to fail somehow. Any suggestions? */
product->sign = 0;
return;
}
product->sign = 0;
return;
}
@@
-111,8
+106,8
@@
flonum_multip (a, b, product)
extra_product_positions = size_of_product - size_of_sum;
if (extra_product_positions < 0)
{
extra_product_positions = size_of_product - size_of_sum;
if (extra_product_positions < 0)
{
- P = extra_product_positions; /* P < 0 */
- exponent -= extra_product_positions; /* Increases exponent. */
+ P = extra_product_positions; /* P < 0
*/
+ exponent -= extra_product_positions; /* Increases exponent.
*/
}
else
{
}
else
{
@@
-130,7
+125,8
@@
flonum_multip (a, b, product)
if (A <= size_of_a && B <= size_of_b && B >= 0)
{
#ifdef TRACE
if (A <= size_of_a && B <= size_of_b && B >= 0)
{
#ifdef TRACE
- printf ("a:low[%d.]=%04x b:low[%d.]=%04x work_before=%08x\n", A, a->low[A], B, b->low[B], work);
+ printf ("a:low[%d.]=%04x b:low[%d.]=%04x work_before=%08x\n",
+ A, a->low[A], B, b->low[B], work);
#endif
/* Watch out for sign extension! Without the casts, on
the DEC Alpha, the multiplication result is *signed*
#endif
/* Watch out for sign extension! Without the casts, on
the DEC Alpha, the multiplication result is *signed*
@@
-162,23
+158,19
@@
flonum_multip (a, b, product)
exponent++;
}
}
exponent++;
}
}
- /*
- * [P]-> position # size_of_sum + 1.
- * This is where 'carry' should go.
- */
+ /* [P]-> position # size_of_sum + 1.
+ This is where 'carry' should go. */
#ifdef TRACE
printf ("final carry =%04x\n", carry);
#endif
if (carry)
{
if (extra_product_positions > 0)
#ifdef TRACE
printf ("final carry =%04x\n", carry);
#endif
if (carry)
{
if (extra_product_positions > 0)
- {
- product->low[P] = carry;
- }
+ product->low[P] = carry;
else
{
else
{
- /* No room at high order for carry littlenum. */
- /* Shift right 1 to make room for most significant littlenum. */
+ /* No room at high order for carry littlenum.
*/
+ /* Shift right 1 to make room for most significant littlenum.
*/
exponent++;
P--;
for (q = product->low + P; q >= product->low; q--)
exponent++;
P--;
for (q = product->low + P; q >= product->low; q--)
@@
-190,11
+182,7
@@
flonum_multip (a, b, product)
}
}
else
}
}
else
- {
- P--;
- }
+ P--;
product->leader = product->low + P;
product->exponent = exponent;
}
product->leader = product->low + P;
product->exponent = exponent;
}
-
-/* end of flonum_mult.c */
This page took
0.025658 seconds
and
4
git commands to generate.