150472Speter/* $OpenBSD: e_sqrt.c,v 1.7 2016/09/12 19:47:02 guenther Exp $ */ 228263Spst 3183242Ssam/* 428263Spst * Written by Martynas Venckus. Public domain 5254975Sjlh */ 6254978Sjkim 7183242Ssam#include <sys/types.h> 8223209Sed#include <math.h> 9223209Sed 10223209Sed#define FPSCR_PR (1 << 19) 11223209Sed#define FPSCR_SZ (1 << 20) 12223209Sed 13223209Seddouble 1428263Spstsqrt(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} 34DEF_STD(sqrt); 35LDBL_CLONE(sqrt); 36