- Removed unused HandleEvent method.
[AROS.git] / arch / m68k-all / libgcc1 / _fixdfsi.s
blob6f5ee56f9b7aa9365ebf20ac2d1d8e5acde0edf5
1 | double float to long conversion routine
3 | written by Kai-Uwe Bloem (I5110401@dbstu1.bitnet).
4 | Based on a 80x86 floating point packet from comp.os.minix, written by P.Housel
7 | Revision 1.3, kub 01-90 :
8 | added support for denormalized numbers
10 | Revision 1.2, kub 01-90 :
11 | replace far shifts by swaps to gain speed
13 | Revision 1.1, kub 12-89 :
14 | Ported over to 68k assembler
16 | Revision 1.0:
17 | original 8088 code from P.S.Housel
19 BIAS8 = 0x3FF-1
21 .text
22 .even
23 .globl __fixdfsi
25 __fixdfsi:
26 lea %sp@(4),%a0 | pointer to parameters
27 moveml %d2/%d4/%d5,%sp@- | save registers
28 moveml %a0@,%d4-%d5 | get the number
29 movew %a0@,%d0 | extract exp
30 movew %d0,%d2 | extract sign
31 lsrw #4,%d0
32 andw #0x07ff,%d0 | kill sign bit
34 andl #0x0fffff,%d4 | remove exponent from mantissa
35 orl #0x100000,%d4 | restore implied leading "1"
37 cmpw #BIAS8,%d0 | check exponent
38 blt zero | strictly factional, no integer part ?
39 cmpw #BIAS8+32,%d0 | is it too big to fit in a 32-bit integer ?
40 bgt toobig
42 subw #BIAS8+21,%d0 | adjust exponent
43 bgt L_2 | shift up
44 beq L_3 | no shift
46 cmpw #-8,%d0 | replace far shifts by swap
47 bgt L_1
48 movew %d4,%d5 | shift fast, 16 bits
49 swap %d5
50 clrw %d4
51 swap %d4
52 addw #16,%d0 | account for swap
53 bgt L_2
54 beq L_3
56 L_1: lsrl #1,%d4 | shift down to align radix point;
57 addw #1,%d0 | extra bits fall off the end (no rounding)
58 blt L_1 | shifted all the way down yet ?
59 bra L_3
61 L_2: addl %d5,%d5 | shift up to align radix point
62 addxl %d4,%d4
63 subw #1,%d0
64 bgt L_2
66 L_3: movel %d4,%d0 | put integer into result register
67 cmpl #0x80000000,%d0 | -2147483648 is a nasty evil special case
68 bne L_6
69 tstw %d2 | this had better be -2^31 and not 2^31
70 bpl toobig
71 bra L_8
72 L_6: tstl %d0 | sign bit set ? (i.e. too big)
73 bmi toobig
74 L_7:
75 tstw %d2 | is it negative ?
76 bpl L_8
77 negl %d0 | negate
78 L_8:
79 moveml %sp@+,%d2/%d4/%d5
80 rts
82 zero:
83 clrl %d0 | make the whole thing zero
84 bra L_7
86 toobig:
87 movel #0x7fffffff,%d0 | ugh. Should cause a trap here.
88 bra L_7