18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/types.h>
38c2ecf20Sopenharmony_ci#include <linux/errno.h>
48c2ecf20Sopenharmony_ci#include <linux/uaccess.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <asm/sfp-machine.h>
78c2ecf20Sopenharmony_ci#include <math-emu/soft-fp.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciint
108c2ecf20Sopenharmony_cimcrfs(u32 *ccr, u32 crfD, u32 crfS)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	u32 value, clear;
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#ifdef DEBUG
158c2ecf20Sopenharmony_ci	printk("%s: %p (%08x) %d %d\n", __func__, ccr, *ccr, crfD, crfS);
168c2ecf20Sopenharmony_ci#endif
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	clear = 15 << ((7 - crfS) << 2);
198c2ecf20Sopenharmony_ci	if (!crfS)
208c2ecf20Sopenharmony_ci		clear = 0x90000000;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	value = (__FPU_FPSCR >> ((7 - crfS) << 2)) & 15;
238c2ecf20Sopenharmony_ci	__FPU_FPSCR &= ~(clear);
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	*ccr &= ~(15 << ((7 - crfD) << 2));
268c2ecf20Sopenharmony_ci	*ccr |= (value << ((7 - crfD) << 2));
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#ifdef DEBUG
298c2ecf20Sopenharmony_ci	printk("CR: %08x\n", __func__, *ccr);
308c2ecf20Sopenharmony_ci#endif
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	return 0;
338c2ecf20Sopenharmony_ci}
34