xref: /aosp_15_r20/external/coreboot/src/arch/riscv/fp_asm.S (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1/* SPDX-License-Identifier: GPL-2.0-only */
2
3/*
4 * This file define some function used to swap value between memory
5 * and float register. This will be used in misaligned access exception
6 * handling.
7 */
8
9#if defined(__riscv_flen)
10#if __riscv_flen >= 32
11
12	.text
13
14/* void read_f32(int regnum, uint32_t* v)
15 *    regnum : which register want to read
16 *    v : address to hold bits info of reading
17 */
18	.align	1
19	.globl read_f32
20read_f32:
21	la	a2, .Lr32_t
22	andi	a0, a0, 31
23	slli	a0, a0, 1
24	add	a0, a0, a2
25	lbu	a0, 0(a0)
26	add	a0, a0, a2
27	jr	a0
28	.align	2
29.Lr32_t:
30	.half	.Lr32_f0  - .Lr32_t
31	.half	.Lr32_f1  - .Lr32_t
32	.half	.Lr32_f2  - .Lr32_t
33	.half	.Lr32_f3  - .Lr32_t
34	.half	.Lr32_f4  - .Lr32_t
35	.half	.Lr32_f5  - .Lr32_t
36	.half	.Lr32_f6  - .Lr32_t
37	.half	.Lr32_f7  - .Lr32_t
38	.half	.Lr32_f8  - .Lr32_t
39	.half	.Lr32_f9  - .Lr32_t
40	.half	.Lr32_f10 - .Lr32_t
41	.half	.Lr32_f11 - .Lr32_t
42	.half	.Lr32_f12 - .Lr32_t
43	.half	.Lr32_f13 - .Lr32_t
44	.half	.Lr32_f14 - .Lr32_t
45	.half	.Lr32_f15 - .Lr32_t
46	.half	.Lr32_f16 - .Lr32_t
47	.half	.Lr32_f17 - .Lr32_t
48	.half	.Lr32_f18 - .Lr32_t
49	.half	.Lr32_f19 - .Lr32_t
50	.half	.Lr32_f20 - .Lr32_t
51	.half	.Lr32_f21 - .Lr32_t
52	.half	.Lr32_f22 - .Lr32_t
53	.half	.Lr32_f23 - .Lr32_t
54	.half	.Lr32_f24 - .Lr32_t
55	.half	.Lr32_f25 - .Lr32_t
56	.half	.Lr32_f26 - .Lr32_t
57	.half	.Lr32_f27 - .Lr32_t
58	.half	.Lr32_f28 - .Lr32_t
59	.half	.Lr32_f29 - .Lr32_t
60	.half	.Lr32_f30 - .Lr32_t
61	.half	.Lr32_f31 - .Lr32_t
62#define  read32(which)	.Lr32_##which: fsw which, 0(a1); ret
63	read32(f0)
64	read32(f1)
65	read32(f2)
66	read32(f3)
67	read32(f4)
68	read32(f5)
69	read32(f6)
70	read32(f7)
71	read32(f8)
72	read32(f9)
73	read32(f10)
74	read32(f11)
75	read32(f12)
76	read32(f13)
77	read32(f14)
78	read32(f15)
79	read32(f16)
80	read32(f17)
81	read32(f18)
82	read32(f19)
83	read32(f20)
84	read32(f21)
85	read32(f22)
86	read32(f23)
87	read32(f24)
88	read32(f25)
89	read32(f26)
90	read32(f27)
91	read32(f28)
92	read32(f29)
93	read32(f30)
94	read32(f31)
95
96/* void write_f32(int regnum, uint32_t* v)
97 *    regnum: which register want to write
98 *    v : address to hold bits info of writing
99 */
100	.align	1
101	.globl write_f32
102write_f32:
103	la	a2, .Lw32_t
104	andi	a0, a0, 31
105	slli	a0, a0, 1
106	add	a0, a0, a2
107	lbu	a0, 0(a0)
108	add	a0, a0, a2
109	jr	a0
110	.align	2
111.Lw32_t:
112	.half	.Lw32_f0  - .Lw32_t
113	.half	.Lw32_f1  - .Lw32_t
114	.half	.Lw32_f2  - .Lw32_t
115	.half	.Lw32_f3  - .Lw32_t
116	.half	.Lw32_f4  - .Lw32_t
117	.half	.Lw32_f5  - .Lw32_t
118	.half	.Lw32_f6  - .Lw32_t
119	.half	.Lw32_f7  - .Lw32_t
120	.half	.Lw32_f8  - .Lw32_t
121	.half	.Lw32_f9  - .Lw32_t
122	.half	.Lw32_f10 - .Lw32_t
123	.half	.Lw32_f11 - .Lw32_t
124	.half	.Lw32_f12 - .Lw32_t
125	.half	.Lw32_f13 - .Lw32_t
126	.half	.Lw32_f14 - .Lw32_t
127	.half	.Lw32_f15 - .Lw32_t
128	.half	.Lw32_f16 - .Lw32_t
129	.half	.Lw32_f17 - .Lw32_t
130	.half	.Lw32_f18 - .Lw32_t
131	.half	.Lw32_f19 - .Lw32_t
132	.half	.Lw32_f20 - .Lw32_t
133	.half	.Lw32_f21 - .Lw32_t
134	.half	.Lw32_f22 - .Lw32_t
135	.half	.Lw32_f23 - .Lw32_t
136	.half	.Lw32_f24 - .Lw32_t
137	.half	.Lw32_f25 - .Lw32_t
138	.half	.Lw32_f26 - .Lw32_t
139	.half	.Lw32_f27 - .Lw32_t
140	.half	.Lw32_f28 - .Lw32_t
141	.half	.Lw32_f29 - .Lw32_t
142	.half	.Lw32_f30 - .Lw32_t
143	.half	.Lw32_f31 - .Lw32_t
144#define write32(which)	.Lw32_##which: flw which, 0(a1); ret
145	write32(f0)
146	write32(f1)
147	write32(f2)
148	write32(f3)
149	write32(f4)
150	write32(f5)
151	write32(f6)
152	write32(f7)
153	write32(f8)
154	write32(f9)
155	write32(f10)
156	write32(f11)
157	write32(f12)
158	write32(f13)
159	write32(f14)
160	write32(f15)
161	write32(f16)
162	write32(f17)
163	write32(f18)
164	write32(f19)
165	write32(f20)
166	write32(f21)
167	write32(f22)
168	write32(f23)
169	write32(f24)
170	write32(f25)
171	write32(f26)
172	write32(f27)
173	write32(f28)
174	write32(f29)
175	write32(f30)
176	write32(f31)
177#endif // __riscv_flen >= 32
178
179#if __riscv_flen >= 64
180
181	.text
182
183/* void read_f64(int regnum, uint64_t* v)
184 *    regnum : which register want to read
185 *    v : address to hold bits info of reading
186 */
187	.align	1
188	.globl read_f64
189read_f64:
190	la	a2, .Lr64_t
191	andi	a0, a0, 31
192	slli	a0, a0, 1
193	add	a0, a0, a2
194	lbu	a0, 0(a0)
195	add	a0, a0, a2
196	jr	a0
197	.align	2
198.Lr64_t:
199	.half	.Lr64_f0  - .Lr64_t
200	.half	.Lr64_f1  - .Lr64_t
201	.half	.Lr64_f2  - .Lr64_t
202	.half	.Lr64_f3  - .Lr64_t
203	.half	.Lr64_f4  - .Lr64_t
204	.half	.Lr64_f5  - .Lr64_t
205	.half	.Lr64_f6  - .Lr64_t
206	.half	.Lr64_f7  - .Lr64_t
207	.half	.Lr64_f8  - .Lr64_t
208	.half	.Lr64_f9  - .Lr64_t
209	.half	.Lr64_f10 - .Lr64_t
210	.half	.Lr64_f11 - .Lr64_t
211	.half	.Lr64_f12 - .Lr64_t
212	.half	.Lr64_f13 - .Lr64_t
213	.half	.Lr64_f14 - .Lr64_t
214	.half	.Lr64_f15 - .Lr64_t
215	.half	.Lr64_f16 - .Lr64_t
216	.half	.Lr64_f17 - .Lr64_t
217	.half	.Lr64_f18 - .Lr64_t
218	.half	.Lr64_f19 - .Lr64_t
219	.half	.Lr64_f20 - .Lr64_t
220	.half	.Lr64_f21 - .Lr64_t
221	.half	.Lr64_f22 - .Lr64_t
222	.half	.Lr64_f23 - .Lr64_t
223	.half	.Lr64_f24 - .Lr64_t
224	.half	.Lr64_f25 - .Lr64_t
225	.half	.Lr64_f26 - .Lr64_t
226	.half	.Lr64_f27 - .Lr64_t
227	.half	.Lr64_f28 - .Lr64_t
228	.half	.Lr64_f29 - .Lr64_t
229	.half	.Lr64_f30 - .Lr64_t
230	.half	.Lr64_f31 - .Lr64_t
231#define  read64(which)	.Lr64_##which: fsd which, 0(a1); ret
232	read64(f0)
233	read64(f1)
234	read64(f2)
235	read64(f3)
236	read64(f4)
237	read64(f5)
238	read64(f6)
239	read64(f7)
240	read64(f8)
241	read64(f9)
242	read64(f10)
243	read64(f11)
244	read64(f12)
245	read64(f13)
246	read64(f14)
247	read64(f15)
248	read64(f16)
249	read64(f17)
250	read64(f18)
251	read64(f19)
252	read64(f20)
253	read64(f21)
254	read64(f22)
255	read64(f23)
256	read64(f24)
257	read64(f25)
258	read64(f26)
259	read64(f27)
260	read64(f28)
261	read64(f29)
262	read64(f30)
263	read64(f31)
264
265/* void write_f64(int regnum, uint64_t* v)
266 *    regnum: which register want to write
267 *    v : address to hold bits info of writing
268 */
269	.align	1
270	.globl write_f64
271write_f64:
272	la	a2, .Lw64_t
273	andi	a0, a0, 31
274	slli	a0, a0, 1
275	add	a0, a0, a2
276	lbu	a0, 0(a0)
277	add	a0, a0, a2
278	jr	a0
279	.align	2
280.Lw64_t:
281	.half	.Lw64_f0  - .Lw64_t
282	.half	.Lw64_f1  - .Lw64_t
283	.half	.Lw64_f2  - .Lw64_t
284	.half	.Lw64_f3  - .Lw64_t
285	.half	.Lw64_f4  - .Lw64_t
286	.half	.Lw64_f5  - .Lw64_t
287	.half	.Lw64_f6  - .Lw64_t
288	.half	.Lw64_f7  - .Lw64_t
289	.half	.Lw64_f8  - .Lw64_t
290	.half	.Lw64_f9  - .Lw64_t
291	.half	.Lw64_f10 - .Lw64_t
292	.half	.Lw64_f11 - .Lw64_t
293	.half	.Lw64_f12 - .Lw64_t
294	.half	.Lw64_f13 - .Lw64_t
295	.half	.Lw64_f14 - .Lw64_t
296	.half	.Lw64_f15 - .Lw64_t
297	.half	.Lw64_f16 - .Lw64_t
298	.half	.Lw64_f17 - .Lw64_t
299	.half	.Lw64_f18 - .Lw64_t
300	.half	.Lw64_f19 - .Lw64_t
301	.half	.Lw64_f20 - .Lw64_t
302	.half	.Lw64_f21 - .Lw64_t
303	.half	.Lw64_f22 - .Lw64_t
304	.half	.Lw64_f23 - .Lw64_t
305	.half	.Lw64_f24 - .Lw64_t
306	.half	.Lw64_f25 - .Lw64_t
307	.half	.Lw64_f26 - .Lw64_t
308	.half	.Lw64_f27 - .Lw64_t
309	.half	.Lw64_f28 - .Lw64_t
310	.half	.Lw64_f29 - .Lw64_t
311	.half	.Lw64_f30 - .Lw64_t
312	.half	.Lw64_f31 - .Lw64_t
313#define write64(which)	.Lw64_##which: fld which, 0(a1); ret
314	write64(f0)
315	write64(f1)
316	write64(f2)
317	write64(f3)
318	write64(f4)
319	write64(f5)
320	write64(f6)
321	write64(f7)
322	write64(f8)
323	write64(f9)
324	write64(f10)
325	write64(f11)
326	write64(f12)
327	write64(f13)
328	write64(f14)
329	write64(f15)
330	write64(f16)
331	write64(f17)
332	write64(f18)
333	write64(f19)
334	write64(f20)
335	write64(f21)
336	write64(f22)
337	write64(f23)
338	write64(f24)
339	write64(f25)
340	write64(f26)
341	write64(f27)
342	write64(f28)
343	write64(f29)
344	write64(f30)
345	write64(f31)
346
347#endif // __riscv_flen >= 64
348
349#endif // defined(__riscv_flen)
350