pass all FP tests if FPU not present
[riscv-tests.git] / env / pt / riscv_test.h
1 #ifndef _ENV_PHYSICAL_SINGLE_CORE_TIMER_H
2 #define _ENV_PHYSICAL_SINGLE_CORE_TIMER_H
3
4 #include "pcr.h"
5
6 //-----------------------------------------------------------------------
7 // Begin Macro
8 //-----------------------------------------------------------------------
9
10 #define RVTEST_RV64U \
11
12 #define RVTEST_FP_ENABLE \
13 setpcr cr0, 2; \
14 mfpcr a0, cr0; \
15 and a0, a0, 2; \
16 bnez a0, 2f; \
17 RVTEST_PASS; \
18 2:mtfsr x0; \
19
20 #define RVTEST_VEC_ENABLE \
21 mfpcr a0, cr0; \
22 ori a0, a0, 4; \
23 mtpcr a0, cr0; \
24 li a0, 0xff; \
25 mtpcr a0, cr18; \
26
27 #define RVTEST_CODE_BEGIN \
28 .text; \
29 .align 4; \
30 .global _start; \
31 _start: \
32 RVTEST_FP_ENABLE \
33 RVTEST_VEC_ENABLE \
34 mfpcr a0, cr10; 1: bnez a0, 1b; \
35 ENABLE_TIMER_INTERRUPT \
36
37 //-----------------------------------------------------------------------
38 // End Macro
39 //-----------------------------------------------------------------------
40
41 #define RVTEST_CODE_END \
42 XCPT_HANDLER \
43
44 //-----------------------------------------------------------------------
45 // Pass/Fail Macro
46 //-----------------------------------------------------------------------
47
48 #define RVTEST_PASS \
49 fence; \
50 li x1, 1; \
51 mtpcr x1, cr30; \
52 1: b 1b; \
53
54 #define RVTEST_FAIL \
55 fence; \
56 beqz x28, 1f; \
57 sll x28, x28, 1; \
58 or x28, x28, 1; \
59 mtpcr x28, cr30; \
60 1: b 1b; \
61
62 //-----------------------------------------------------------------------
63 // Data Section Macro
64 //-----------------------------------------------------------------------
65
66 #define RVTEST_DATA_BEGIN \
67 .align 3; \
68 regspill: \
69 .dword 0xdeadbeefcafebabe; \
70 .dword 0xdeadbeefcafebabe; \
71 .dword 0xdeadbeefcafebabe; \
72 .dword 0xdeadbeefcafebabe; \
73 .dword 0xdeadbeefcafebabe; \
74 .dword 0xdeadbeefcafebabe; \
75 .dword 0xdeadbeefcafebabe; \
76 .dword 0xdeadbeefcafebabe; \
77 .dword 0xdeadbeefcafebabe; \
78 .dword 0xdeadbeefcafebabe; \
79 .dword 0xdeadbeefcafebabe; \
80 .dword 0xdeadbeefcafebabe; \
81 .dword 0xdeadbeefcafebabe; \
82 .dword 0xdeadbeefcafebabe; \
83 .dword 0xdeadbeefcafebabe; \
84 .dword 0xdeadbeefcafebabe; \
85 .dword 0xdeadbeefcafebabe; \
86 .dword 0xdeadbeefcafebabe; \
87 .dword 0xdeadbeefcafebabe; \
88 .dword 0xdeadbeefcafebabe; \
89 .dword 0xdeadbeefcafebabe; \
90 .dword 0xdeadbeefcafebabe; \
91 .dword 0xdeadbeefcafebabe; \
92 .dword 0xdeadbeefcafebabe; \
93 evac: \
94 .dword 0xdeadbeefcafebabe; \
95 .dword 0xdeadbeefcafebabe; \
96 .dword 0xdeadbeefcafebabe; \
97 .dword 0xdeadbeefcafebabe; \
98 .dword 0xdeadbeefcafebabe; \
99 .dword 0xdeadbeefcafebabe; \
100 .dword 0xdeadbeefcafebabe; \
101 .dword 0xdeadbeefcafebabe; \
102 .dword 0xdeadbeefcafebabe; \
103 .dword 0xdeadbeefcafebabe; \
104 .dword 0xdeadbeefcafebabe; \
105 .dword 0xdeadbeefcafebabe; \
106 .dword 0xdeadbeefcafebabe; \
107 .dword 0xdeadbeefcafebabe; \
108 .dword 0xdeadbeefcafebabe; \
109 .dword 0xdeadbeefcafebabe; \
110 .dword 0xdeadbeefcafebabe; \
111 .dword 0xdeadbeefcafebabe; \
112 .dword 0xdeadbeefcafebabe; \
113 .dword 0xdeadbeefcafebabe; \
114 .dword 0xdeadbeefcafebabe; \
115 .dword 0xdeadbeefcafebabe; \
116 .dword 0xdeadbeefcafebabe; \
117 .dword 0xdeadbeefcafebabe; \
118 .dword 0xdeadbeefcafebabe; \
119 .dword 0xdeadbeefcafebabe; \
120 .dword 0xdeadbeefcafebabe; \
121 .dword 0xdeadbeefcafebabe; \
122 .dword 0xdeadbeefcafebabe; \
123 .dword 0xdeadbeefcafebabe; \
124 .dword 0xdeadbeefcafebabe; \
125 .dword 0xdeadbeefcafebabe; \
126
127 #define RVTEST_DATA_END
128
129 //#define RVTEST_DATA_BEGIN .align 4; .global begin_signature; begin_signature:
130 //#define RVTEST_DATA_END .align 4; .global end_signature; end_signature:
131
132 //-----------------------------------------------------------------------
133 // Misc
134 //-----------------------------------------------------------------------
135
136 #define ENABLE_TIMER_INTERRUPT \
137 mtpcr x0,ASM_CR(PCR_CLR_IPI);\
138 mfpcr a0,ASM_CR(PCR_SR); \
139 li a1, SR_ET|SR_IM; \
140 or a0,a0,a1; \
141 mtpcr a0,ASM_CR(PCR_SR); \
142 la a0,_handler; \
143 mtpcr a0,ASM_CR(PCR_EVEC); \
144 mtpcr x0,ASM_CR(PCR_COUNT); \
145 addi a0,x0,60; \
146 mtpcr a0,ASM_CR(PCR_COMPARE);\
147
148 #define XCPT_HANDLER \
149 _handler: \
150 mtpcr a0,ASM_CR(PCR_K0); \
151 mtpcr a1,ASM_CR(PCR_K1); \
152 la a0,regspill; \
153 sd a2,0(a0); \
154 sd a3,8(a0); \
155 sd a4,16(a0); \
156 sd a5,24(a0); \
157 sd s0,32(a0); \
158 sd s1,40(a0); \
159 mfpcr s1,ASM_CR(PCR_VECBANK);\
160 mfpcr s0,ASM_CR(PCR_VECCFG); \
161 la a0,evac; \
162 vxcptevac a0; \
163 mtpcr s1,ASM_CR(PCR_VECBANK);\
164 srli a1,s0,12; \
165 andi a1,a1,0x3f; \
166 srli a2,s0,18; \
167 andi a2,a2,0x3f; \
168 vvcfg a1,a2; \
169 li a2,0xfff; \
170 and a1,s0,a2; \
171 vsetvl a1,a1; \
172 vxcpthold; \
173 li a5,0; \
174 _handler_loop: \
175 ld a1,0(a0); \
176 addi a0,a0,8; \
177 blt a1,x0,_done; \
178 srli a2,a1,32; \
179 andi a2,a2,0x1; \
180 beq a2,x0,_vcnt; \
181 _vcmd: \
182 beq a5,x0,_vcmd_skip; \
183 venqcmd a4,a3; \
184 _vcmd_skip: \
185 li a5,1; \
186 move a4,a1; \
187 srli a3,a4,36; \
188 andi a3,a3,0x1; \
189 _vimm1: \
190 srli a2,a4,35; \
191 andi a2,a2,0x1; \
192 beq a2,x0,_vimm2; \
193 ld a1,0(a0); \
194 addi a0,a0,8; \
195 venqimm1 a1,a3; \
196 _vimm2: \
197 srli a2,a4,34; \
198 andi a2,a2,0x1; \
199 beq a2,x0,_end; \
200 ld a1,0(a0); \
201 addi a0,a0,8; \
202 venqimm2 a1,a3; \
203 j _end; \
204 _vcnt: \
205 ld a2,0(a0); \
206 srli a2,a2,31; \
207 andi a2,a2,0x2; \
208 or a3,a3,a2; \
209 venqcnt a1,a3; \
210 _end: \
211 j _handler_loop; \
212 _done: \
213 beq a5,x0,_done_skip; \
214 venqcmd a4,a3; \
215 _done_skip: \
216 la a0,regspill; \
217 ld a2,0(a0); \
218 ld a3,8(a0); \
219 ld a4,16(a0); \
220 ld a5,24(a0); \
221 ld s0,32(a0); \
222 ld s1,40(a0); \
223 mfpcr a0,ASM_CR(PCR_COUNT); \
224 addi a0,a0,60; \
225 mtpcr a0,ASM_CR(PCR_COMPARE);\
226 mfpcr a0,ASM_CR(PCR_K0); \
227 mfpcr a1,ASM_CR(PCR_K1); \
228 eret; \
229
230 #endif