xref: /openbsd/lib/libm/arch/sh/e_sqrt.c (revision a6445c1d)
1 /*	$OpenBSD: e_sqrt.c,v 1.6 2014/04/18 15:09:52 guenther Exp $	*/
2 
3 /*
4  * Written by Martynas Venckus.  Public domain
5  */
6 
7 #include <sys/types.h>
8 #include <math.h>
9 
10 #define	FPSCR_PR	(1 << 19)
11 #define	FPSCR_SZ	(1 << 20)
12 
13 double
14 sqrt(double d)
15 {
16 	register_t fpscr, nfpscr;
17 
18 	__asm__ volatile ("sts fpscr, %0" : "=r" (fpscr));
19 
20 	/* Set floating-point mode to double-precision. */
21 	nfpscr = fpscr | FPSCR_PR;
22 
23 	/* Do not set SZ and PR to 1 simultaneously. */
24 	nfpscr &= ~FPSCR_SZ;
25 
26 	__asm__ volatile ("lds %0, fpscr" : : "r" (nfpscr));
27 	__asm__ volatile ("fsqrt %0" : "+f" (d));
28 
29 	/* Restore fp status/control register. */
30 	__asm__ volatile ("lds %0, fpscr" : : "r" (fpscr));
31 
32 	return (d);
33 }
34 
35 __strong_alias(sqrtl,sqrt);
36