OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [i386/] [math-emu/] [round_Xsig.S] - Blame information for rev 1777

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1623 jcastillo
/*---------------------------------------------------------------------------+
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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.