|
|
1.1 ! root 1: # ! 2: # Copyright (c) 1980 Regents of the University of California. ! 3: # All rights reserved. The Berkeley software License Agreement ! 4: # specifies the terms and conditions for redistribution. ! 5: # ! 6: # @(#)sqrt.s 5.1 (Berkeley) 5/8/85 ! 7: # ! 8: # ! 9: # double sqrt(arg):revised July 18,1980 ! 10: # double arg ! 11: # if(arg<0.0) { _errno=EDOM; return(-sqrt(-arg)) } ! 12: # W. Kahan's magic sqrt ! 13: # coded by Heidi Stettner ! 14: ! 15: .set EDOM,98 ! 16: .text ! 17: .align 1 ! 18: .globl _sqrt ! 19: .globl dsqrt_r5 ! 20: .globl _errno ! 21: _sqrt: ! 22: .word 0x003c # save r5,r4,r3,r2 ! 23: bispsw $0xe0 ! 24: movd 4(ap),r0 ! 25: bsbb dsqrt_r5 ! 26: ret ! 27: dsqrt_r5: ! 28: movd r0,r4 ! 29: jleq nonpos #argument is not positive ! 30: movzwl r4,r2 ! 31: ashl $-1,r2,r0 ! 32: addw2 $0x203c,r0 #r0 has magic initial appx ! 33: ! 34: # Do two steps of Heron's rule ! 35: ! 36: divf3 r0,r4,r2 ! 37: addf2 r2,r0 ! 38: subw2 $0x80,r0 ! 39: ! 40: divf3 r0,r4,r2 ! 41: addf2 r2,r0 ! 42: subw2 $0x80,r0 ! 43: ! 44: ! 45: # Scale argument and approximation to prevent over/underflow ! 46: # NOTE: The following four steps would not be necessary if underflow ! 47: # were gentle. ! 48: ! 49: bicw3 $0xffff807f,r4,r1 ! 50: subw2 $0x4080,r1 # r1 contains scaling factor ! 51: subw2 r1,r4 ! 52: movl r0,r2 ! 53: subw2 r1,r2 ! 54: ! 55: # Cubic step ! 56: ! 57: clrl r1 ! 58: clrl r3 ! 59: muld2 r0,r2 ! 60: subd2 r2,r4 ! 61: addw2 $0x100,r2 ! 62: addd2 r4,r2 ! 63: muld2 r0,r4 ! 64: divd2 r2,r4 ! 65: addw2 $0x80,r4 ! 66: addd2 r4,r0 ! 67: rsb ! 68: nonpos: ! 69: jneq negarg ! 70: clrd r0 #argument is zero ! 71: rsb ! 72: negarg: ! 73: movl $EDOM,_errno ! 74: mnegd r4,-(sp) ! 75: calls $2,_sqrt ! 76: mnegd r0,r0 # returns -sqrt(-arg) ! 77: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.