;/*** ;*isqrt.a - square root ;* ;* Copyright (c) 1991-1991, Microsoft Corporation. All rights reserved. ;* ;*Purpose: ;* Square root to be used with M68K version ;* ;*Revision History: ;* 11-05-92 XY intrinsic version based on sqrt.a ;* ;*******************************************************************************/ #include #ifdef SANE #include #endif externW _errno ;double sqrt(double x) cProc _CIsqrt,PUBLIC localW fpstat localW xtestw cBegin _CIsqrt #ifdef SANE movem.l , -(a7) pea fpstat move.w #FOPROCENTRY,-(a7) FP68K ;save current status & set default control btst #7, (a0) ifne move.l #33, _errno move.w #0, (a0) move.l #0, 2(a0) move.l #0, 6(a0) ; return 0 for negative jra to_end endif move.l a0, -(a7) move.w #FOSQRT,-(a7) FP68K ;sqrt x to_end: pea fpstat move.w #FOPROCEXIT,-(a7) FP68K ;set result status & restore control movem.l (a7)+, #else fmove.l fpcr,d0 ftst.x fp0 ;see if it is a valid number fmove.l fpsr, d1 ;get status word and.l #0x0b007c00, d1 ;see if we get a negative or an exception cmp.l #0, d1 ifneq jbsr __Domain_error ; if not equal, domain error endif fmove.l #0,fpcr fsqrt.x fp0 fmove.l d0,fpcr #endif cEnd _CIsqrt