xref: /openbmc/linux/arch/powerpc/math-emu/mtfsf.c (revision 22246614)
1 #include <linux/types.h>
2 #include <linux/errno.h>
3 #include <asm/uaccess.h>
4 
5 #include "soft-fp.h"
6 
7 int
8 mtfsf(unsigned int FM, u32 *frB)
9 {
10 	u32 mask;
11 
12 	if (FM == 0)
13 		return 0;
14 
15 	if (FM == 0xff)
16 		mask = 0x9fffffff;
17 	else {
18 		mask = 0;
19 		if (FM & (1 << 0))
20 			mask |= 0x90000000;
21 		if (FM & (1 << 1))
22 			mask |= 0x0f000000;
23 		if (FM & (1 << 2))
24 			mask |= 0x00f00000;
25 		if (FM & (1 << 3))
26 			mask |= 0x000f0000;
27 		if (FM & (1 << 4))
28 			mask |= 0x0000f000;
29 		if (FM & (1 << 5))
30 			mask |= 0x00000f00;
31 		if (FM & (1 << 6))
32 			mask |= 0x000000f0;
33 		if (FM & (1 << 7))
34 			mask |= 0x0000000f;
35 	}
36 
37 	__FPU_FPSCR &= ~(mask);
38 	__FPU_FPSCR |= (frB[1] & mask);
39 
40 #ifdef DEBUG
41 	printk("%s: %02x %p: %08lx\n", __func__, FM, frB, __FPU_FPSCR);
42 #endif
43 
44 	return 0;
45 }
46