1/* Ksqrtf.s 1.3 86/01/05 */ 2 3#include "../tahoe/SYS.h" 4 5 .text 6ENTRY(Ksqrtf, 0) 7 subl3 $76,fp,sp 8 tstl 4(fp) # if (arg <= 0.) { 9 jgtr L18 10 jgeq L19 # if (arg < 0.) 11L19: clrl r1 12 clrl r0 13 ret # return(0.);} 14L18: 15 pushl 20(fp) # hfs 16 subl3 $72,fp,-(sp) 17 pushl 8(fp) 18 pushl 4(fp) 19 callf $20,_Kfrexpf 20 clrl -60+4(fp) 21 movl r0,-60(fp) # x = frexp(arg,&exp); 22 jbr L20 23L2000001: 24 pushl 20(fp) # hfs 25 ldd two 26 pushd 27 ldd -60(fp) 28 pushd 29 callf $24,_Kmuld # x * 2 30 ldd r0 31 std -60(fp) # x *= 2; 32 decl -72(fp) # exp--;} 33L20: cmpd2 -60(fp),half # while(x < 0.5){ 34 jlss L2000001 35 bitl $1,-72(fp) # if(exp & 1) { 36 jeql L24 37 pushl 20(fp) # hfs 38 ldd two 39 pushd 40 ldd -60(fp) 41 pushd 42 callf $24,_Kmuld # x * 2 43 ldd r0 44 std -60(fp) # x *= 2; 45 decl -72(fp) # exp--;} 46L24: pushl 20(fp) # hfs 47 ldd -60(fp) 48 pushd 49 ldd one 50 pushd 51 callf $24,_Kaddd # (1.0+x) 52 pushl 20(fp) # hfs 53 ldd r0 54 pushd 55 ldd half 56 pushd 57 callf $24,_Kmuld 58 ldd r0 59 std -68(fp) # temp=0.5*(1.0+x); 60 jbr L28 61L2000003: 62 pushl 20(fp) # hfs 63 ldd big 64 pushd 65 ldd -68(fp) 66 pushd 67 callf $24,_Kmuld # temp*(1L<<30) 68 ldd r0 69 std -68(fp) # temp *=(1L<<30); 70 subl2 $60,-72(fp) # exp -= 60;} 71L28: cmpl -72(fp),$60 # while(exp > 60){ 72 jleq L31 73 jbr L2000003 74L2000005: 75 pushl 20(fp) # hfs 76 ldd big 77 pushd 78 ldd -68(fp) 79 pushd 80 callf $24,_Kdivd 81 ldd r0 82 std -68(fp) # temp /= (1L<<30); 83 addl2 $60,-72(fp) # exp +=60;} 84L31: cmpl -72(fp),$-60 # while(exp < -60) { 85 jlss L2000005 86 tstl -72(fp) # if(exp >=0) 87 jlss L34 88 divl3 $2,-72(fp),r0 89 shll r0,$1,r0 90 pushl 20(fp) # hfs 91 pushl $0 92 pushl r0 93 pushl $0 94 pushl $0 95 callf $24,_Kcvtld 96 pushl 20(fp) # hfs 97 ldd r0 98 pushd 99 ldd -68(fp) 100 pushd 101 callf $24,_Kmuld # temp * (1L <<(exp/2)) 102 jbr L2000006 # temp *= 1L << (exp/2)); 103L34: mnegl -72(fp),r0 # -exp 104 divl2 $2,r0 # -exp/2 105 shll r0,$1,r0 106 pushl 20(fp) # hfs 107 pushl $0 108 pushl r0 109 pushl $0 110 pushl $0 111 callf $24,_Kcvtld 112 pushl 20(fp) # hfs 113 ldd r0 114 pushd 115 ldd -68(fp) 116 pushd 117 callf $24,_Kdivd # temp / (1L <<(-exp/2)) 118L2000006: 119 ldd r0 120 std -68(fp) # temp (*/)= 1L << (exp/2)); 121 clrl -76(fp) 122L2000008: 123 pushl 20(fp) # hfs 124 ldd -68(fp) 125 pushd 126 ldd 4(fp) 127 pushd 128 callf $24,_Kdivd 129 pushl 20(fp) # hfs 130 ldd r0 131 pushd 132 ldd -68(fp) 133 pushd 134 callf $24,_Kaddd 135 pushl 20(fp) # hfs 136 ldd r0 137 pushd 138 ldd half 139 pushd 140 callf $24,_Kmuld 141 ldd r0 142 std -68(fp) # temp=0.5*(temp+arg/temp); 143 aobleq $3,-76(fp),L2000008 144 ldd -68(fp) 145 cvdf 146 stf r0 147 ret 148 149 .data 150 .align 2 151half: .long 0x40000000, 0x00000000 # .double .5 152two: .long 0x41000000, 0x00000000 # .double 2 153one: .long 0x40800000, 0x00000000 # .double 1 154big: .long 0x4F800000, 0x00000000 # .double (1<<30) 155