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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [fpu.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
#include "leon3.h"
2
#include "testmod.h" 
3
//#include <math.h> 
4
 
5
int __errno;
6
fputest()
7
{
8
        int tmp;
9
 
10
        tmp = xgetpsr();
11
        setpsr(tmp | (1 << 12));
12
        tmp = xgetpsr();
13
        if (!(tmp & (1 <<12))) return(0);
14
        set_fsr(0);
15
 
16
        report_subtest(FPU_TEST+(get_pid()<<4));
17
 
18
        fpu_main();
19
 
20
}
21
 
22
asm(
23
 
24
"       .global a1, a2\n"
25
"       .align 8\n"
26
"a1:    .word 0x48000001\n"
27
"       .word 0\n"
28
"b1:    .word 0x48000000\n"
29
"       .word 0\n"
30
"c1:    .word 0x46c00000\n"
31
"       .word 0\n"
32
"c2:    .word 0x3ff00000\n"
33
"       .word 0 \n"
34
"       .word 0x40000000\n"
35
"       .word 0 \n"
36
"       .word 0x40080000\n"
37
"       .word 0 \n"
38
"       .word 0x3f800000\n"
39
        );
40
 
41
asm(
42
"       .global       \n"
43
"       .text         \n"
44
"       .align 4      \n"
45
"                     \n"
46
"fpu_chkft:           \n"
47
"       set     1, %o0                 \n"
48
"       mov     %asr16, %o2            \n"
49
"       srl     %o2, 30, %o2           \n"
50
"       and     %o2, 3, %o2                  ! %o2 = fpft \n"
51
"       cmp     %o2, %g0               \n"
52
"       beq     1f                     \n"
53
"       mov     0, %o0                 \n"
54
"       cmp     %o2, 3                 \n"
55
"       beq     1f                     \n"
56
"       set     c2, %o1                \n"
57
"       ldd     [%o1], %f0             \n"
58
"       ldd     [%o1 + 8], %f2         \n"
59
"       ld      [%o1 + 0x18], %f30           ! f30 = 1.0 \n"
60
"       fmovs   %f30, %f10             \n"
61
"       fmovs   %f30, %f12             \n"
62
"       fmovs   %f30, %f14             \n"
63
"       set     0x03007a, %o3                ! 4-bit error DP ram 0 \n"
64
"       mov     %o3, %asr16            \n"
65
"       nop; nop; nop; nop; nop; nop;  \n"
66
"       fmovs   %f0, %f0               \n"
67
"       fmovs   %f1, %f1               \n"
68
"       fmovs   %f10, %f10             \n"
69
"       fmovs   %f12, %f12             \n"
70
"       fmovs   %f14, %f14             \n"
71
"       set     0x03007e, %o3                ! 4-bit error DP ram 1 \n"
72
"       mov     %o3, %asr16            \n"
73
"       nop; nop; nop; nop; nop; nop;  \n"
74
"       fmovs   %f2, %f2               \n"
75
"       fmovs   %f3, %f3               \n"
76
"       mov     %g0, %asr16            \n"
77
"       nop; nop; nop; nop; nop; nop;  \n"
78
"       faddd   %f0, %f2, %f4                ! should correct 4 errors \n"
79
"       fadds   %f10, %f30, %f20             ! should correct 1 error  \n"
80
"       std     %f12, [%o1]                  ! should correct 1 error  \n"
81
"       st      %f14, [%o1]                  ! should correct 1 error  \n"
82
"       ldd     [%o1 + 0x10], %f6            ! %f6 = 2.0 (DP) \n"
83
"       ld      [%o1 + 0x8], %f8             ! %f8 = 2.0 (SP) \n"
84
"       fcmpd   %f4, %f6               \n"
85
"       nop                            \n"
86
"       fbne    1f                     \n"
87
"       fcmps    %f20, %f8             \n"
88
"       nop                            \n"
89
"       fbne    1f                     \n"
90
"       mov     %asr16, %o1            \n"
91
"       srl     %o1, 27, %o1           \n"
92
"       and     %o1, 7, %o1                 ! error counter \n"
93
"       mov     0, %o0                 \n"
94
"       cmp     %o2, 1                 \n"
95
"       beq     1f                     \n"
96
"       sub     %o1, 7, %o0                 ! should be 7 for fpft = 1 \n"
97
"       sub     %o1, 4, %o0                 ! should be 4 for fpft = 2 \n"
98
"1:     retl                            \n"
99
"       nop                             \n"
100
);
101
 
102
 
103
fpu_main()
104
{
105
        volatile double a, c, d;
106
        double e;
107
        extern volatile double a1,b1,c1;
108
        float b;
109
        int tmp;
110
 
111
        d = 3.0;
112
        e = d;
113
        a = *(double *)&a1 - *(double *)&b1;
114
        if (a != c1) fail(1);
115
        a = sqrt(e);
116
        if (fabs((a * a) - d) > 1E-15) fail(2);
117
        b = sqrt(e);
118
        if (fabs((b * b) - d) > 1E-7) fail(3);
119
        tmp = fpu_pipe();
120
        if (tmp) fail(tmp);
121
        tmp = fpu_chkft();
122
        if (tmp) fail(5);
123
//      if (((get_asr17() >> 10) & 0x3C0003) == 1) grfpu_test();
124
}
125
 
126
float f1x = -1.0;
127
int fsr1[4] = { 0x80000000, 0 , 0, 0 };
128
int ftest[2] = { 0x48000000, 0x48100000 };
129
 
130
fpu_pipe()
131
{
132
        asm(
133
 
134
"       set     fsr1, %o0       ! check ldfsr/stfsr interlock\n"
135
"       ld      [%o0], %fsr\n"
136
"       st      %g0, [%o0]\n"
137
"       ld      [%o0], %fsr\n"
138
"       st      %fsr, [%o0]\n"
139
"       ld      [%o0], %o2\n"
140
"       set     0x000E0000, %o1\n"
141
"       andn    %o2, %o1, %o2\n"
142
"       subcc   %g0, %o2, %g0\n"
143
"       bne,a   1f\n"
144
"       mov     3, %o0\n"
145
"\n"
146
"       set 0x0f800000, %o1     ! check ldfsr/fpop interlock\n"
147
"       st      %o1, [%sp-96]\n"
148
"       st      %g0, [%sp-92]\n"
149
"       ld      [%sp-96], %fsr\n"
150
"       st      %g0, [%sp-96]\n"
151
"       set     f1x, %o2\n"
152
"       ld      [%o2], %f0\n"
153
"       nop; nop\n"
154
"       ld      [%sp-96], %fsr\n"
155
"       ld      [%sp-92], %fsr\n"
156
"       fsqrts  %f0, %f1\n"
157
"       st      %fsr, [%sp-96]\n"
158
"       ld      [%sp-96], %o0\n"
159
"       andcc   %o0, 0x200, %g0\n"
160
"       be,a    1f\n"
161
"       mov     4, %o0\n"
162
"\n"
163
"\n"
164
"       mov     0, %o0\n"
165
"\n"
166
"1:\n"
167
"       mov     %o0, %i0\n"
168
"       nop\n"
169
"       set ftest, %o2\n"
170
"       ld [%o2], %f8\n"
171
"       set f1x, %o1\n"
172
"       ld [%o1], %f3\n"
173
"       faddd %f2, %f4, %f2\n"
174
"       fcmps %f2, %f8\n"
175
"       nop\n"
176
"       fbe 3f\n"
177
"       nop\n"
178
"       set 1, %i0\n"
179
"3:\n"
180
"       ld [%o2+4], %f8\n"
181
"       ld [%o1], %f5\n"
182
"       faddd %f2, %f4, %f4\n"
183
"       fcmps %f4, %f8\n"
184
"       nop\n"
185
"       fbe 4f\n"
186
"       nop\n"
187
"       set 1, %i0\n"
188
"       nop\n"
189
"4:\n"
190
 
191
);
192
}
193
 
194
asm (
195
"       .global set_fsr, get_fsr\n"
196
"get_fsr: \n"
197
"       st      %fsr, [%sp-96]\n"
198
"       retl\n"
199
"       ld      [%sp-96], %o0\n"
200
"set_fsr: \n"
201
"       st      %o0, [%sp-96]\n"
202
"       retl\n"
203
"       ld      [%sp-96], %fsr\n"
204
);
205
 

powered by: WebSVN 2.1.0

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