;
; sqrt.s
;
; Fast square root routines
;
;  1995-1998 Straylight
;

;----- Licensing note -------------------------------------------------------
;
; This file is part of Straylight's Sapphire library.
;
; Sapphire is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2, or (at your option)
; any later version.
;
; Sapphire is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Sapphire.  If not, write to the Free Software Foundation,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

;----- Standard header ------------------------------------------------------

		GET	libs:header
		GET	libs:swis

		GET	libs:stream

;----- Main code ------------------------------------------------------------

		AREA	|Sapphire$$Code|,CODE,READONLY

; --- sqrt ---
;
; On entry:	R0 == value to square-root
;
; On exit:	R0 == the result
;
; Use:		Evaluates the square root of the number given.  This routine
;		is constructed from the information supplied by David Seal,
;		and is *extremely* fast.

		EXPORT	sqrt
sqrt		ROUT

		STMFD	R13!,{R1-R4,R14}	;Stack registers
		MOV	R1,#0			;Result so far
		MOV	R2,#0			;Current remainder
		MOV	R3,#1			;A '01' pair
		MOV	R4,#3			;A nice mask

		GBLA	count
count		SETA	0			;Start the count at 30

		WHILE	count<=28		;Set up the loop condition

		AND	R14,R4,R0,LSR #30-count
		ORR	R2,R14,R2,LSL #2
		ORR	R14,R3,R1,LSL #2
		CMP	R2,R14
		ADC	R1,R1,R1
		SUBCS	R2,R2,R14

count		SETA	count+2

		WEND

		AND	R14,R4,R0
		ORR	R2,R14,R2,LSL #2
		ORR	R14,R3,R1,LSL #2
		CMP	R2,R14
		ADC	R1,R1,R1
		SUBCS	R2,R2,R14

c		MOV	R0,R1			;Put the result in R0
		LDMFD	R13!,{R1-R4,PC}^	;Return to caller

		LTORG

;----- That's all, folks ----------------------------------------------------

		END
