Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
686cada4
Commit
686cada4
authored
Jul 19, 1996
by
Ian Lance Taylor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add MCF5200 support
From-SVN: r12534
parent
a418b6c5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
895 additions
and
28 deletions
+895
-28
gcc/config/m68k/lb1sf68.asm
+895
-28
No files found.
gcc/config/m68k/lb1sf68.asm
View file @
686cada4
...
@@ -244,12 +244,22 @@ FPTRAP = 15
...
@@ -244,12 +244,22 @@ FPTRAP = 15
$
_exception_handler
:
$
_exception_handler
:
lea
SYM
(
_fpCCR
),
a0
lea
SYM
(
_fpCCR
),
a0
movew
d7
,
a0
@
(
EBITS
)
|
set
__exception_bits
movew
d7
,
a0
@
(
EBITS
)
|
set
__exception_bits
#
ifndef
__mcf5200__
orw
d7
,
a0
@
(
STICK
)
|
and
__sticky_bits
orw
d7
,
a0
@
(
STICK
)
|
and
__sticky_bits
#
else
movew
a0
@
(
STICK
),
d4
orl
d7
,
d4
movew
d4
,
a0
@
(
STICK
)
#
endif
movew
d6
,
a0
@
(
FORMT
)
|
and
__format
movew
d6
,
a0
@
(
FORMT
)
|
and
__format
movew
d5
,
a0
@
(
LASTO
)
|
and
__last_operation
movew
d5
,
a0
@
(
LASTO
)
|
and
__last_operation
|
Now
put
the
operands
in
place
:
|
Now
put
the
operands
in
place
:
#
ifndef
__mcf5200__
cmpw
IMM
(
SINGLE_FLOAT
),
d6
cmpw
IMM
(
SINGLE_FLOAT
),
d6
#
else
cmpl
IMM
(
SINGLE_FLOAT
),
d6
#
endif
beq
1
f
beq
1
f
movel
a6
@
(
8
),
a0
@
(
OPER1
)
movel
a6
@
(
8
),
a0
@
(
OPER1
)
movel
a6
@
(
12
),
a0
@
(
OPER1
+
4
)
movel
a6
@
(
12
),
a0
@
(
OPER1
+
4
)
...
@@ -260,7 +270,13 @@ $_exception_handler:
...
@@ -260,7 +270,13 @@ $_exception_handler:
movel
a6
@
(
12
),
a0
@
(
OPER2
)
movel
a6
@
(
12
),
a0
@
(
OPER2
)
2
:
2
:
|
And
check
whether
the
exception
is
trap
-
enabled
:
|
And
check
whether
the
exception
is
trap
-
enabled
:
#
ifndef
__mcf5200__
andw
a0
@
(
TRAPE
),
d7
|
is
exception
trap
-
enabled
?
andw
a0
@
(
TRAPE
),
d7
|
is
exception
trap
-
enabled
?
#
else
clrl
d6
movew
a0
@
(
TRAPE
),
d6
andl
d6
,
d7
#
endif
beq
1
f
|
no
,
exit
beq
1
f
|
no
,
exit
pea
SYM
(
_fpCCR
)
|
yes
,
push
address
of
_fpCCR
pea
SYM
(
_fpCCR
)
|
yes
,
push
address
of
_fpCCR
trap
IMM
(
FPTRAP
)
|
and
trap
trap
IMM
(
FPTRAP
)
|
and
trap
...
@@ -278,7 +294,11 @@ SYM (__mulsi3):
...
@@ -278,7 +294,11 @@ SYM (__mulsi3):
muluw
sp
@
(
10
),
d0
/*
x0
*
y1
*/
muluw
sp
@
(
10
),
d0
/*
x0
*
y1
*/
movew
sp
@
(
6
),
d1
/*
x1
->
d1
*/
movew
sp
@
(
6
),
d1
/*
x1
->
d1
*/
muluw
sp
@
(
8
),
d1
/*
x1
*
y0
*/
muluw
sp
@
(
8
),
d1
/*
x1
*
y0
*/
#
ifndef
__mcf5200__
addw
d1
,
d0
addw
d1
,
d0
#
else
addl
d1
,
d0
#
endif
swap
d0
swap
d0
clrw
d0
clrw
d0
movew
sp
@
(
6
),
d1
/*
x1
->
d1
*/
movew
sp
@
(
6
),
d1
/*
x1
->
d1
*/
...
@@ -293,6 +313,7 @@ SYM (__mulsi3):
...
@@ -293,6 +313,7 @@ SYM (__mulsi3):
.
proc
.
proc
.
globl
SYM
(
__udivsi3
)
.
globl
SYM
(
__udivsi3
)
SYM
(
__udivsi3
)
:
SYM
(
__udivsi3
)
:
#
ifndef
__mcf5200__
movel
d2
,
sp
@
-
movel
d2
,
sp
@
-
movel
sp
@
(
12
),
d1
/*
d1
=
divisor
*/
movel
sp
@
(
12
),
d1
/*
d1
=
divisor
*/
movel
sp
@
(
8
),
d0
/*
d0
=
dividend
*/
movel
sp
@
(
8
),
d0
/*
d0
=
dividend
*/
...
@@ -336,6 +357,31 @@ L5: subql IMM (1), d0 /* adjust quotient */
...
@@ -336,6 +357,31 @@ L5: subql IMM (1), d0 /* adjust quotient */
L6
:
movel
sp
@
+
,
d2
L6
:
movel
sp
@
+
,
d2
rts
rts
#
else
/*
__mcf5200__
*/
/*
Coldfire
implementation
of
non
-
restoring
division
algorithm
from
Hennessy
&
Patterson
,
Appendix
A
.
*/
link
a6
,
IMM
(
0
)
moveml
d2
-
d4
,
sp
@
-
movel
a6
@
(
8
),
d0
movel
a6
@
(
12
),
d1
clrl
d2
|
clear
p
moveq
IMM
(
31
),
d4
L1
:
addl
d0
,
d0
|
shift
reg
pair
(
p
,
a
)
one
bit
left
addxl
d2
,
d2
movl
d2
,
d3
|
subtract
b
from
p
,
store
in
tmp
.
subl
d1
,
d3
jmi
L2
|
if
the
result
is
not
is
negative
,
set
the
bset
#
0
,
d0
|
low
order
bit
of
a
to
1
and
store
tmp
in
p
.
movl
d3
,
d2
L2
:
subql
IMM
(
1
),
d4
jcc
L1
moveml
sp
@
+
,
d2
-
d4
|
restore
data
registers
unlk
a6
|
and
return
rts
#
endif
/*
__mcf5200__
*/
#
endif
/*
L_udivsi3
*/
#
endif
/*
L_udivsi3
*/
#
ifdef
L_divsi3
#
ifdef
L_divsi3
...
@@ -345,15 +391,23 @@ L6: movel sp@+, d2
...
@@ -345,15 +391,23 @@ L6: movel sp@+, d2
SYM
(
__divsi3
)
:
SYM
(
__divsi3
)
:
movel
d2
,
sp
@
-
movel
d2
,
sp
@
-
move
b
IMM
(
1
),
d2
/*
sign
of
result
stored
in
d2
(
=
1
or
=-
1
)
*/
move
q
IMM
(
1
),
d2
/*
sign
of
result
stored
in
d2
(
=
1
or
=-
1
)
*/
movel
sp
@
(
12
),
d1
/*
d1
=
divisor
*/
movel
sp
@
(
12
),
d1
/*
d1
=
divisor
*/
jpl
L1
jpl
L1
negl
d1
negl
d1
#
ifndef
__mcf5200__
negb
d2
/*
change
sign
because
divisor
<
0
*/
negb
d2
/*
change
sign
because
divisor
<
0
*/
#
else
negl
d2
/*
change
sign
because
divisor
<
0
*/
#
endif
L1
:
movel
sp
@
(
8
),
d0
/*
d0
=
dividend
*/
L1
:
movel
sp
@
(
8
),
d0
/*
d0
=
dividend
*/
jpl
L2
jpl
L2
negl
d0
negl
d0
#
ifndef
__mcf5200__
negb
d2
negb
d2
#
else
negl
d2
#
endif
L2
:
movel
d1
,
sp
@
-
L2
:
movel
d1
,
sp
@
-
movel
d0
,
sp
@
-
movel
d0
,
sp
@
-
...
@@ -467,7 +521,7 @@ Ld$den:
...
@@ -467,7 +521,7 @@ Ld$den:
|
Return
and
signal
a
denormalized
number
|
Return
and
signal
a
denormalized
number
orl
d7
,
d0
orl
d7
,
d0
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
move
w
IMM
(
DOUBLE_FLOAT
),
d6
move
q
IMM
(
DOUBLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Ld
$
infty
:
Ld
$
infty
:
...
@@ -477,7 +531,7 @@ Ld$overflow:
...
@@ -477,7 +531,7 @@ Ld$overflow:
movel
IMM
(
0
),
d1
movel
IMM
(
0
),
d1
orl
d7
,
d0
orl
d7
,
d0
movew
IMM
(
INEXACT_RESULT
+
OVERFLOW
),
d7
movew
IMM
(
INEXACT_RESULT
+
OVERFLOW
),
d7
move
w
IMM
(
DOUBLE_FLOAT
),
d6
move
q
IMM
(
DOUBLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Ld
$
underflow
:
Ld
$
underflow
:
...
@@ -485,7 +539,7 @@ Ld$underflow:
...
@@ -485,7 +539,7 @@ Ld$underflow:
movel
IMM
(
0
),
d0
movel
IMM
(
0
),
d0
movel
d0
,
d1
movel
d0
,
d1
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
move
w
IMM
(
DOUBLE_FLOAT
),
d6
move
q
IMM
(
DOUBLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Ld
$
inop
:
Ld
$
inop
:
...
@@ -493,7 +547,7 @@ Ld$inop:
...
@@ -493,7 +547,7 @@ Ld$inop:
movel
IMM
(
QUIET_NaN
),
d0
movel
IMM
(
QUIET_NaN
),
d0
movel
d0
,
d1
movel
d0
,
d1
movew
IMM
(
INEXACT_RESULT
+
INVALID_OPERATION
),
d7
movew
IMM
(
INEXACT_RESULT
+
INVALID_OPERATION
),
d7
move
w
IMM
(
DOUBLE_FLOAT
),
d6
move
q
IMM
(
DOUBLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Ld
$
div
$
0
:
Ld
$
div
$
0
:
...
@@ -502,7 +556,7 @@ Ld$div$0:
...
@@ -502,7 +556,7 @@ Ld$div$0:
movel
IMM
(
0
),
d1
movel
IMM
(
0
),
d1
orl
d7
,
d0
orl
d7
,
d0
movew
IMM
(
INEXACT_RESULT
+
DIVIDE_BY_ZERO
),
d7
movew
IMM
(
INEXACT_RESULT
+
DIVIDE_BY_ZERO
),
d7
move
w
IMM
(
DOUBLE_FLOAT
),
d6
move
q
IMM
(
DOUBLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
|=============================================================================
|=============================================================================
...
@@ -558,10 +612,15 @@ SYM (__adddf3):
...
@@ -558,10 +612,15 @@ SYM (__adddf3):
andl
IMM
(
0x80000000
),
d7
|
isolate
a
'
s
sign
bit
'
andl
IMM
(
0x80000000
),
d7
|
isolate
a
'
s
sign
bit
'
swap
d6
|
and
also
b
'
s
sign
bit
'
swap
d6
|
and
also
b
'
s
sign
bit
'
#
ifndef
__mcf5200__
andw
IMM
(
0x8000
),
d6
|
andw
IMM
(
0x8000
),
d6
|
orw
d6
,
d7
|
and
combine
them
into
d7
,
so
that
a
'
s
sign
'
orw
d6
,
d7
|
and
combine
them
into
d7
,
so
that
a
'
s
sign
'
|
bit
is
in
the
high
word
and
b
'
s
is
in
the
'
|
bit
is
in
the
high
word
and
b
'
s
is
in
the
'
|
low
word
,
so
d6
is
free
to
be
used
|
low
word
,
so
d6
is
free
to
be
used
#
else
andl
IMM
(
0x8000
),
d6
orl
d6
,
d7
#
endif
movel
d7
,
a0
|
now
save
d7
into
a0
,
so
d7
is
free
to
movel
d7
,
a0
|
now
save
d7
into
a0
,
so
d7
is
free
to
|
be
used
also
|
be
used
also
...
@@ -580,7 +639,11 @@ SYM (__adddf3):
...
@@ -580,7 +639,11 @@ SYM (__adddf3):
orl
d7
,
d0
|
and
put
hidden
bit
back
orl
d7
,
d0
|
and
put
hidden
bit
back
Ladddf
$
1
:
Ladddf
$
1
:
swap
d4
|
shift
right
exponent
so
that
it
starts
swap
d4
|
shift
right
exponent
so
that
it
starts
#
ifndef
__mcf5200__
lsrw
IMM
(
5
),
d4
|
in
bit
0
and
not
bit
20
lsrw
IMM
(
5
),
d4
|
in
bit
0
and
not
bit
20
#
else
lsrl
IMM
(
5
),
d4
|
in
bit
0
and
not
bit
20
#
endif
|
Now
we
have
a
'
s
exponent
in
d4
and
fraction
in
d0
-
d1
'
|
Now
we
have
a
'
s
exponent
in
d4
and
fraction
in
d0
-
d1
'
movel
d2
,
d5
|
save
b
to
get
exponent
movel
d2
,
d5
|
save
b
to
get
exponent
andl
d6
,
d5
|
get
exponent
in
d5
andl
d6
,
d5
|
get
exponent
in
d5
...
@@ -592,7 +655,11 @@ Ladddf$1:
...
@@ -592,7 +655,11 @@ Ladddf$1:
orl
d7
,
d2
|
and
put
hidden
bit
back
orl
d7
,
d2
|
and
put
hidden
bit
back
Ladddf
$
2
:
Ladddf
$
2
:
swap
d5
|
shift
right
exponent
so
that
it
starts
swap
d5
|
shift
right
exponent
so
that
it
starts
#
ifndef
__mcf5200__
lsrw
IMM
(
5
),
d5
|
in
bit
0
and
not
bit
20
lsrw
IMM
(
5
),
d5
|
in
bit
0
and
not
bit
20
#
else
lsrl
IMM
(
5
),
d5
|
in
bit
0
and
not
bit
20
#
endif
|
Now
we
have
b
'
s
exponent
in
d5
and
fraction
in
d2
-
d3
.
'
|
Now
we
have
b
'
s
exponent
in
d5
and
fraction
in
d2
-
d3
.
'
...
@@ -603,7 +670,11 @@ Ladddf$2:
...
@@ -603,7 +670,11 @@ Ladddf$2:
|
and
d4
-
d5
-
d6
-
d7
for
the
second
.
To
do
this
we
store
(
temporarily
)
the
|
and
d4
-
d5
-
d6
-
d7
for
the
second
.
To
do
this
we
store
(
temporarily
)
the
|
exponents
in
a2
-
a3
.
|
exponents
in
a2
-
a3
.
#
ifndef
__mcf5200__
moveml
a2
-
a3
,
sp
@
-
|
save
the
address
registers
moveml
a2
-
a3
,
sp
@
-
|
save
the
address
registers
#
else
moveml
a2
-
a4
,
sp
@
-
|
save
the
address
registers
#
endif
movel
d4
,
a2
|
save
the
exponents
movel
d4
,
a2
|
save
the
exponents
movel
d5
,
a3
|
movel
d5
,
a3
|
...
@@ -617,32 +688,88 @@ Ladddf$2:
...
@@ -617,32 +688,88 @@ Ladddf$2:
|
Here
we
shift
the
numbers
until
the
exponents
are
the
same
,
and
put
|
Here
we
shift
the
numbers
until
the
exponents
are
the
same
,
and
put
|
the
largest
exponent
in
a2
.
|
the
largest
exponent
in
a2
.
#
ifndef
__mcf5200__
exg
d4
,
a2
|
get
exponents
back
exg
d4
,
a2
|
get
exponents
back
exg
d5
,
a3
|
exg
d5
,
a3
|
cmpw
d4
,
d5
|
compare
the
exponents
cmpw
d4
,
d5
|
compare
the
exponents
#
else
movel
d4
,
a4
|
get
exponents
back
movel
a2
,
d4
movel
a4
,
a2
movel
d5
,
a4
movel
a3
,
d5
movel
a4
,
a3
cmpl
d4
,
d5
|
compare
the
exponents
#
endif
beq
Ladddf
$
3
|
if
equal
don
'
t
shift
'
beq
Ladddf
$
3
|
if
equal
don
'
t
shift
'
bhi
9
f
|
branch
if
second
exponent
is
higher
bhi
9
f
|
branch
if
second
exponent
is
higher
|
Here
we
have
a
'
s
exponent
larger
than
b
'
s
,
so
we
have
to
shift
b
.
We
do
|
Here
we
have
a
'
s
exponent
larger
than
b
'
s
,
so
we
have
to
shift
b
.
We
do
|
this
by
using
as
counter
d2
:
|
this
by
using
as
counter
d2
:
1
:
movew
d4
,
d2
|
move
largest
exponent
to
d2
1
:
movew
d4
,
d2
|
move
largest
exponent
to
d2
#
ifndef
__mcf5200__
subw
d5
,
d2
|
and
subtract
second
exponent
subw
d5
,
d2
|
and
subtract
second
exponent
exg
d4
,
a2
|
get
back
the
longs
we
saved
exg
d4
,
a2
|
get
back
the
longs
we
saved
exg
d5
,
a3
|
exg
d5
,
a3
|
#
else
subl
d5
,
d2
|
and
subtract
second
exponent
movel
d4
,
a4
|
get
back
the
longs
we
saved
movel
a2
,
d4
movel
a4
,
a2
movel
d5
,
a4
movel
a3
,
d5
movel
a4
,
a3
#
endif
|
if
difference
is
too
large
we
don
'
t
shift
(
actually
,
we
can
just
exit
)
'
|
if
difference
is
too
large
we
don
'
t
shift
(
actually
,
we
can
just
exit
)
'
#
ifndef
__mcf5200__
cmpw
IMM
(
DBL_MANT_DIG
+
2
),
d2
cmpw
IMM
(
DBL_MANT_DIG
+
2
),
d2
#
else
cmpl
IMM
(
DBL_MANT_DIG
+
2
),
d2
#
endif
bge
Ladddf
$
b
$
small
bge
Ladddf
$
b
$
small
#
ifndef
__mcf5200__
cmpw
IMM
(
32
),
d2
|
if
difference
>=
32
,
shift
by
longs
cmpw
IMM
(
32
),
d2
|
if
difference
>=
32
,
shift
by
longs
#
else
cmpl
IMM
(
32
),
d2
|
if
difference
>=
32
,
shift
by
longs
#
endif
bge
5
f
bge
5
f
2
:
cmpw
IMM
(
16
),
d2
|
if
difference
>=
16
,
shift
by
words
2
:
#
ifndef
__mcf5200__
cmpw
IMM
(
16
),
d2
|
if
difference
>=
16
,
shift
by
words
#
else
cmpl
IMM
(
16
),
d2
|
if
difference
>=
16
,
shift
by
words
#
endif
bge
6
f
bge
6
f
bra
3
f
|
enter
dbra
loop
bra
3
f
|
enter
dbra
loop
4
:
lsrl
IMM
(
1
),
d4
4
:
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d4
roxrl
IMM
(
1
),
d5
roxrl
IMM
(
1
),
d5
roxrl
IMM
(
1
),
d6
roxrl
IMM
(
1
),
d6
roxrl
IMM
(
1
),
d7
roxrl
IMM
(
1
),
d7
3
:
dbra
d2
,
4
b
#
else
lsrl
IMM
(
1
),
d7
btst
IMM
(
0
),
d6
beq
10
f
bset
IMM
(
31
),
d7
10
:
lsrl
IMM
(
1
),
d6
btst
IMM
(
0
),
d5
beq
11
f
bset
IMM
(
31
),
d6
11
:
lsrl
IMM
(
1
),
d5
btst
IMM
(
0
),
d4
beq
12
f
bset
IMM
(
31
),
d5
12
:
lsrl
IMM
(
1
),
d4
#
endif
3
:
#
ifndef
__mcf5200__
dbra
d2
,
4
b
#
else
subql
IMM
(
1
),
d2
bpl
4
b
#
endif
movel
IMM
(
0
),
d2
movel
IMM
(
0
),
d2
movel
d2
,
d3
movel
d2
,
d3
bra
Ladddf
$
4
bra
Ladddf
$
4
...
@@ -651,7 +778,11 @@ Ladddf$2:
...
@@ -651,7 +778,11 @@ Ladddf$2:
movel
d5
,
d6
movel
d5
,
d6
movel
d4
,
d5
movel
d4
,
d5
movel
IMM
(
0
),
d4
movel
IMM
(
0
),
d4
#
ifndef
__mcf5200__
subw
IMM
(
32
),
d2
subw
IMM
(
32
),
d2
#
else
subl
IMM
(
32
),
d2
#
endif
bra
2
b
bra
2
b
6
:
6
:
movew
d6
,
d7
movew
d6
,
d7
...
@@ -662,28 +793,82 @@ Ladddf$2:
...
@@ -662,28 +793,82 @@ Ladddf$2:
swap
d5
swap
d5
movew
IMM
(
0
),
d4
movew
IMM
(
0
),
d4
swap
d4
swap
d4
#
ifndef
__mcf5200__
subw
IMM
(
16
),
d2
subw
IMM
(
16
),
d2
#
else
subl
IMM
(
16
),
d2
#
endif
bra
3
b
bra
3
b
9
:
exg
d4
,
d5
9
:
#
ifndef
__mcf5200__
exg
d4
,
d5
movew
d4
,
d6
movew
d4
,
d6
subw
d5
,
d6
|
keep
d5
(
largest
exponent
)
in
d4
subw
d5
,
d6
|
keep
d5
(
largest
exponent
)
in
d4
exg
d4
,
a2
exg
d4
,
a2
exg
d5
,
a3
exg
d5
,
a3
#
else
movel
d5
,
d6
movel
d4
,
d5
movel
d6
,
d4
subl
d5
,
d6
movel
d4
,
a4
movel
a2
,
d4
movel
a4
,
a2
movel
d5
,
a4
movel
a3
,
d5
movel
a4
,
a3
#
endif
|
if
difference
is
too
large
we
don
'
t
shift
(
actually
,
we
can
just
exit
)
'
|
if
difference
is
too
large
we
don
'
t
shift
(
actually
,
we
can
just
exit
)
'
#
ifndef
__mcf5200__
cmpw
IMM
(
DBL_MANT_DIG
+
2
),
d6
cmpw
IMM
(
DBL_MANT_DIG
+
2
),
d6
#
else
cmpl
IMM
(
DBL_MANT_DIG
+
2
),
d6
#
endif
bge
Ladddf
$
a
$
small
bge
Ladddf
$
a
$
small
#
ifndef
__mcf5200__
cmpw
IMM
(
32
),
d6
|
if
difference
>=
32
,
shift
by
longs
cmpw
IMM
(
32
),
d6
|
if
difference
>=
32
,
shift
by
longs
#
else
cmpl
IMM
(
32
),
d6
|
if
difference
>=
32
,
shift
by
longs
#
endif
bge
5
f
bge
5
f
2
:
cmpw
IMM
(
16
),
d6
|
if
difference
>=
16
,
shift
by
words
2
:
#
ifndef
__mcf5200__
cmpw
IMM
(
16
),
d6
|
if
difference
>=
16
,
shift
by
words
#
else
cmpl
IMM
(
16
),
d6
|
if
difference
>=
16
,
shift
by
words
#
endif
bge
6
f
bge
6
f
bra
3
f
|
enter
dbra
loop
bra
3
f
|
enter
dbra
loop
4
:
lsrl
IMM
(
1
),
d0
4
:
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d3
roxrl
IMM
(
1
),
d3
3
:
dbra
d6
,
4
b
#
else
lsrl
IMM
(
1
),
d3
btst
IMM
(
0
),
d2
beq
10
f
bset
IMM
(
31
),
d3
10
:
lsrl
IMM
(
1
),
d2
btst
IMM
(
0
),
d1
beq
11
f
bset
IMM
(
31
),
d2
11
:
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
12
f
bset
IMM
(
31
),
d1
12
:
lsrl
IMM
(
1
),
d0
#
endif
3
:
#
ifndef
__mcf5200__
dbra
d6
,
4
b
#
else
subql
IMM
(
1
),
d6
bpl
4
b
#
endif
movel
IMM
(
0
),
d7
movel
IMM
(
0
),
d7
movel
d7
,
d6
movel
d7
,
d6
bra
Ladddf
$
4
bra
Ladddf
$
4
...
@@ -692,7 +877,11 @@ Ladddf$2:
...
@@ -692,7 +877,11 @@ Ladddf$2:
movel
d1
,
d2
movel
d1
,
d2
movel
d0
,
d1
movel
d0
,
d1
movel
IMM
(
0
),
d0
movel
IMM
(
0
),
d0
#
ifndef
__mcf5200__
subw
IMM
(
32
),
d6
subw
IMM
(
32
),
d6
#
else
subl
IMM
(
32
),
d6
#
endif
bra
2
b
bra
2
b
6
:
6
:
movew
d2
,
d3
movew
d2
,
d3
...
@@ -703,18 +892,40 @@ Ladddf$2:
...
@@ -703,18 +892,40 @@ Ladddf$2:
swap
d1
swap
d1
movew
IMM
(
0
),
d0
movew
IMM
(
0
),
d0
swap
d0
swap
d0
#
ifndef
__mcf5200__
subw
IMM
(
16
),
d6
subw
IMM
(
16
),
d6
#
else
subl
IMM
(
16
),
d6
#
endif
bra
3
b
bra
3
b
Ladddf
$
3
:
Ladddf
$
3
:
#
ifndef
__mcf5200__
exg
d4
,
a2
exg
d4
,
a2
exg
d5
,
a3
exg
d5
,
a3
#
else
movel
d4
,
a4
movel
a2
,
d4
movel
a4
,
a2
movel
d5
,
a4
movel
a3
,
d5
movel
a4
,
a3
#
endif
Ladddf
$
4
:
Ladddf
$
4
:
|
Now
we
have
the
numbers
in
d0
--
d3
and
d4
--
d7
,
the
exponent
in
a2
,
and
|
Now
we
have
the
numbers
in
d0
--
d3
and
d4
--
d7
,
the
exponent
in
a2
,
and
|
the
signs
in
a4
.
|
the
signs
in
a4
.
|
Here
we
have
to
decide
whether
to
add
or
subtract
the
numbers
:
|
Here
we
have
to
decide
whether
to
add
or
subtract
the
numbers
:
#
ifndef
__mcf5200__
exg
d7
,
a0
|
get
the
signs
exg
d7
,
a0
|
get
the
signs
exg
d6
,
a3
|
a3
is
free
to
be
used
exg
d6
,
a3
|
a3
is
free
to
be
used
#
else
movel
d7
,
a4
movel
a0
,
d7
movel
a4
,
a0
movel
d6
,
a4
movel
a3
,
d6
movel
a4
,
a3
#
endif
movel
d7
,
d6
|
movel
d7
,
d6
|
movew
IMM
(
0
),
d7
|
get
a
'
s
sign
in
d7
'
movew
IMM
(
0
),
d7
|
get
a
'
s
sign
in
d7
'
swap
d6
|
swap
d6
|
...
@@ -722,8 +933,17 @@ Ladddf$4:
...
@@ -722,8 +933,17 @@ Ladddf$4:
eorl
d7
,
d6
|
compare
the
signs
eorl
d7
,
d6
|
compare
the
signs
bmi
Lsubdf
$
0
|
if
the
signs
are
different
we
have
bmi
Lsubdf
$
0
|
if
the
signs
are
different
we
have
|
to
subtract
|
to
subtract
#
ifndef
__mcf5200__
exg
d7
,
a0
|
else
we
add
the
numbers
exg
d7
,
a0
|
else
we
add
the
numbers
exg
d6
,
a3
|
exg
d6
,
a3
|
#
else
movel
d7
,
a4
movel
a0
,
d7
movel
a4
,
a0
movel
d6
,
a4
movel
a3
,
d6
movel
a4
,
a3
#
endif
addl
d7
,
d3
|
addl
d7
,
d3
|
addxl
d6
,
d2
|
addxl
d6
,
d2
|
addxl
d5
,
d1
|
addxl
d5
,
d1
|
...
@@ -733,7 +953,11 @@ Ladddf$4:
...
@@ -733,7 +953,11 @@ Ladddf$4:
movel
a0
,
d7
|
movel
a0
,
d7
|
andl
IMM
(
0x80000000
),
d7
|
d7
now
has
the
sign
andl
IMM
(
0x80000000
),
d7
|
d7
now
has
the
sign
#
ifndef
__mcf5200__
moveml
sp
@
+
,
a2
-
a3
moveml
sp
@
+
,
a2
-
a3
#
else
moveml
sp
@
+
,
a2
-
a4
#
endif
|
Before
rounding
normalize
so
bit
#
DBL_MANT_DIG
is
set
(
we
will
consider
|
Before
rounding
normalize
so
bit
#
DBL_MANT_DIG
is
set
(
we
will
consider
|
the
case
of
denormalized
numbers
in
the
rounding
routine
itself
).
|
the
case
of
denormalized
numbers
in
the
rounding
routine
itself
).
...
@@ -741,28 +965,64 @@ Ladddf$4:
...
@@ -741,28 +965,64 @@ Ladddf$4:
|
one
more
bit
we
check
this
:
|
one
more
bit
we
check
this
:
btst
IMM
(
DBL_MANT_DIG
+
1
),
d0
btst
IMM
(
DBL_MANT_DIG
+
1
),
d0
beq
1
f
beq
1
f
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d3
roxrl
IMM
(
1
),
d3
addw
IMM
(
1
),
d4
addw
IMM
(
1
),
d4
#
else
lsrl
IMM
(
1
),
d3
btst
IMM
(
0
),
d2
beq
10
f
bset
IMM
(
31
),
d3
10
:
lsrl
IMM
(
1
),
d2
btst
IMM
(
0
),
d1
beq
11
f
bset
IMM
(
31
),
d2
11
:
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
12
f
bset
IMM
(
31
),
d1
12
:
lsrl
IMM
(
1
),
d0
addl
IMM
(
1
),
d4
#
endif
1
:
1
:
lea
Ladddf
$
5
,
a0
|
to
return
from
rounding
routine
lea
Ladddf
$
5
,
a0
|
to
return
from
rounding
routine
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
#
ifdef
__mcf5200__
clrl
d6
#
endif
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
beq
Lround
$
to
$
nearest
beq
Lround
$
to
$
nearest
#
ifndef
__mcf5200__
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
#
else
cmpl
IMM
(
ROUND_TO_PLUS
),
d6
#
endif
bhi
Lround
$
to
$
minus
bhi
Lround
$
to
$
minus
blt
Lround
$
to
$
zero
blt
Lround
$
to
$
zero
bra
Lround
$
to
$
plus
bra
Lround
$
to
$
plus
Ladddf
$
5
:
Ladddf
$
5
:
|
Put
back
the
exponent
and
check
for
overflow
|
Put
back
the
exponent
and
check
for
overflow
#
ifndef
__mcf5200__
cmpw
IMM
(
0x7ff
),
d4
|
is
the
exponent
big
?
cmpw
IMM
(
0x7ff
),
d4
|
is
the
exponent
big
?
#
else
cmpl
IMM
(
0x7ff
),
d4
|
is
the
exponent
big
?
#
endif
bge
1
f
bge
1
f
bclr
IMM
(
DBL_MANT_DIG
-
1
),
d0
bclr
IMM
(
DBL_MANT_DIG
-
1
),
d0
#
ifndef
__mcf5200__
lslw
IMM
(
4
),
d4
|
put
exponent
back
into
position
lslw
IMM
(
4
),
d4
|
put
exponent
back
into
position
#
else
lsll
IMM
(
4
),
d4
|
put
exponent
back
into
position
#
endif
swap
d0
|
swap
d0
|
#
ifndef
__mcf5200__
orw
d4
,
d0
|
orw
d4
,
d0
|
#
else
orl
d4
,
d0
|
#
endif
swap
d0
|
swap
d0
|
bra
Ladddf
$
ret
bra
Ladddf
$
ret
1
:
1
:
...
@@ -771,17 +1031,26 @@ Ladddf$5:
...
@@ -771,17 +1031,26 @@ Ladddf$5:
Lsubdf
$
0
:
Lsubdf
$
0
:
|
Here
we
do
the
subtraction
.
|
Here
we
do
the
subtraction
.
#
ifndef
__mcf5200__
exg
d7
,
a0
|
put
sign
back
in
a0
exg
d7
,
a0
|
put
sign
back
in
a0
exg
d6
,
a3
|
exg
d6
,
a3
|
#
else
movel
d7
,
a4
movel
a0
,
d7
movel
a4
,
a0
movel
d6
,
a4
movel
a3
,
d6
movel
a4
,
a3
#
endif
subl
d7
,
d3
|
subl
d7
,
d3
|
subxl
d6
,
d2
|
subxl
d6
,
d2
|
subxl
d5
,
d1
|
subxl
d5
,
d1
|
subxl
d4
,
d0
|
subxl
d4
,
d0
|
beq
Ladddf
$
ret
$
1
|
if
zero
just
exit
beq
Ladddf
$
ret
$
1
|
if
zero
just
exit
bpl
1
f
|
if
positive
skip
the
following
bpl
1
f
|
if
positive
skip
the
following
exg
d7
,
a0
|
movel
a0
,
d7
|
bchg
IMM
(
31
),
d7
|
change
sign
bit
in
d7
bchg
IMM
(
31
),
d7
|
change
sign
bit
in
d7
exg
d7
,
a0
|
movel
d7
,
a0
|
negl
d3
|
negl
d3
|
negxl
d2
|
negxl
d2
|
negxl
d1
|
and
negate
result
negxl
d1
|
and
negate
result
...
@@ -790,7 +1059,11 @@ Lsubdf$0:
...
@@ -790,7 +1059,11 @@ Lsubdf$0:
movel
a2
,
d4
|
return
exponent
to
d4
movel
a2
,
d4
|
return
exponent
to
d4
movel
a0
,
d7
movel
a0
,
d7
andl
IMM
(
0x80000000
),
d7
|
isolate
sign
bit
andl
IMM
(
0x80000000
),
d7
|
isolate
sign
bit
#
ifndef
__mcf5200__
moveml
sp
@
+
,
a2
-
a3
|
moveml
sp
@
+
,
a2
-
a3
|
#
else
moveml
sp
@
+
,
a2
-
a4
|
#
endif
|
Before
rounding
normalize
so
bit
#
DBL_MANT_DIG
is
set
(
we
will
consider
|
Before
rounding
normalize
so
bit
#
DBL_MANT_DIG
is
set
(
we
will
consider
|
the
case
of
denormalized
numbers
in
the
rounding
routine
itself
).
|
the
case
of
denormalized
numbers
in
the
rounding
routine
itself
).
...
@@ -798,26 +1071,58 @@ Lsubdf$0:
...
@@ -798,26 +1071,58 @@ Lsubdf$0:
|
one
more
bit
we
check
this
:
|
one
more
bit
we
check
this
:
btst
IMM
(
DBL_MANT_DIG
+
1
),
d0
btst
IMM
(
DBL_MANT_DIG
+
1
),
d0
beq
1
f
beq
1
f
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d3
roxrl
IMM
(
1
),
d3
addw
IMM
(
1
),
d4
addw
IMM
(
1
),
d4
#
else
lsrl
IMM
(
1
),
d3
btst
IMM
(
0
),
d2
beq
10
f
bset
IMM
(
31
),
d3
10
:
lsrl
IMM
(
1
),
d2
btst
IMM
(
0
),
d1
beq
11
f
bset
IMM
(
31
),
d2
11
:
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
12
f
bset
IMM
(
31
),
d1
12
:
lsrl
IMM
(
1
),
d0
addl
IMM
(
1
),
d4
#
endif
1
:
1
:
lea
Lsubdf
$
1
,
a0
|
to
return
from
rounding
routine
lea
Lsubdf
$
1
,
a0
|
to
return
from
rounding
routine
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
#
ifdef
__mcf5200__
clrl
d6
#
endif
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
beq
Lround
$
to
$
nearest
beq
Lround
$
to
$
nearest
#
ifndef
__mcf5200__
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
#
else
cmpl
IMM
(
ROUND_TO_PLUS
),
d6
#
endif
bhi
Lround
$
to
$
minus
bhi
Lround
$
to
$
minus
blt
Lround
$
to
$
zero
blt
Lround
$
to
$
zero
bra
Lround
$
to
$
plus
bra
Lround
$
to
$
plus
Lsubdf
$
1
:
Lsubdf
$
1
:
|
Put
back
the
exponent
and
sign
(
we
don
'
t
have
overflow
).
'
|
Put
back
the
exponent
and
sign
(
we
don
'
t
have
overflow
).
'
bclr
IMM
(
DBL_MANT_DIG
-
1
),
d0
bclr
IMM
(
DBL_MANT_DIG
-
1
),
d0
#
ifndef
__mcf5200__
lslw
IMM
(
4
),
d4
|
put
exponent
back
into
position
lslw
IMM
(
4
),
d4
|
put
exponent
back
into
position
#
else
lsll
IMM
(
4
),
d4
|
put
exponent
back
into
position
#
endif
swap
d0
|
swap
d0
|
#
ifndef
__mcf5200__
orw
d4
,
d0
|
orw
d4
,
d0
|
#
else
orl
d4
,
d0
|
#
endif
swap
d0
|
swap
d0
|
bra
Ladddf
$
ret
bra
Ladddf
$
ret
...
@@ -825,7 +1130,11 @@ Lsubdf$1:
...
@@ -825,7 +1130,11 @@ Lsubdf$1:
|
DBL_MANT_DIG
+
1
)
we
return
the
other
(
and
now
we
don
'
t
have
to
'
|
DBL_MANT_DIG
+
1
)
we
return
the
other
(
and
now
we
don
'
t
have
to
'
|
check
for
finiteness
or
zero
).
|
check
for
finiteness
or
zero
).
Ladddf
$
a
$
small
:
Ladddf
$
a
$
small
:
#
ifndef
__mcf5200__
moveml
sp
@
+
,
a2
-
a3
moveml
sp
@
+
,
a2
-
a3
#
else
moveml
sp
@
+
,
a2
-
a4
#
endif
movel
a6
@
(
16
),
d0
movel
a6
@
(
16
),
d0
movel
a6
@
(
20
),
d1
movel
a6
@
(
20
),
d1
lea
SYM
(
_fpCCR
),
a0
lea
SYM
(
_fpCCR
),
a0
...
@@ -835,7 +1144,11 @@ Ladddf$a$small:
...
@@ -835,7 +1144,11 @@ Ladddf$a$small:
rts
rts
Ladddf
$
b
$
small
:
Ladddf
$
b
$
small
:
#
ifndef
__mcf5200__
moveml
sp
@
+
,
a2
-
a3
moveml
sp
@
+
,
a2
-
a3
#
else
moveml
sp
@
+
,
a2
-
a4
#
endif
movel
a6
@
(
8
),
d0
movel
a6
@
(
8
),
d0
movel
a6
@
(
12
),
d1
movel
a6
@
(
12
),
d1
lea
SYM
(
_fpCCR
),
a0
lea
SYM
(
_fpCCR
),
a0
...
@@ -893,8 +1206,16 @@ Ladddf$ret:
...
@@ -893,8 +1206,16 @@ Ladddf$ret:
Ladddf
$
ret
$
den
:
Ladddf
$
ret
$
den
:
|
Return
a
denormalized
number
.
|
Return
a
denormalized
number
.
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
|
shift
right
once
more
lsrl
IMM
(
1
),
d0
|
shift
right
once
more
roxrl
IMM
(
1
),
d1
|
roxrl
IMM
(
1
),
d1
|
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
#
endif
bra
Ladddf
$
ret
bra
Ladddf
$
ret
Ladddf
$
nf
:
Ladddf
$
nf
:
...
@@ -987,17 +1308,30 @@ SYM (__muldf3):
...
@@ -987,17 +1308,30 @@ SYM (__muldf3):
andl
d6
,
d0
|
isolate
fraction
andl
d6
,
d0
|
isolate
fraction
orl
IMM
(
0x00100000
),
d0
|
and
put
hidden
bit
back
orl
IMM
(
0x00100000
),
d0
|
and
put
hidden
bit
back
swap
d4
|
I
like
exponents
in
the
first
byte
swap
d4
|
I
like
exponents
in
the
first
byte
#
ifndef
__mcf5200__
lsrw
IMM
(
4
),
d4
|
lsrw
IMM
(
4
),
d4
|
#
else
lsrl
IMM
(
4
),
d4
|
#
endif
Lmuldf
$
1
:
Lmuldf
$
1
:
andl
d7
,
d5
|
andl
d7
,
d5
|
beq
Lmuldf
$
b
$
den
|
beq
Lmuldf
$
b
$
den
|
andl
d6
,
d2
|
andl
d6
,
d2
|
orl
IMM
(
0x00100000
),
d2
|
and
put
hidden
bit
back
orl
IMM
(
0x00100000
),
d2
|
and
put
hidden
bit
back
swap
d5
|
swap
d5
|
#
ifndef
__mcf5200__
lsrw
IMM
(
4
),
d5
|
lsrw
IMM
(
4
),
d5
|
#
else
lsrl
IMM
(
4
),
d5
|
#
endif
Lmuldf
$
2
:
|
Lmuldf
$
2
:
|
#
ifndef
__mcf5200__
addw
d5
,
d4
|
add
exponents
addw
d5
,
d4
|
add
exponents
subw
IMM
(
D_BIAS
+
1
),
d4
|
and
subtract
bias
(
plus
one
)
subw
IMM
(
D_BIAS
+
1
),
d4
|
and
subtract
bias
(
plus
one
)
#
else
addl
d5
,
d4
|
add
exponents
subl
IMM
(
D_BIAS
+
1
),
d4
|
and
subtract
bias
(
plus
one
)
#
endif
|
We
are
now
ready
to
do
the
multiplication
.
The
situation
is
as
follows
:
|
We
are
now
ready
to
do
the
multiplication
.
The
situation
is
as
follows
:
|
both
a
and
b
have
bit
52
(
bit
20
of
d0
and
d2
)
set
(
even
if
they
were
|
both
a
and
b
have
bit
52
(
bit
20
of
d0
and
d2
)
set
(
even
if
they
were
...
@@ -1009,11 +1343,16 @@ Lmuldf$2: |
...
@@ -1009,11 +1343,16 @@ Lmuldf$2: |
|
enough
to
keep
everything
in
them
.
So
we
use
the
address
registers
to
keep
|
enough
to
keep
everything
in
them
.
So
we
use
the
address
registers
to
keep
|
some
intermediate
data
.
|
some
intermediate
data
.
#
ifndef
__mcf5200__
moveml
a2
-
a3
,
sp
@
-
|
save
a2
and
a3
for
temporary
use
moveml
a2
-
a3
,
sp
@
-
|
save
a2
and
a3
for
temporary
use
#
else
moveml
a2
-
a4
,
sp
@
-
#
endif
movel
IMM
(
0
),
a2
|
a2
is
a
null
register
movel
IMM
(
0
),
a2
|
a2
is
a
null
register
movel
d4
,
a3
|
and
a3
will
preserve
the
exponent
movel
d4
,
a3
|
and
a3
will
preserve
the
exponent
|
First
,
shift
d2
-
d3
so
bit
20
becomes
bit
31
:
|
First
,
shift
d2
-
d3
so
bit
20
becomes
bit
31
:
#
ifndef
__mcf5200__
rorl
IMM
(
5
),
d2
|
rotate
d2
5
places
right
rorl
IMM
(
5
),
d2
|
rotate
d2
5
places
right
swap
d2
|
and
swap
it
swap
d2
|
and
swap
it
rorl
IMM
(
5
),
d3
|
do
the
same
thing
with
d3
rorl
IMM
(
5
),
d3
|
do
the
same
thing
with
d3
...
@@ -1022,6 +1361,16 @@ Lmuldf$2: |
...
@@ -1022,6 +1361,16 @@ Lmuldf$2: |
andw
IMM
(
0x07ff
),
d6
|
andw
IMM
(
0x07ff
),
d6
|
orw
d6
,
d2
|
and
put
them
into
d2
orw
d6
,
d2
|
and
put
them
into
d2
andw
IMM
(
0xf800
),
d3
|
clear
those
bits
in
d3
andw
IMM
(
0xf800
),
d3
|
clear
those
bits
in
d3
#
else
moveq
IMM
(
11
),
d7
|
left
shift
d2
11
bits
lsll
d7
,
d2
movel
d3
,
d6
|
get
a
copy
of
d3
lsll
d7
,
d3
|
left
shift
d3
11
bits
andl
IMM
(
0xffe00000
),
d6
|
get
the
top
11
bits
of
d3
moveq
IMM
(
21
),
d7
|
right
shift
them
21
bits
lsrl
d7
,
d6
orl
d6
,
d2
|
stick
them
at
the
end
of
d2
#
endif
movel
d2
,
d6
|
move
b
into
d6
-
d7
movel
d2
,
d6
|
move
b
into
d6
-
d7
movel
d3
,
d7
|
move
a
into
d4
-
d5
movel
d3
,
d7
|
move
a
into
d4
-
d5
...
@@ -1034,9 +1383,22 @@ Lmuldf$2: |
...
@@ -1034,9 +1383,22 @@ Lmuldf$2: |
|
We
use
a1
as
counter
:
|
We
use
a1
as
counter
:
movel
IMM
(
DBL_MANT_DIG
-
1
),
a1
movel
IMM
(
DBL_MANT_DIG
-
1
),
a1
#
ifndef
__mcf5200__
exg
d7
,
a1
exg
d7
,
a1
#
else
movel
d7
,
a4
movel
a1
,
d7
movel
a4
,
a1
#
endif
1
:
exg
d7
,
a1
|
put
counter
back
in
a1
1
:
#
ifndef
__mcf5200__
exg
d7
,
a1
|
put
counter
back
in
a1
#
else
movel
d7
,
a4
movel
a1
,
d7
movel
a4
,
a1
#
endif
addl
d3
,
d3
|
shift
sum
once
left
addl
d3
,
d3
|
shift
sum
once
left
addxl
d2
,
d2
|
addxl
d2
,
d2
|
addxl
d1
,
d1
|
addxl
d1
,
d1
|
...
@@ -1044,17 +1406,42 @@ Lmuldf$2: |
...
@@ -1044,17 +1406,42 @@ Lmuldf$2: |
addl
d7
,
d7
|
addl
d7
,
d7
|
addxl
d6
,
d6
|
addxl
d6
,
d6
|
bcc
2
f
|
if
bit
clear
skip
the
following
bcc
2
f
|
if
bit
clear
skip
the
following
#
ifndef
__mcf5200__
exg
d7
,
a2
|
exg
d7
,
a2
|
#
else
movel
d7
,
a4
movel
a2
,
d7
movel
a4
,
a2
#
endif
addl
d5
,
d3
|
else
add
a
to
the
sum
addl
d5
,
d3
|
else
add
a
to
the
sum
addxl
d4
,
d2
|
addxl
d4
,
d2
|
addxl
d7
,
d1
|
addxl
d7
,
d1
|
addxl
d7
,
d0
|
addxl
d7
,
d0
|
#
ifndef
__mcf5200__
exg
d7
,
a2
|
exg
d7
,
a2
|
2
:
exg
d7
,
a1
|
put
counter
in
d7
#
else
movel
d7
,
a4
movel
a2
,
d7
movel
a4
,
a2
#
endif
2
:
#
ifndef
__mcf5200__
exg
d7
,
a1
|
put
counter
in
d7
dbf
d7
,
1
b
|
decrement
and
branch
dbf
d7
,
1
b
|
decrement
and
branch
#
else
movel
d7
,
a4
movel
a1
,
d7
movel
a4
,
a1
subql
IMM
(
1
),
d7
bpl
1
b
#
endif
movel
a3
,
d4
|
restore
exponent
movel
a3
,
d4
|
restore
exponent
#
ifndef
__mcf5200__
moveml
sp
@
+
,
a2
-
a3
moveml
sp
@
+
,
a2
-
a3
#
else
moveml
sp
@
+
,
a2
-
a4
#
endif
|
Now
we
have
the
product
in
d0
-
d1
-
d2
-
d3
,
with
bit
8
of
d0
set
.
The
|
Now
we
have
the
product
in
d0
-
d1
-
d2
-
d3
,
with
bit
8
of
d0
set
.
The
|
first
thing
to
do
now
is
to
normalize
it
so
bit
8
becomes
bit
|
first
thing
to
do
now
is
to
normalize
it
so
bit
8
becomes
bit
...
@@ -1067,6 +1454,7 @@ Lmuldf$2: |
...
@@ -1067,6 +1454,7 @@ Lmuldf$2: |
swap
d3
swap
d3
movew
d3
,
d2
movew
d3
,
d2
movew
IMM
(
0
),
d3
movew
IMM
(
0
),
d3
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d2
...
@@ -1079,6 +1467,22 @@ Lmuldf$2: |
...
@@ -1079,6 +1467,22 @@ Lmuldf$2: |
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d3
roxrl
IMM
(
1
),
d3
#
else
moveq
IMM
(
29
),
d6
lsrl
IMM
(
3
),
d3
movel
d2
,
d7
lsll
d6
,
d7
orl
d7
,
d3
lsrl
IMM
(
3
),
d2
movel
d1
,
d7
lsll
d6
,
d7
orl
d7
,
d2
lsrl
IMM
(
3
),
d1
movel
d0
,
d7
lsll
d6
,
d7
orl
d7
,
d1
lsrl
IMM
(
3
),
d0
#
endif
|
Now
round
,
check
for
over
-
and
underflow
,
and
exit
.
|
Now
round
,
check
for
over
-
and
underflow
,
and
exit
.
movel
a0
,
d7
|
get
sign
bit
back
into
d7
movel
a0
,
d7
|
get
sign
bit
back
into
d7
...
@@ -1086,9 +1490,18 @@ Lmuldf$2: |
...
@@ -1086,9 +1490,18 @@ Lmuldf$2: |
btst
IMM
(
DBL_MANT_DIG
+
1
-
32
),
d0
btst
IMM
(
DBL_MANT_DIG
+
1
-
32
),
d0
beq
Lround
$
exit
beq
Lround
$
exit
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
addw
IMM
(
1
),
d4
addw
IMM
(
1
),
d4
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
addl
IMM
(
1
),
d4
#
endif
bra
Lround
$
exit
bra
Lround
$
exit
Lmuldf
$
inop
:
Lmuldf
$
inop
:
...
@@ -1113,8 +1526,17 @@ Lmuldf$a$nf:
...
@@ -1113,8 +1526,17 @@ Lmuldf$a$nf:
|
NaN
,
in
which
case
we
return
NaN
.
|
NaN
,
in
which
case
we
return
NaN
.
Lmuldf
$
b
$
0
:
Lmuldf
$
b
$
0
:
movew
IMM
(
MULTIPLY
),
d5
movew
IMM
(
MULTIPLY
),
d5
#
ifndef
__mcf5200__
exg
d2
,
d0
|
put
b
(
==
0
)
into
d0
-
d1
exg
d2
,
d0
|
put
b
(
==
0
)
into
d0
-
d1
exg
d3
,
d1
|
and
a
(
with
sign
bit
cleared
)
into
d2
-
d3
exg
d3
,
d1
|
and
a
(
with
sign
bit
cleared
)
into
d2
-
d3
#
else
movel
d2
,
d7
movel
d0
,
d2
movel
d7
,
d0
movel
d3
,
d7
movel
d1
,
d3
movel
d7
,
d1
#
endif
bra
1
f
bra
1
f
Lmuldf
$
a
$
0
:
Lmuldf
$
a
$
0
:
movel
a6
@
(
16
),
d2
|
put
b
into
d2
-
d3
again
movel
a6
@
(
16
),
d2
|
put
b
into
d2
-
d3
again
...
@@ -1137,7 +1559,11 @@ Lmuldf$a$den:
...
@@ -1137,7 +1559,11 @@ Lmuldf$a$den:
andl
d6
,
d0
andl
d6
,
d0
1
:
addl
d1
,
d1
|
shift
a
left
until
bit
20
is
set
1
:
addl
d1
,
d1
|
shift
a
left
until
bit
20
is
set
addxl
d0
,
d0
|
addxl
d0
,
d0
|
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d4
|
and
adjust
exponent
subw
IMM
(
1
),
d4
|
and
adjust
exponent
#
else
subl
IMM
(
1
),
d4
|
and
adjust
exponent
#
endif
btst
IMM
(
20
),
d0
|
btst
IMM
(
20
),
d0
|
bne
Lmuldf
$
1
|
bne
Lmuldf
$
1
|
bra
1
b
bra
1
b
...
@@ -1147,7 +1573,11 @@ Lmuldf$b$den:
...
@@ -1147,7 +1573,11 @@ Lmuldf$b$den:
andl
d6
,
d2
andl
d6
,
d2
1
:
addl
d3
,
d3
|
shift
b
left
until
bit
20
is
set
1
:
addl
d3
,
d3
|
shift
b
left
until
bit
20
is
set
addxl
d2
,
d2
|
addxl
d2
,
d2
|
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d5
|
and
adjust
exponent
subw
IMM
(
1
),
d5
|
and
adjust
exponent
#
else
subql
IMM
(
1
),
d5
|
and
adjust
exponent
#
endif
btst
IMM
(
20
),
d2
|
btst
IMM
(
20
),
d2
|
bne
Lmuldf
$
2
|
bne
Lmuldf
$
2
|
bra
1
b
bra
1
b
...
@@ -1199,17 +1629,30 @@ SYM (__divdf3):
...
@@ -1199,17 +1629,30 @@ SYM (__divdf3):
andl
d6
,
d0
|
and
isolate
fraction
andl
d6
,
d0
|
and
isolate
fraction
orl
IMM
(
0x00100000
),
d0
|
and
put
hidden
bit
back
orl
IMM
(
0x00100000
),
d0
|
and
put
hidden
bit
back
swap
d4
|
I
like
exponents
in
the
first
byte
swap
d4
|
I
like
exponents
in
the
first
byte
#
ifndef
__mcf5200__
lsrw
IMM
(
4
),
d4
|
lsrw
IMM
(
4
),
d4
|
#
else
lsrl
IMM
(
4
),
d4
|
#
endif
Ldivdf
$
1
:
|
Ldivdf
$
1
:
|
andl
d7
,
d5
|
andl
d7
,
d5
|
beq
Ldivdf
$
b
$
den
|
beq
Ldivdf
$
b
$
den
|
andl
d6
,
d2
|
andl
d6
,
d2
|
orl
IMM
(
0x00100000
),
d2
orl
IMM
(
0x00100000
),
d2
swap
d5
|
swap
d5
|
#
ifndef
__mcf5200__
lsrw
IMM
(
4
),
d5
|
lsrw
IMM
(
4
),
d5
|
#
else
lsrl
IMM
(
4
),
d5
|
#
endif
Ldivdf
$
2
:
|
Ldivdf
$
2
:
|
#
ifndef
__mcf5200__
subw
d5
,
d4
|
subtract
exponents
subw
d5
,
d4
|
subtract
exponents
addw
IMM
(
D_BIAS
),
d4
|
and
add
bias
addw
IMM
(
D_BIAS
),
d4
|
and
add
bias
#
else
subl
d5
,
d4
|
subtract
exponents
addl
IMM
(
D_BIAS
),
d4
|
and
add
bias
#
endif
|
We
are
now
ready
to
do
the
division
.
We
have
prepared
things
in
such
a
way
|
We
are
now
ready
to
do
the
division
.
We
have
prepared
things
in
such
a
way
|
that
the
ratio
of
the
fractions
will
be
less
than
2
but
greater
than
1
/
2
.
|
that
the
ratio
of
the
fractions
will
be
less
than
2
but
greater
than
1
/
2
.
...
@@ -1240,7 +1683,12 @@ Ldivdf$2: |
...
@@ -1240,7 +1683,12 @@ Ldivdf$2: |
bset
d5
,
d6
|
set
the
corresponding
bit
in
d6
bset
d5
,
d6
|
set
the
corresponding
bit
in
d6
3
:
addl
d1
,
d1
|
shift
a
by
1
3
:
addl
d1
,
d1
|
shift
a
by
1
addxl
d0
,
d0
|
addxl
d0
,
d0
|
#
ifndef
__mcf5200__
dbra
d5
,
1
b
|
and
branch
back
dbra
d5
,
1
b
|
and
branch
back
#
else
subql
IMM
(
1
),
d5
bpl
1
b
#
endif
bra
5
f
bra
5
f
4
:
cmpl
d1
,
d3
|
here
d0
==
d2
,
so
check
d1
and
d3
4
:
cmpl
d1
,
d3
|
here
d0
==
d2
,
so
check
d1
and
d3
bhi
3
b
|
if
d1
>
d2
skip
the
subtraction
bhi
3
b
|
if
d1
>
d2
skip
the
subtraction
...
@@ -1257,7 +1705,12 @@ Ldivdf$2: |
...
@@ -1257,7 +1705,12 @@ Ldivdf$2: |
bset
d5
,
d7
|
set
the
corresponding
bit
in
d7
bset
d5
,
d7
|
set
the
corresponding
bit
in
d7
3
:
addl
d1
,
d1
|
shift
a
by
1
3
:
addl
d1
,
d1
|
shift
a
by
1
addxl
d0
,
d0
|
addxl
d0
,
d0
|
#
ifndef
__mcf5200__
dbra
d5
,
1
b
|
and
branch
back
dbra
d5
,
1
b
|
and
branch
back
#
else
subql
IMM
(
1
),
d5
bpl
1
b
#
endif
bra
5
f
bra
5
f
4
:
cmpl
d1
,
d3
|
here
d0
==
d2
,
so
check
d1
and
d3
4
:
cmpl
d1
,
d3
|
here
d0
==
d2
,
so
check
d1
and
d3
bhi
3
b
|
if
d1
>
d2
skip
the
subtraction
bhi
3
b
|
if
d1
>
d2
skip
the
subtraction
...
@@ -1270,7 +1723,12 @@ Ldivdf$2: |
...
@@ -1270,7 +1723,12 @@ Ldivdf$2: |
beq
3
f
|
if
d0
==
d2
check
d1
and
d3
beq
3
f
|
if
d0
==
d2
check
d1
and
d3
2
:
addl
d1
,
d1
|
shift
a
by
1
2
:
addl
d1
,
d1
|
shift
a
by
1
addxl
d0
,
d0
|
addxl
d0
,
d0
|
#
ifndef
__mcf5200__
dbra
d5
,
1
b
|
and
branch
back
dbra
d5
,
1
b
|
and
branch
back
#
else
subql
IMM
(
1
),
d5
bpl
1
b
#
endif
movel
IMM
(
0
),
d2
|
here
no
sticky
bit
was
found
movel
IMM
(
0
),
d2
|
here
no
sticky
bit
was
found
movel
d2
,
d3
movel
d2
,
d3
bra
5
f
bra
5
f
...
@@ -1281,13 +1739,23 @@ Ldivdf$2: |
...
@@ -1281,13 +1739,23 @@ Ldivdf$2: |
|
to
it
; if you don't do this the algorithm loses in some cases). '
|
to
it
; if you don't do this the algorithm loses in some cases). '
movel
IMM
(
0
),
d2
movel
IMM
(
0
),
d2
movel
d2
,
d3
movel
d2
,
d3
#
ifndef
__mcf5200__
subw
IMM
(
DBL_MANT_DIG
),
d5
subw
IMM
(
DBL_MANT_DIG
),
d5
addw
IMM
(
63
),
d5
addw
IMM
(
63
),
d5
cmpw
IMM
(
31
),
d5
cmpw
IMM
(
31
),
d5
#
else
subl
IMM
(
DBL_MANT_DIG
),
d5
addl
IMM
(
63
),
d5
cmpl
IMM
(
31
),
d5
#
endif
bhi
2
f
bhi
2
f
1
:
bset
d5
,
d3
1
:
bset
d5
,
d3
bra
5
f
bra
5
f
#
ifndef
__mcf5200__
subw
IMM
(
32
),
d5
subw
IMM
(
32
),
d5
#
else
subl
IMM
(
32
),
d5
#
endif
2
:
bset
d5
,
d2
2
:
bset
d5
,
d2
5
:
5
:
|
Finally
we
are
finished
!
Move
the
longs
in
the
address
registers
to
|
Finally
we
are
finished
!
Move
the
longs
in
the
address
registers
to
...
@@ -1302,11 +1770,28 @@ Ldivdf$2: |
...
@@ -1302,11 +1770,28 @@ Ldivdf$2: |
|
not
set
:
|
not
set
:
btst
IMM
(
DBL_MANT_DIG
-
32
+
1
),
d0
btst
IMM
(
DBL_MANT_DIG
-
32
+
1
),
d0
beq
1
f
beq
1
f
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d2
roxrl
IMM
(
1
),
d3
roxrl
IMM
(
1
),
d3
addw
IMM
(
1
),
d4
addw
IMM
(
1
),
d4
#
else
lsrl
IMM
(
1
),
d3
btst
IMM
(
0
),
d2
beq
10
f
bset
IMM
(
31
),
d3
10
:
lsrl
IMM
(
1
),
d2
btst
IMM
(
0
),
d1
beq
11
f
bset
IMM
(
31
),
d2
11
:
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
12
f
bset
IMM
(
31
),
d1
12
:
lsrl
IMM
(
1
),
d0
addl
IMM
(
1
),
d4
#
endif
1
:
1
:
|
Now
round
,
check
for
over
-
and
underflow
,
and
exit
.
|
Now
round
,
check
for
over
-
and
underflow
,
and
exit
.
movel
a0
,
d7
|
restore
sign
bit
to
d7
movel
a0
,
d7
|
restore
sign
bit
to
d7
...
@@ -1377,7 +1862,11 @@ Ldivdf$a$den:
...
@@ -1377,7 +1862,11 @@ Ldivdf$a$den:
andl
d6
,
d0
andl
d6
,
d0
1
:
addl
d1
,
d1
|
shift
a
left
until
bit
20
is
set
1
:
addl
d1
,
d1
|
shift
a
left
until
bit
20
is
set
addxl
d0
,
d0
addxl
d0
,
d0
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d4
|
and
adjust
exponent
subw
IMM
(
1
),
d4
|
and
adjust
exponent
#
else
subl
IMM
(
1
),
d4
|
and
adjust
exponent
#
endif
btst
IMM
(
DBL_MANT_DIG
-
32
-
1
),
d0
btst
IMM
(
DBL_MANT_DIG
-
32
-
1
),
d0
bne
Ldivdf
$
1
bne
Ldivdf
$
1
bra
1
b
bra
1
b
...
@@ -1387,7 +1876,11 @@ Ldivdf$b$den:
...
@@ -1387,7 +1876,11 @@ Ldivdf$b$den:
andl
d6
,
d2
andl
d6
,
d2
1
:
addl
d3
,
d3
|
shift
b
left
until
bit
20
is
set
1
:
addl
d3
,
d3
|
shift
b
left
until
bit
20
is
set
addxl
d2
,
d2
addxl
d2
,
d2
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d5
|
and
adjust
exponent
subw
IMM
(
1
),
d5
|
and
adjust
exponent
#
else
subql
IMM
(
1
),
d5
|
and
adjust
exponent
#
endif
btst
IMM
(
DBL_MANT_DIG
-
32
-
1
),
d2
btst
IMM
(
DBL_MANT_DIG
-
32
-
1
),
d2
bne
Ldivdf
$
2
bne
Ldivdf
$
2
bra
1
b
bra
1
b
...
@@ -1398,7 +1891,11 @@ Lround$exit:
...
@@ -1398,7 +1891,11 @@ Lround$exit:
|
so
that
2
^
21
<=
d0
<
2
^
22
,
and
the
exponent
is
in
the
lower
byte
of
d4
.
|
so
that
2
^
21
<=
d0
<
2
^
22
,
and
the
exponent
is
in
the
lower
byte
of
d4
.
|
First
check
for
underlow
in
the
exponent
:
|
First
check
for
underlow
in
the
exponent
:
#
ifndef
__mcf5200__
cmpw
IMM
(
-
DBL_MANT_DIG
-
1
),
d4
cmpw
IMM
(
-
DBL_MANT_DIG
-
1
),
d4
#
else
cmpl
IMM
(
-
DBL_MANT_DIG
-
1
),
d4
#
endif
blt
Ld
$
underflow
blt
Ld
$
underflow
|
It
could
happen
that
the
exponent
is
less
than
1
,
in
which
case
the
|
It
could
happen
that
the
exponent
is
less
than
1
,
in
which
case
the
|
number
is
denormalized
.
In
this
case
we
shift
right
and
adjust
the
|
number
is
denormalized
.
In
this
case
we
shift
right
and
adjust
the
...
@@ -1407,9 +1904,15 @@ Lround$exit:
...
@@ -1407,9 +1904,15 @@ Lround$exit:
movel
d7
,
a0
|
movel
d7
,
a0
|
movel
IMM
(
0
),
d6
|
use
d6
-
d7
to
collect
bits
flushed
right
movel
IMM
(
0
),
d6
|
use
d6
-
d7
to
collect
bits
flushed
right
movel
d6
,
d7
|
use
d6
-
d7
to
collect
bits
flushed
right
movel
d6
,
d7
|
use
d6
-
d7
to
collect
bits
flushed
right
#
ifndef
__mcf5200__
cmpw
IMM
(
1
),
d4
|
if
the
exponent
is
less
than
1
we
cmpw
IMM
(
1
),
d4
|
if
the
exponent
is
less
than
1
we
#
else
cmpl
IMM
(
1
),
d4
|
if
the
exponent
is
less
than
1
we
#
endif
bge
2
f
|
have
to
shift
right
(
denormalize
)
bge
2
f
|
have
to
shift
right
(
denormalize
)
1
:
addw
IMM
(
1
),
d4
|
adjust
the
exponent
1
:
#
ifndef
__mcf5200__
addw
IMM
(
1
),
d4
|
adjust
the
exponent
lsrl
IMM
(
1
),
d0
|
shift
right
once
lsrl
IMM
(
1
),
d0
|
shift
right
once
roxrl
IMM
(
1
),
d1
|
roxrl
IMM
(
1
),
d1
|
roxrl
IMM
(
1
),
d2
|
roxrl
IMM
(
1
),
d2
|
...
@@ -1417,6 +1920,31 @@ Lround$exit:
...
@@ -1417,6 +1920,31 @@ Lround$exit:
roxrl
IMM
(
1
),
d6
|
roxrl
IMM
(
1
),
d6
|
roxrl
IMM
(
1
),
d7
|
roxrl
IMM
(
1
),
d7
|
cmpw
IMM
(
1
),
d4
|
is
the
exponent
1
already
?
cmpw
IMM
(
1
),
d4
|
is
the
exponent
1
already
?
#
else
addl
IMM
(
1
),
d4
|
adjust
the
exponent
lsrl
IMM
(
1
),
d7
btst
IMM
(
0
),
d6
beq
13
f
bset
IMM
(
31
),
d7
13
:
lsrl
IMM
(
1
),
d6
btst
IMM
(
0
),
d3
beq
14
f
bset
IMM
(
31
),
d6
14
:
lsrl
IMM
(
1
),
d3
btst
IMM
(
0
),
d2
beq
10
f
bset
IMM
(
31
),
d3
10
:
lsrl
IMM
(
1
),
d2
btst
IMM
(
0
),
d1
beq
11
f
bset
IMM
(
31
),
d2
11
:
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
12
f
bset
IMM
(
31
),
d1
12
:
lsrl
IMM
(
1
),
d0
cmpl
IMM
(
1
),
d4
|
is
the
exponent
1
already
?
#
endif
beq
2
f
|
if
not
loop
back
beq
2
f
|
if
not
loop
back
bra
1
b
|
bra
1
b
|
bra
Ld
$
underflow
|
safety
check
,
shouldn
'
t
execute
'
bra
Ld
$
underflow
|
safety
check
,
shouldn
'
t
execute
'
...
@@ -1426,9 +1954,16 @@ Lround$exit:
...
@@ -1426,9 +1954,16 @@ Lround$exit:
|
Now
call
the
rounding
routine
(
which
takes
care
of
denormalized
numbers
)
:
|
Now
call
the
rounding
routine
(
which
takes
care
of
denormalized
numbers
)
:
lea
Lround
$
0
,
a0
|
to
return
from
rounding
routine
lea
Lround
$
0
,
a0
|
to
return
from
rounding
routine
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
#
ifdef
__mcf5200__
clrl
d6
#
endif
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
beq
Lround
$
to
$
nearest
beq
Lround
$
to
$
nearest
#
ifndef
__mcf5200__
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
#
else
cmpl
IMM
(
ROUND_TO_PLUS
),
d6
#
endif
bhi
Lround
$
to
$
minus
bhi
Lround
$
to
$
minus
blt
Lround
$
to
$
zero
blt
Lround
$
to
$
zero
bra
Lround
$
to
$
plus
bra
Lround
$
to
$
plus
...
@@ -1440,17 +1975,29 @@ Lround$0:
...
@@ -1440,17 +1975,29 @@ Lround$0:
|
check
again
for
underflow
!
).
We
have
to
check
for
overflow
or
for
a
|
check
again
for
underflow
!
).
We
have
to
check
for
overflow
or
for
a
|
denormalized
number
(
which
also
signals
underflow
).
|
denormalized
number
(
which
also
signals
underflow
).
|
Check
for
overflow
(
i
.
e
.,
exponent
>=
0x7ff
).
|
Check
for
overflow
(
i
.
e
.,
exponent
>=
0x7ff
).
#
ifndef
__mcf5200__
cmpw
IMM
(
0x07ff
),
d4
cmpw
IMM
(
0x07ff
),
d4
#
else
cmpl
IMM
(
0x07ff
),
d4
#
endif
bge
Ld
$
overflow
bge
Ld
$
overflow
|
Now
check
for
a
denormalized
number
(
exponent
==
0
)
:
|
Now
check
for
a
denormalized
number
(
exponent
==
0
)
:
movew
d4
,
d4
movew
d4
,
d4
beq
Ld
$
den
beq
Ld
$
den
1
:
1
:
|
Put
back
the
exponents
and
sign
and
return
.
|
Put
back
the
exponents
and
sign
and
return
.
#
ifndef
__mcf5200__
lslw
IMM
(
4
),
d4
|
exponent
back
to
fourth
byte
lslw
IMM
(
4
),
d4
|
exponent
back
to
fourth
byte
#
else
lsll
IMM
(
4
),
d4
|
exponent
back
to
fourth
byte
#
endif
bclr
IMM
(
DBL_MANT_DIG
-
32
-
1
),
d0
bclr
IMM
(
DBL_MANT_DIG
-
32
-
1
),
d0
swap
d0
|
and
put
back
exponent
swap
d0
|
and
put
back
exponent
#
ifndef
__mcf5200__
orw
d4
,
d0
|
orw
d4
,
d0
|
#
else
orl
d4
,
d0
|
#
endif
swap
d0
|
swap
d0
|
orl
d7
,
d0
|
and
sign
also
orl
d7
,
d0
|
and
sign
also
...
@@ -1542,8 +2089,17 @@ Lcmpdf$1:
...
@@ -1542,8 +2089,17 @@ Lcmpdf$1:
tstl
d6
tstl
d6
bpl
1
f
bpl
1
f
|
If
both
are
negative
exchange
them
|
If
both
are
negative
exchange
them
#
ifndef
__mcf5200__
exg
d0
,
d2
exg
d0
,
d2
exg
d1
,
d3
exg
d1
,
d3
#
else
movel
d0
,
d7
movel
d2
,
d0
movel
d7
,
d2
movel
d1
,
d7
movel
d3
,
d1
movel
d7
,
d3
#
endif
1
:
1
:
|
Now
that
they
are
positive
we
just
compare
them
as
longs
(
does
this
also
|
Now
that
they
are
positive
we
just
compare
them
as
longs
(
does
this
also
|
work
for
denormalized
numbers
?
).
|
work
for
denormalized
numbers
?
).
...
@@ -1608,13 +2164,22 @@ Lround$to$nearest:
...
@@ -1608,13 +2164,22 @@ Lround$to$nearest:
|
Normalize
shifting
left
until
bit
#
DBL_MANT_DIG
-
32
is
set
or
the
exponent
|
Normalize
shifting
left
until
bit
#
DBL_MANT_DIG
-
32
is
set
or
the
exponent
|
is
one
(
remember
that
a
denormalized
number
corresponds
to
an
|
is
one
(
remember
that
a
denormalized
number
corresponds
to
an
|
exponent
of
-
D_BIAS
+
1
).
|
exponent
of
-
D_BIAS
+
1
).
#
ifndef
__mcf5200__
cmpw
IMM
(
1
),
d4
|
remember
that
the
exponent
is
at
least
one
cmpw
IMM
(
1
),
d4
|
remember
that
the
exponent
is
at
least
one
#
else
cmpl
IMM
(
1
),
d4
|
remember
that
the
exponent
is
at
least
one
#
endif
beq
2
f
|
an
exponent
of
one
means
denormalized
beq
2
f
|
an
exponent
of
one
means
denormalized
addl
d3
,
d3
|
else
shift
and
adjust
the
exponent
addl
d3
,
d3
|
else
shift
and
adjust
the
exponent
addxl
d2
,
d2
|
addxl
d2
,
d2
|
addxl
d1
,
d1
|
addxl
d1
,
d1
|
addxl
d0
,
d0
|
addxl
d0
,
d0
|
#
ifndef
__mcf5200__
dbra
d4
,
1
b
|
dbra
d4
,
1
b
|
#
else
subql
IMM
(
1
),
d4
bpl
1
b
#
endif
2
:
2
:
|
Now
round
:
we
do
it
as
follows
:
after
the
shifting
we
can
write
the
|
Now
round
:
we
do
it
as
follows
:
after
the
shifting
we
can
write
the
|
fraction
part
as
f
+
delta
,
where
1
<
f
<
2
^
25
,
and
0
<=
delta
<=
2
.
|
fraction
part
as
f
+
delta
,
where
1
<
f
<
2
^
25
,
and
0
<=
delta
<=
2
.
...
@@ -1636,16 +2201,34 @@ Lround$to$nearest:
...
@@ -1636,16 +2201,34 @@ Lround$to$nearest:
addl
d3
,
d1
|
addl
d3
,
d1
|
addxl
d2
,
d0
addxl
d2
,
d0
|
Shift
right
once
(
because
we
used
bit
#
DBL_MANT_DIG
-
32
!
).
|
Shift
right
once
(
because
we
used
bit
#
DBL_MANT_DIG
-
32
!
).
2
:
lsrl
IMM
(
1
),
d0
2
:
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
#
endif
|
Now
check
again
bit
#
DBL_MANT_DIG
-
32
(
rounding
could
have
produced
a
|
Now
check
again
bit
#
DBL_MANT_DIG
-
32
(
rounding
could
have
produced
a
|
'
fraction
overflow
'
...).
|
'
fraction
overflow
'
...).
btst
IMM
(
DBL_MANT_DIG
-
32
),
d0
btst
IMM
(
DBL_MANT_DIG
-
32
),
d0
beq
1
f
beq
1
f
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
addw
IMM
(
1
),
d4
addw
IMM
(
1
),
d4
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
addl
IMM
(
1
),
d4
#
endif
1
:
1
:
|
If
bit
#
DBL_MANT_DIG
-
32
-
1
is
clear
we
have
a
denormalized
number
,
so
we
|
If
bit
#
DBL_MANT_DIG
-
32
-
1
is
clear
we
have
a
denormalized
number
,
so
we
|
have
to
put
the
exponent
to
zero
and
return
a
denormalized
number
.
|
have
to
put
the
exponent
to
zero
and
return
a
denormalized
number
.
...
@@ -1717,7 +2300,7 @@ Lf$den:
...
@@ -1717,7 +2300,7 @@ Lf$den:
|
Return
and
signal
a
denormalized
number
|
Return
and
signal
a
denormalized
number
orl
d7
,
d0
orl
d7
,
d0
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
move
w
IMM
(
SINGLE_FLOAT
),
d6
move
q
IMM
(
SINGLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Lf
$
infty
:
Lf
$
infty
:
...
@@ -1726,21 +2309,21 @@ Lf$overflow:
...
@@ -1726,21 +2309,21 @@ Lf$overflow:
movel
IMM
(
INFINITY
),
d0
movel
IMM
(
INFINITY
),
d0
orl
d7
,
d0
orl
d7
,
d0
movew
IMM
(
INEXACT_RESULT
+
OVERFLOW
),
d7
movew
IMM
(
INEXACT_RESULT
+
OVERFLOW
),
d7
move
w
IMM
(
SINGLE_FLOAT
),
d6
move
q
IMM
(
SINGLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Lf
$
underflow
:
Lf
$
underflow
:
|
Return
0
and
set
the
exception
flags
|
Return
0
and
set
the
exception
flags
movel
IMM
(
0
),
d0
movel
IMM
(
0
),
d0
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
movew
IMM
(
INEXACT_RESULT
+
UNDERFLOW
),
d7
move
w
IMM
(
SINGLE_FLOAT
),
d6
move
q
IMM
(
SINGLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Lf
$
inop
:
Lf
$
inop
:
|
Return
a
quiet
NaN
and
set
the
exception
flags
|
Return
a
quiet
NaN
and
set
the
exception
flags
movel
IMM
(
QUIET_NaN
),
d0
movel
IMM
(
QUIET_NaN
),
d0
movew
IMM
(
INEXACT_RESULT
+
INVALID_OPERATION
),
d7
movew
IMM
(
INEXACT_RESULT
+
INVALID_OPERATION
),
d7
move
w
IMM
(
SINGLE_FLOAT
),
d6
move
q
IMM
(
SINGLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
Lf
$
div
$
0
:
Lf
$
div
$
0
:
...
@@ -1748,7 +2331,7 @@ Lf$div$0:
...
@@ -1748,7 +2331,7 @@ Lf$div$0:
movel
IMM
(
INFINITY
),
d0
movel
IMM
(
INFINITY
),
d0
orl
d7
,
d0
orl
d7
,
d0
movew
IMM
(
INEXACT_RESULT
+
DIVIDE_BY_ZERO
),
d7
movew
IMM
(
INEXACT_RESULT
+
DIVIDE_BY_ZERO
),
d7
move
w
IMM
(
SINGLE_FLOAT
),
d6
move
q
IMM
(
SINGLE_FLOAT
),
d6
jmp
$
_exception_handler
jmp
$
_exception_handler
|=============================================================================
|=============================================================================
...
@@ -1840,54 +2423,126 @@ Laddsf$2:
...
@@ -1840,54 +2423,126 @@ Laddsf$2:
|
same
,
and
put
the
largest
exponent
in
d6
.
Note
that
we
are
using
two
|
same
,
and
put
the
largest
exponent
in
d6
.
Note
that
we
are
using
two
|
registers
for
each
number
(
see
the
discussion
by
D
.
Knuth
in
"Seminumerical
|
registers
for
each
number
(
see
the
discussion
by
D
.
Knuth
in
"Seminumerical
| Algorithms"
).
| Algorithms"
).
#
ifndef
__mcf5200__
cmpw
d6
,
d7
|
compare
exponents
cmpw
d6
,
d7
|
compare
exponents
#
else
cmpl
d6
,
d7
|
compare
exponents
#
endif
beq
Laddsf
$
3
|
if
equal
don
'
t
shift
'
beq
Laddsf
$
3
|
if
equal
don
'
t
shift
'
bhi
5
f
|
branch
if
second
exponent
largest
bhi
5
f
|
branch
if
second
exponent
largest
1
:
1
:
subl
d6
,
d7
|
keep
the
largest
exponent
subl
d6
,
d7
|
keep
the
largest
exponent
negl
d7
negl
d7
#
ifndef
__mcf5200__
lsrw
IMM
(
8
),
d7
|
put
difference
in
lower
byte
lsrw
IMM
(
8
),
d7
|
put
difference
in
lower
byte
#
else
lsrl
IMM
(
8
),
d7
|
put
difference
in
lower
byte
#
endif
|
if
difference
is
too
large
we
don
'
t
shift
(
actually
,
we
can
just
exit
)
'
|
if
difference
is
too
large
we
don
'
t
shift
(
actually
,
we
can
just
exit
)
'
#
ifndef
__mcf5200__
cmpw
IMM
(
FLT_MANT_DIG
+
2
),
d7
cmpw
IMM
(
FLT_MANT_DIG
+
2
),
d7
#
else
cmpl
IMM
(
FLT_MANT_DIG
+
2
),
d7
#
endif
bge
Laddsf
$
b
$
small
bge
Laddsf
$
b
$
small
#
ifndef
__mcf5200__
cmpw
IMM
(
16
),
d7
|
if
difference
>=
16
swap
cmpw
IMM
(
16
),
d7
|
if
difference
>=
16
swap
#
else
cmpl
IMM
(
16
),
d7
|
if
difference
>=
16
swap
#
endif
bge
4
f
bge
4
f
2
:
2
:
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d7
subw
IMM
(
1
),
d7
3
:
lsrl
IMM
(
1
),
d2
|
shift
right
second
operand
#
else
subql
IMM
(
1
),
d7
#
endif
3
:
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d2
|
shift
right
second
operand
roxrl
IMM
(
1
),
d3
roxrl
IMM
(
1
),
d3
dbra
d7
,
3
b
dbra
d7
,
3
b
#
else
lsrl
IMM
(
1
),
d3
btst
IMM
(
0
),
d2
beq
10
f
bset
IMM
(
31
),
d3
10
:
lsrl
IMM
(
1
),
d2
subql
IMM
(
1
),
d7
bpl
3
b
#
endif
bra
Laddsf
$
3
bra
Laddsf
$
3
4
:
4
:
movew
d2
,
d3
movew
d2
,
d3
swap
d3
swap
d3
movew
d3
,
d2
movew
d3
,
d2
swap
d2
swap
d2
#
ifndef
__mcf5200__
subw
IMM
(
16
),
d7
subw
IMM
(
16
),
d7
#
else
subl
IMM
(
16
),
d7
#
endif
bne
2
b
|
if
still
more
bits
,
go
back
to
normal
case
bne
2
b
|
if
still
more
bits
,
go
back
to
normal
case
bra
Laddsf
$
3
bra
Laddsf
$
3
5
:
5
:
#
ifndef
__mcf5200__
exg
d6
,
d7
|
exchange
the
exponents
exg
d6
,
d7
|
exchange
the
exponents
#
else
eorl
d6
,
d7
eorl
d7
,
d6
eorl
d6
,
d7
#
endif
subl
d6
,
d7
|
keep
the
largest
exponent
subl
d6
,
d7
|
keep
the
largest
exponent
negl
d7
|
negl
d7
|
#
ifndef
__mcf5200__
lsrw
IMM
(
8
),
d7
|
put
difference
in
lower
byte
lsrw
IMM
(
8
),
d7
|
put
difference
in
lower
byte
#
else
lsrl
IMM
(
8
),
d7
|
put
difference
in
lower
byte
#
endif
|
if
difference
is
too
large
we
don
'
t
shift
(
and
exit
!
)
'
|
if
difference
is
too
large
we
don
'
t
shift
(
and
exit
!
)
'
#
ifndef
__mcf5200__
cmpw
IMM
(
FLT_MANT_DIG
+
2
),
d7
cmpw
IMM
(
FLT_MANT_DIG
+
2
),
d7
#
else
cmpl
IMM
(
FLT_MANT_DIG
+
2
),
d7
#
endif
bge
Laddsf
$
a
$
small
bge
Laddsf
$
a
$
small
#
ifndef
__mcf5200__
cmpw
IMM
(
16
),
d7
|
if
difference
>=
16
swap
cmpw
IMM
(
16
),
d7
|
if
difference
>=
16
swap
#
else
cmpl
IMM
(
16
),
d7
|
if
difference
>=
16
swap
#
endif
bge
8
f
bge
8
f
6
:
6
:
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d7
subw
IMM
(
1
),
d7
7
:
lsrl
IMM
(
1
),
d0
|
shift
right
first
operand
#
else
subl
IMM
(
1
),
d7
#
endif
7
:
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
|
shift
right
first
operand
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
dbra
d7
,
7
b
dbra
d7
,
7
b
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
subql
IMM
(
1
),
d7
bpl
7
b
#
endif
bra
Laddsf
$
3
bra
Laddsf
$
3
8
:
8
:
movew
d0
,
d1
movew
d0
,
d1
swap
d1
swap
d1
movew
d1
,
d0
movew
d1
,
d0
swap
d0
swap
d0
#
ifndef
__mcf5200__
subw
IMM
(
16
),
d7
subw
IMM
(
16
),
d7
#
else
subl
IMM
(
16
),
d7
#
endif
bne
6
b
|
if
still
more
bits
,
go
back
to
normal
case
bne
6
b
|
if
still
more
bits
,
go
back
to
normal
case
|
otherwise
we
fall
through
|
otherwise
we
fall
through
...
@@ -1896,15 +2551,30 @@ Laddsf$2:
...
@@ -1896,15 +2551,30 @@ Laddsf$2:
Laddsf
$
3
:
Laddsf
$
3
:
|
Here
we
have
to
decide
whether
to
add
or
subtract
the
numbers
|
Here
we
have
to
decide
whether
to
add
or
subtract
the
numbers
#
ifndef
__mcf5200__
exg
d6
,
a0
|
get
signs
back
exg
d6
,
a0
|
get
signs
back
exg
d7
,
a1
|
and
save
the
exponents
exg
d7
,
a1
|
and
save
the
exponents
#
else
movel
d6
,
d4
movel
a0
,
d6
movel
d4
,
d6
movel
d7
,
d4
movel
a1
,
d4
movel
d4
,
a1
#
endif
eorl
d6
,
d7
|
combine
sign
bits
eorl
d6
,
d7
|
combine
sign
bits
bmi
Lsubsf
$
0
|
if
negative
a
and
b
have
opposite
bmi
Lsubsf
$
0
|
if
negative
a
and
b
have
opposite
|
sign
so
we
actually
subtract
the
|
sign
so
we
actually
subtract
the
|
numbers
|
numbers
|
Here
we
have
both
positive
or
both
negative
|
Here
we
have
both
positive
or
both
negative
#
ifndef
__mcf5200__
exg
d6
,
a0
|
now
we
have
the
exponent
in
d6
exg
d6
,
a0
|
now
we
have
the
exponent
in
d6
#
else
movel
d6
,
d4
movel
a0
,
d6
movel
d4
,
a0
#
endif
movel
a0
,
d7
|
and
sign
in
d7
movel
a0
,
d7
|
and
sign
in
d7
andl
IMM
(
0x80000000
),
d7
andl
IMM
(
0x80000000
),
d7
|
Here
we
do
the
addition
.
|
Here
we
do
the
addition
.
...
@@ -1915,7 +2585,11 @@ Laddsf$3:
...
@@ -1915,7 +2585,11 @@ Laddsf$3:
|
Put
the
exponent
,
in
the
first
byte
,
in
d2
,
to
use
the
"standard"
rounding
|
Put
the
exponent
,
in
the
first
byte
,
in
d2
,
to
use
the
"standard"
rounding
|
routines
:
|
routines
:
movel
d6
,
d2
movel
d6
,
d2
#
ifndef
__mcf5200__
lsrw
IMM
(
8
),
d2
lsrw
IMM
(
8
),
d2
#
else
lsrl
IMM
(
8
),
d2
#
endif
|
Before
rounding
normalize
so
bit
#
FLT_MANT_DIG
is
set
(
we
will
consider
|
Before
rounding
normalize
so
bit
#
FLT_MANT_DIG
is
set
(
we
will
consider
|
the
case
of
denormalized
numbers
in
the
rounding
routine
itself
).
|
the
case
of
denormalized
numbers
in
the
rounding
routine
itself
).
...
@@ -1923,24 +2597,47 @@ Laddsf$3:
...
@@ -1923,24 +2597,47 @@ Laddsf$3:
|
one
more
bit
we
check
this
:
|
one
more
bit
we
check
this
:
btst
IMM
(
FLT_MANT_DIG
+
1
),
d0
btst
IMM
(
FLT_MANT_DIG
+
1
),
d0
beq
1
f
beq
1
f
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
#
endif
addl
IMM
(
1
),
d2
addl
IMM
(
1
),
d2
1
:
1
:
lea
Laddsf
$
4
,
a0
|
to
return
from
rounding
routine
lea
Laddsf
$
4
,
a0
|
to
return
from
rounding
routine
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
#
ifdef
__mcf5200__
clrl
d6
#
endif
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
beq
Lround
$
to
$
nearest
beq
Lround
$
to
$
nearest
#
ifndef
__mcf5200__
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
#
else
cmpl
IMM
(
ROUND_TO_PLUS
),
d6
#
endif
bhi
Lround
$
to
$
minus
bhi
Lround
$
to
$
minus
blt
Lround
$
to
$
zero
blt
Lround
$
to
$
zero
bra
Lround
$
to
$
plus
bra
Lround
$
to
$
plus
Laddsf
$
4
:
Laddsf
$
4
:
|
Put
back
the
exponent
,
but
check
for
overflow
.
|
Put
back
the
exponent
,
but
check
for
overflow
.
#
ifndef
__mcf5200__
cmpw
IMM
(
0xff
),
d2
cmpw
IMM
(
0xff
),
d2
#
else
cmpl
IMM
(
0xff
),
d2
#
endif
bhi
1
f
bhi
1
f
bclr
IMM
(
FLT_MANT_DIG
-
1
),
d0
bclr
IMM
(
FLT_MANT_DIG
-
1
),
d0
#
ifndef
__mcf5200__
lslw
IMM
(
7
),
d2
lslw
IMM
(
7
),
d2
#
else
lsll
IMM
(
7
),
d2
#
endif
swap
d2
swap
d2
orl
d2
,
d0
orl
d2
,
d0
bra
Laddsf
$
ret
bra
Laddsf
$
ret
...
@@ -1962,8 +2659,15 @@ Lsubsf$0:
...
@@ -1962,8 +2659,15 @@ Lsubsf$0:
negl
d1
negl
d1
negxl
d0
negxl
d0
1
:
1
:
#
ifndef
__mcf5200__
exg
d2
,
a0
|
now
we
have
the
exponent
in
d2
exg
d2
,
a0
|
now
we
have
the
exponent
in
d2
lsrw
IMM
(
8
),
d2
|
put
it
in
the
first
byte
lsrw
IMM
(
8
),
d2
|
put
it
in
the
first
byte
#
else
movel
d2
,
d4
movel
a0
,
d2
movel
d4
,
a0
lsrl
IMM
(
8
),
d2
|
put
it
in
the
first
byte
#
endif
|
Now
d0
-
d1
is
positive
and
the
sign
bit
is
in
d7
.
|
Now
d0
-
d1
is
positive
and
the
sign
bit
is
in
d7
.
...
@@ -1972,16 +2676,27 @@ Lsubsf$0:
...
@@ -1972,16 +2676,27 @@ Lsubsf$0:
|
the
rounding
routines
themselves
.
|
the
rounding
routines
themselves
.
lea
Lsubsf
$
1
,
a0
|
to
return
from
rounding
routine
lea
Lsubsf
$
1
,
a0
|
to
return
from
rounding
routine
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
#
ifdef
__mcf5200__
clrl
d6
#
endif
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
beq
Lround
$
to
$
nearest
beq
Lround
$
to
$
nearest
#
ifndef
__mcf5200__
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
#
else
cmpl
IMM
(
ROUND_TO_PLUS
),
d6
#
endif
bhi
Lround
$
to
$
minus
bhi
Lround
$
to
$
minus
blt
Lround
$
to
$
zero
blt
Lround
$
to
$
zero
bra
Lround
$
to
$
plus
bra
Lround
$
to
$
plus
Lsubsf
$
1
:
Lsubsf
$
1
:
|
Put
back
the
exponent
(
we
can
'
t
have
overflow
!
).
'
|
Put
back
the
exponent
(
we
can
'
t
have
overflow
!
).
'
bclr
IMM
(
FLT_MANT_DIG
-
1
),
d0
bclr
IMM
(
FLT_MANT_DIG
-
1
),
d0
#
ifndef
__mcf5200__
lslw
IMM
(
7
),
d2
lslw
IMM
(
7
),
d2
#
else
lsll
IMM
(
7
),
d2
#
endif
swap
d2
swap
d2
orl
d2
,
d0
orl
d2
,
d0
bra
Laddsf
$
ret
bra
Laddsf
$
ret
...
@@ -2144,17 +2859,30 @@ SYM (__mulsf3):
...
@@ -2144,17 +2859,30 @@ SYM (__mulsf3):
andl
d5
,
d0
|
and
isolate
fraction
andl
d5
,
d0
|
and
isolate
fraction
orl
d4
,
d0
|
and
put
hidden
bit
back
orl
d4
,
d0
|
and
put
hidden
bit
back
swap
d2
|
I
like
exponents
in
the
first
byte
swap
d2
|
I
like
exponents
in
the
first
byte
#
ifndef
__mcf5200__
lsrw
IMM
(
7
),
d2
|
lsrw
IMM
(
7
),
d2
|
#
else
lsrl
IMM
(
7
),
d2
|
#
endif
Lmulsf
$
1
:
|
number
Lmulsf
$
1
:
|
number
andl
d6
,
d3
|
andl
d6
,
d3
|
beq
Lmulsf
$
b
$
den
|
beq
Lmulsf
$
b
$
den
|
andl
d5
,
d1
|
andl
d5
,
d1
|
orl
d4
,
d1
|
orl
d4
,
d1
|
swap
d3
|
swap
d3
|
#
ifndef
__mcf5200__
lsrw
IMM
(
7
),
d3
|
lsrw
IMM
(
7
),
d3
|
#
else
lsrl
IMM
(
7
),
d3
|
#
endif
Lmulsf
$
2
:
|
Lmulsf
$
2
:
|
#
ifndef
__mcf5200__
addw
d3
,
d2
|
add
exponents
addw
d3
,
d2
|
add
exponents
subw
IMM
(
F_BIAS
+
1
),
d2
|
and
subtract
bias
(
plus
one
)
subw
IMM
(
F_BIAS
+
1
),
d2
|
and
subtract
bias
(
plus
one
)
#
else
addl
d3
,
d2
|
add
exponents
subl
IMM
(
F_BIAS
+
1
),
d2
|
and
subtract
bias
(
plus
one
)
#
endif
|
We
are
now
ready
to
do
the
multiplication
.
The
situation
is
as
follows
:
|
We
are
now
ready
to
do
the
multiplication
.
The
situation
is
as
follows
:
|
both
a
and
b
have
bit
FLT_MANT_DIG
-
1
set
(
even
if
they
were
|
both
a
and
b
have
bit
FLT_MANT_DIG
-
1
set
(
even
if
they
were
...
@@ -2180,28 +2908,58 @@ Lmulsf$2: |
...
@@ -2180,28 +2908,58 @@ Lmulsf$2: |
bcc
2
f
|
if
not
set
skip
sum
bcc
2
f
|
if
not
set
skip
sum
addl
d5
,
d1
|
add
a
addl
d5
,
d1
|
add
a
addxl
d4
,
d0
addxl
d4
,
d0
2
:
dbf
d3
,
1
b
|
loop
back
2
:
#
ifndef
__mcf5200__
dbf
d3
,
1
b
|
loop
back
#
else
subql
IMM
(
1
),
d3
bpl
1
b
#
endif
|
Now
we
have
the
product
in
d0
-
d1
,
with
bit
(
FLT_MANT_DIG
-
1
)
+
FLT_MANT_DIG
|
Now
we
have
the
product
in
d0
-
d1
,
with
bit
(
FLT_MANT_DIG
-
1
)
+
FLT_MANT_DIG
|
(
mod
32
)
of
d0
set
.
The
first
thing
to
do
now
is
to
normalize
it
so
bit
|
(
mod
32
)
of
d0
set
.
The
first
thing
to
do
now
is
to
normalize
it
so
bit
|
FLT_MANT_DIG
is
set
(
to
do
the
rounding
).
|
FLT_MANT_DIG
is
set
(
to
do
the
rounding
).
#
ifndef
__mcf5200__
rorl
IMM
(
6
),
d1
rorl
IMM
(
6
),
d1
swap
d1
swap
d1
movew
d1
,
d3
movew
d1
,
d3
andw
IMM
(
0x03ff
),
d3
andw
IMM
(
0x03ff
),
d3
andw
IMM
(
0xfd00
),
d1
andw
IMM
(
0xfd00
),
d1
#
else
movel
d1
,
d3
lsll
IMM
(
8
),
d1
addl
d1
,
d1
addl
d1
,
d1
moveq
IMM
(
22
),
d5
lsrl
d5
,
d3
orl
d3
,
d1
andl
IMM
(
0xfffffd00
),
d1
#
endif
lsll
IMM
(
8
),
d0
lsll
IMM
(
8
),
d0
addl
d0
,
d0
addl
d0
,
d0
addl
d0
,
d0
addl
d0
,
d0
#
ifndef
__mcf5200__
orw
d3
,
d0
orw
d3
,
d0
#
else
orl
d3
,
d0
#
endif
movew
IMM
(
MULTIPLY
),
d5
movew
IMM
(
MULTIPLY
),
d5
btst
IMM
(
FLT_MANT_DIG
+
1
),
d0
btst
IMM
(
FLT_MANT_DIG
+
1
),
d0
beq
Lround
$
exit
beq
Lround
$
exit
#
ifndef
__mcf5200__
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
roxrl
IMM
(
1
),
d1
roxrl
IMM
(
1
),
d1
addw
IMM
(
1
),
d2
addw
IMM
(
1
),
d2
#
else
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
addql
IMM
(
1
),
d2
#
endif
bra
Lround
$
exit
bra
Lround
$
exit
Lmulsf
$
inop
:
Lmulsf
$
inop
:
...
@@ -2246,7 +3004,11 @@ Lmulsf$a$den:
...
@@ -2246,7 +3004,11 @@ Lmulsf$a$den:
movel
IMM
(
1
),
d2
movel
IMM
(
1
),
d2
andl
d5
,
d0
andl
d5
,
d0
1
:
addl
d0
,
d0
|
shift
a
left
(
until
bit
23
is
set
)
1
:
addl
d0
,
d0
|
shift
a
left
(
until
bit
23
is
set
)
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d2
|
and
adjust
exponent
subw
IMM
(
1
),
d2
|
and
adjust
exponent
#
else
subql
IMM
(
1
),
d2
|
and
adjust
exponent
#
endif
btst
IMM
(
FLT_MANT_DIG
-
1
),
d0
btst
IMM
(
FLT_MANT_DIG
-
1
),
d0
bne
Lmulsf
$
1
|
bne
Lmulsf
$
1
|
bra
1
b
|
else
loop
back
bra
1
b
|
else
loop
back
...
@@ -2255,7 +3017,11 @@ Lmulsf$b$den:
...
@@ -2255,7 +3017,11 @@ Lmulsf$b$den:
movel
IMM
(
1
),
d3
movel
IMM
(
1
),
d3
andl
d5
,
d1
andl
d5
,
d1
1
:
addl
d1
,
d1
|
shift
b
left
until
bit
23
is
set
1
:
addl
d1
,
d1
|
shift
b
left
until
bit
23
is
set
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d3
|
and
adjust
exponent
subw
IMM
(
1
),
d3
|
and
adjust
exponent
#
else
subl
IMM
(
1
),
d3
|
and
adjust
exponent
#
endif
btst
IMM
(
FLT_MANT_DIG
-
1
),
d1
btst
IMM
(
FLT_MANT_DIG
-
1
),
d1
bne
Lmulsf
$
2
|
bne
Lmulsf
$
2
|
bra
1
b
|
else
loop
back
bra
1
b
|
else
loop
back
...
@@ -2298,17 +3064,30 @@ SYM (__divsf3):
...
@@ -2298,17 +3064,30 @@ SYM (__divsf3):
andl
d5
,
d0
|
and
isolate
fraction
andl
d5
,
d0
|
and
isolate
fraction
orl
d4
,
d0
|
and
put
hidden
bit
back
orl
d4
,
d0
|
and
put
hidden
bit
back
swap
d2
|
I
like
exponents
in
the
first
byte
swap
d2
|
I
like
exponents
in
the
first
byte
#
ifndef
__mcf5200__
lsrw
IMM
(
7
),
d2
|
lsrw
IMM
(
7
),
d2
|
#
else
lsrl
IMM
(
7
),
d2
|
#
endif
Ldivsf
$
1
:
|
Ldivsf
$
1
:
|
andl
d6
,
d3
|
andl
d6
,
d3
|
beq
Ldivsf
$
b
$
den
|
beq
Ldivsf
$
b
$
den
|
andl
d5
,
d1
|
andl
d5
,
d1
|
orl
d4
,
d1
|
orl
d4
,
d1
|
swap
d3
|
swap
d3
|
#
ifndef
__mcf5200__
lsrw
IMM
(
7
),
d3
|
lsrw
IMM
(
7
),
d3
|
#
else
lsrl
IMM
(
7
),
d3
|
#
endif
Ldivsf
$
2
:
|
Ldivsf
$
2
:
|
#
ifndef
__mcf5200__
subw
d3
,
d2
|
subtract
exponents
subw
d3
,
d2
|
subtract
exponents
addw
IMM
(
F_BIAS
),
d2
|
and
add
bias
addw
IMM
(
F_BIAS
),
d2
|
and
add
bias
#
else
subl
d3
,
d2
|
subtract
exponents
addl
IMM
(
F_BIAS
),
d2
|
and
add
bias
#
endif
|
We
are
now
ready
to
do
the
division
.
We
have
prepared
things
in
such
a
way
|
We
are
now
ready
to
do
the
division
.
We
have
prepared
things
in
such
a
way
|
that
the
ratio
of
the
fractions
will
be
less
than
2
but
greater
than
1
/
2
.
|
that
the
ratio
of
the
fractions
will
be
less
than
2
but
greater
than
1
/
2
.
...
@@ -2329,19 +3108,34 @@ Ldivsf$2: |
...
@@ -2329,19 +3108,34 @@ Ldivsf$2: |
subl
d1
,
d0
|
if
a
>=
b
a
<--
a
-
b
subl
d1
,
d0
|
if
a
>=
b
a
<--
a
-
b
beq
3
f
|
if
a
is
zero
,
exit
beq
3
f
|
if
a
is
zero
,
exit
2
:
addl
d0
,
d0
|
multiply
a
by
2
2
:
addl
d0
,
d0
|
multiply
a
by
2
#
ifndef
__mcf5200__
dbra
d3
,
1
b
dbra
d3
,
1
b
#
else
subql
IMM
(
1
),
d3
bpl
1
b
#
endif
|
Now
we
keep
going
to
set
the
sticky
bit
...
|
Now
we
keep
going
to
set
the
sticky
bit
...
movew
IMM
(
FLT_MANT_DIG
),
d3
movew
IMM
(
FLT_MANT_DIG
),
d3
1
:
cmpl
d0
,
d1
1
:
cmpl
d0
,
d1
ble
2
f
ble
2
f
addl
d0
,
d0
addl
d0
,
d0
#
ifndef
__mcf5200__
dbra
d3
,
1
b
dbra
d3
,
1
b
#
else
subql
IMM
(
1
),
d3
bpl
1
b
#
endif
movel
IMM
(
0
),
d1
movel
IMM
(
0
),
d1
bra
3
f
bra
3
f
2
:
movel
IMM
(
0
),
d1
2
:
movel
IMM
(
0
),
d1
#
ifndef
__mcf5200__
subw
IMM
(
FLT_MANT_DIG
),
d3
subw
IMM
(
FLT_MANT_DIG
),
d3
addw
IMM
(
31
),
d3
addw
IMM
(
31
),
d3
#
else
subl
IMM
(
FLT_MANT_DIG
),
d3
addl
IMM
(
31
),
d3
#
endif
bset
d3
,
d1
bset
d3
,
d1
3
:
3
:
movel
d6
,
d0
|
put
the
ratio
in
d0
-
d1
movel
d6
,
d0
|
put
the
ratio
in
d0
-
d1
...
@@ -2353,7 +3147,11 @@ Ldivsf$2: |
...
@@ -2353,7 +3147,11 @@ Ldivsf$2: |
btst
IMM
(
FLT_MANT_DIG
+
1
),
d0
btst
IMM
(
FLT_MANT_DIG
+
1
),
d0
beq
1
f
|
if
it
is
not
set
,
then
bit
24
is
set
beq
1
f
|
if
it
is
not
set
,
then
bit
24
is
set
lsrl
IMM
(
1
),
d0
|
lsrl
IMM
(
1
),
d0
|
#
ifndef
__mcf5200__
addw
IMM
(
1
),
d2
|
addw
IMM
(
1
),
d2
|
#
else
addl
IMM
(
1
),
d2
|
#
endif
1
:
1
:
|
Now
round
,
check
for
over
-
and
underflow
,
and
exit
.
|
Now
round
,
check
for
over
-
and
underflow
,
and
exit
.
movew
IMM
(
DIVIDE
),
d5
movew
IMM
(
DIVIDE
),
d5
...
@@ -2409,7 +3207,11 @@ Ldivsf$a$den:
...
@@ -2409,7 +3207,11 @@ Ldivsf$a$den:
movel
IMM
(
1
),
d2
movel
IMM
(
1
),
d2
andl
d5
,
d0
andl
d5
,
d0
1
:
addl
d0
,
d0
|
shift
a
left
until
bit
FLT_MANT_DIG
-
1
is
set
1
:
addl
d0
,
d0
|
shift
a
left
until
bit
FLT_MANT_DIG
-
1
is
set
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d2
|
and
adjust
exponent
subw
IMM
(
1
),
d2
|
and
adjust
exponent
#
else
subl
IMM
(
1
),
d2
|
and
adjust
exponent
#
endif
btst
IMM
(
FLT_MANT_DIG
-
1
),
d0
btst
IMM
(
FLT_MANT_DIG
-
1
),
d0
bne
Ldivsf
$
1
bne
Ldivsf
$
1
bra
1
b
bra
1
b
...
@@ -2418,7 +3220,11 @@ Ldivsf$b$den:
...
@@ -2418,7 +3220,11 @@ Ldivsf$b$den:
movel
IMM
(
1
),
d3
movel
IMM
(
1
),
d3
andl
d5
,
d1
andl
d5
,
d1
1
:
addl
d1
,
d1
|
shift
b
left
until
bit
FLT_MANT_DIG
is
set
1
:
addl
d1
,
d1
|
shift
b
left
until
bit
FLT_MANT_DIG
is
set
#
ifndef
__mcf5200__
subw
IMM
(
1
),
d3
|
and
adjust
exponent
subw
IMM
(
1
),
d3
|
and
adjust
exponent
#
else
subl
IMM
(
1
),
d3
|
and
adjust
exponent
#
endif
btst
IMM
(
FLT_MANT_DIG
-
1
),
d1
btst
IMM
(
FLT_MANT_DIG
-
1
),
d1
bne
Ldivsf
$
2
bne
Ldivsf
$
2
bra
1
b
bra
1
b
...
@@ -2427,20 +3233,43 @@ Lround$exit:
...
@@ -2427,20 +3233,43 @@ Lround$exit:
|
This
is
a
common
exit
point
for
__mulsf3
and
__divsf3
.
|
This
is
a
common
exit
point
for
__mulsf3
and
__divsf3
.
|
First
check
for
underlow
in
the
exponent
:
|
First
check
for
underlow
in
the
exponent
:
#
ifndef
__mcf5200__
cmpw
IMM
(
-
FLT_MANT_DIG
-
1
),
d2
cmpw
IMM
(
-
FLT_MANT_DIG
-
1
),
d2
#
else
cmpl
IMM
(
-
FLT_MANT_DIG
-
1
),
d2
#
endif
blt
Lf
$
underflow
blt
Lf
$
underflow
|
It
could
happen
that
the
exponent
is
less
than
1
,
in
which
case
the
|
It
could
happen
that
the
exponent
is
less
than
1
,
in
which
case
the
|
number
is
denormalized
.
In
this
case
we
shift
right
and
adjust
the
|
number
is
denormalized
.
In
this
case
we
shift
right
and
adjust
the
|
exponent
until
it
becomes
1
or
the
fraction
is
zero
(
in
the
latter
case
|
exponent
until
it
becomes
1
or
the
fraction
is
zero
(
in
the
latter
case
|
we
signal
underflow
and
return
zero
).
|
we
signal
underflow
and
return
zero
).
movel
IMM
(
0
),
d6
|
d6
is
used
temporarily
movel
IMM
(
0
),
d6
|
d6
is
used
temporarily
#
ifndef
__mcf5200__
cmpw
IMM
(
1
),
d2
|
if
the
exponent
is
less
than
1
we
cmpw
IMM
(
1
),
d2
|
if
the
exponent
is
less
than
1
we
#
else
cmpl
IMM
(
1
),
d2
|
if
the
exponent
is
less
than
1
we
#
endif
bge
2
f
|
have
to
shift
right
(
denormalize
)
bge
2
f
|
have
to
shift
right
(
denormalize
)
1
:
addw
IMM
(
1
),
d2
|
adjust
the
exponent
1
:
#
ifndef
__mcf5200__
addw
IMM
(
1
),
d2
|
adjust
the
exponent
lsrl
IMM
(
1
),
d0
|
shift
right
once
lsrl
IMM
(
1
),
d0
|
shift
right
once
roxrl
IMM
(
1
),
d1
|
roxrl
IMM
(
1
),
d1
|
roxrl
IMM
(
1
),
d6
|
d6
collect
bits
we
would
lose
otherwise
roxrl
IMM
(
1
),
d6
|
d6
collect
bits
we
would
lose
otherwise
cmpw
IMM
(
1
),
d2
|
is
the
exponent
1
already
?
cmpw
IMM
(
1
),
d2
|
is
the
exponent
1
already
?
#
else
addql
IMM
(
1
),
d2
|
adjust
the
exponent
lsrl
IMM
(
1
),
d6
btst
IMM
(
0
),
d1
beq
11
f
bset
IMM
(
31
),
d6
11
:
lsrl
IMM
(
1
),
d1
btst
IMM
(
0
),
d0
beq
10
f
bset
IMM
(
31
),
d1
10
:
lsrl
IMM
(
1
),
d0
cmpl
IMM
(
1
),
d2
|
is
the
exponent
1
already
?
#
endif
beq
2
f
|
if
not
loop
back
beq
2
f
|
if
not
loop
back
bra
1
b
|
bra
1
b
|
bra
Lf
$
underflow
|
safety
check
,
shouldn
'
t
execute
'
bra
Lf
$
underflow
|
safety
check
,
shouldn
'
t
execute
'
...
@@ -2449,9 +3278,16 @@ Lround$exit:
...
@@ -2449,9 +3278,16 @@ Lround$exit:
|
Now
call
the
rounding
routine
(
which
takes
care
of
denormalized
numbers
)
:
|
Now
call
the
rounding
routine
(
which
takes
care
of
denormalized
numbers
)
:
lea
Lround
$
0
,
a0
|
to
return
from
rounding
routine
lea
Lround
$
0
,
a0
|
to
return
from
rounding
routine
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
lea
SYM
(
_fpCCR
),
a1
|
check
the
rounding
mode
#
ifdef
__mcf5200__
clrl
d6
#
endif
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
movew
a1
@
(
6
),
d6
|
rounding
mode
in
d6
beq
Lround
$
to
$
nearest
beq
Lround
$
to
$
nearest
#
ifndef
__mcf5200__
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
cmpw
IMM
(
ROUND_TO_PLUS
),
d6
#
else
cmpl
IMM
(
ROUND_TO_PLUS
),
d6
#
endif
bhi
Lround
$
to
$
minus
bhi
Lround
$
to
$
minus
blt
Lround
$
to
$
zero
blt
Lround
$
to
$
zero
bra
Lround
$
to
$
plus
bra
Lround
$
to
$
plus
...
@@ -2463,17 +3299,29 @@ Lround$0:
...
@@ -2463,17 +3299,29 @@ Lround$0:
|
check
again
for
underflow
!
).
We
have
to
check
for
overflow
or
for
a
|
check
again
for
underflow
!
).
We
have
to
check
for
overflow
or
for
a
|
denormalized
number
(
which
also
signals
underflow
).
|
denormalized
number
(
which
also
signals
underflow
).
|
Check
for
overflow
(
i
.
e
.,
exponent
>=
255
).
|
Check
for
overflow
(
i
.
e
.,
exponent
>=
255
).
#
ifndef
__mcf5200__
cmpw
IMM
(
0x00ff
),
d2
cmpw
IMM
(
0x00ff
),
d2
#
else
cmpl
IMM
(
0x00ff
),
d2
#
endif
bge
Lf
$
overflow
bge
Lf
$
overflow
|
Now
check
for
a
denormalized
number
(
exponent
==
0
).
|
Now
check
for
a
denormalized
number
(
exponent
==
0
).
movew
d2
,
d2
movew
d2
,
d2
beq
Lf
$
den
beq
Lf
$
den
1
:
1
:
|
Put
back
the
exponents
and
sign
and
return
.
|
Put
back
the
exponents
and
sign
and
return
.
#
ifndef
__mcf5200__
lslw
IMM
(
7
),
d2
|
exponent
back
to
fourth
byte
lslw
IMM
(
7
),
d2
|
exponent
back
to
fourth
byte
#
else
lsll
IMM
(
7
),
d2
|
exponent
back
to
fourth
byte
#
endif
bclr
IMM
(
FLT_MANT_DIG
-
1
),
d0
bclr
IMM
(
FLT_MANT_DIG
-
1
),
d0
swap
d0
|
and
put
back
exponent
swap
d0
|
and
put
back
exponent
#
ifndef
__mcf5200__
orw
d2
,
d0
|
orw
d2
,
d0
|
#
else
orl
d2
,
d0
#
endif
swap
d0
|
swap
d0
|
orl
d7
,
d0
|
and
sign
also
orl
d7
,
d0
|
and
sign
also
...
@@ -2557,7 +3405,13 @@ Lcmpsf$2:
...
@@ -2557,7 +3405,13 @@ Lcmpsf$2:
tstl
d6
tstl
d6
bpl
1
f
bpl
1
f
|
If
both
are
negative
exchange
them
|
If
both
are
negative
exchange
them
#
ifndef
__mcf5200__
exg
d0
,
d1
exg
d0
,
d1
#
else
movel
d0
,
d7
movel
d1
,
d0
movel
d7
,
d1
#
endif
1
:
1
:
|
Now
that
they
are
positive
we
just
compare
them
as
longs
(
does
this
also
|
Now
that
they
are
positive
we
just
compare
them
as
longs
(
does
this
also
|
work
for
denormalized
numbers
?
).
|
work
for
denormalized
numbers
?
).
...
@@ -2608,11 +3462,20 @@ Lround$to$nearest:
...
@@ -2608,11 +3462,20 @@ Lround$to$nearest:
|
Normalize
shifting
left
until
bit
#
FLT_MANT_DIG
is
set
or
the
exponent
|
Normalize
shifting
left
until
bit
#
FLT_MANT_DIG
is
set
or
the
exponent
|
is
one
(
remember
that
a
denormalized
number
corresponds
to
an
|
is
one
(
remember
that
a
denormalized
number
corresponds
to
an
|
exponent
of
-
F_BIAS
+
1
).
|
exponent
of
-
F_BIAS
+
1
).
#
ifndef
__mcf5200__
cmpw
IMM
(
1
),
d2
|
remember
that
the
exponent
is
at
least
one
cmpw
IMM
(
1
),
d2
|
remember
that
the
exponent
is
at
least
one
#
else
cmpl
IMM
(
1
),
d2
|
remember
that
the
exponent
is
at
least
one
#
endif
beq
2
f
|
an
exponent
of
one
means
denormalized
beq
2
f
|
an
exponent
of
one
means
denormalized
addl
d1
,
d1
|
else
shift
and
adjust
the
exponent
addl
d1
,
d1
|
else
shift
and
adjust
the
exponent
addxl
d0
,
d0
|
addxl
d0
,
d0
|
#
ifndef
__mcf5200__
dbra
d2
,
1
b
|
dbra
d2
,
1
b
|
#
else
subql
IMM
(
1
),
d2
bpl
1
b
#
endif
2
:
2
:
|
Now
round
:
we
do
it
as
follows
:
after
the
shifting
we
can
write
the
|
Now
round
:
we
do
it
as
follows
:
after
the
shifting
we
can
write
the
|
fraction
part
as
f
+
delta
,
where
1
<
f
<
2
^
25
,
and
0
<=
delta
<=
2
.
|
fraction
part
as
f
+
delta
,
where
1
<
f
<
2
^
25
,
and
0
<=
delta
<=
2
.
...
@@ -2636,7 +3499,11 @@ Lround$to$nearest:
...
@@ -2636,7 +3499,11 @@ Lround$to$nearest:
btst
IMM
(
FLT_MANT_DIG
),
d0
btst
IMM
(
FLT_MANT_DIG
),
d0
beq
1
f
beq
1
f
lsrl
IMM
(
1
),
d0
lsrl
IMM
(
1
),
d0
#
ifndef
__mcf5200__
addw
IMM
(
1
),
d2
addw
IMM
(
1
),
d2
#
else
addql
IMM
(
1
),
d2
#
endif
1
:
1
:
|
If
bit
#
FLT_MANT_DIG
-
1
is
clear
we
have
a
denormalized
number
,
so
we
|
If
bit
#
FLT_MANT_DIG
-
1
is
clear
we
have
a
denormalized
number
,
so
we
|
have
to
put
the
exponent
to
zero
and
return
a
denormalized
number
.
|
have
to
put
the
exponent
to
zero
and
return
a
denormalized
number
.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment