1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 .file "polynomial_Xsig.S"
26
27 #include "fpu_emu.h"
28
29
30 #define TERM_SIZE $8
31 #define SUM_MS -20(%ebp)
32 #define SUM_MIDDLE -24(%ebp)
33 #define SUM_LS -28(%ebp)
34 #define ACCUM_MS -4(%ebp)
35 #define ACCUM_MIDDLE -8(%ebp)
36 #define ACCUM_LS -12(%ebp)
37 #define OVERFLOWED -16(%ebp)
38
39 .text
40 ENTRY(polynomial_Xsig)
41 pushl %ebp
42 movl %esp,%ebp
43 subl $32,%esp
44 pushl %esi
45 pushl %edi
46 pushl %ebx
47
48 movl PARAM2,%esi
49 movl PARAM3,%edi
50
51 movl TERM_SIZE,%eax
52 mull PARAM4
53 addl %eax,%edi
54
55 movl 4(%edi),%edx
56 movl %edx,SUM_MS
57 movl (%edi),%edx
58 movl %edx,SUM_MIDDLE
59 xor %eax,%eax
60 movl %eax,SUM_LS
61 movb %al,OVERFLOWED
62
63 subl TERM_SIZE,%edi
64 decl PARAM4
65 js L_accum_done
66
67 L_accum_loop:
68 xor %eax,%eax
69 movl %eax,ACCUM_MS
70 movl %eax,ACCUM_MIDDLE
71
72 movl SUM_MIDDLE,%eax
73 mull (%esi)
74 movl %edx,ACCUM_LS
75
76 movl SUM_MIDDLE,%eax
77 mull 4(%esi)
78 addl %eax,ACCUM_LS
79 adcl %edx,ACCUM_MIDDLE
80 adcl $0,ACCUM_MS
81
82 movl SUM_MS,%eax
83 mull (%esi)
84 addl %eax,ACCUM_LS
85 adcl %edx,ACCUM_MIDDLE
86 adcl $0,ACCUM_MS
87
88 movl SUM_MS,%eax
89 mull 4(%esi)
90 addl %eax,ACCUM_MIDDLE
91 adcl %edx,ACCUM_MS
92
93 testb $0xff,OVERFLOWED
94 jz L_no_overflow
95
96 movl (%esi),%eax
97 addl %eax,ACCUM_MIDDLE
98 movl 4(%esi),%eax
99 adcl %eax,ACCUM_MS
100
101 L_no_overflow:
102
103
104
105
106
107 movl ACCUM_LS,%eax
108 addl (%edi),%eax
109 movl %eax,SUM_LS
110 movl ACCUM_MIDDLE,%eax
111 adcl (%edi),%eax
112 movl %eax,SUM_MIDDLE
113 movl ACCUM_MS,%eax
114 adcl 4(%edi),%eax
115 movl %eax,SUM_MS
116 sbbb %al,%al
117 movb %al,OVERFLOWED
118
119 subl TERM_SIZE,%edi
120 decl PARAM4
121 jns L_accum_loop
122
123 L_accum_done:
124 movl PARAM1,%edi
125 movl SUM_LS,%eax
126 addl %eax,(%edi)
127 movl SUM_MIDDLE,%eax
128 adcl %eax,4(%edi)
129 movl SUM_MS,%eax
130 adcl %eax,8(%edi)
131
132 popl %ebx
133 popl %edi
134 popl %esi
135 leave
136 ret
137 ENDPROC(polynomial_Xsig)