diff options
Diffstat (limited to 'src/pkg')
| -rw-r--r-- | src/pkg/math/Makefile | 3 | ||||
| -rw-r--r-- | src/pkg/math/sqrt_arm.s | 10 | ||||
| -rw-r--r-- | src/pkg/math/sqrt_port.go | 4 | ||||
| -rw-r--r-- | src/pkg/runtime/arm/softfloat.c | 9 |
4 files changed, 26 insertions, 0 deletions
diff --git a/src/pkg/math/Makefile b/src/pkg/math/Makefile index 71347b7fa1..8e8e74ae4c 100644 --- a/src/pkg/math/Makefile +++ b/src/pkg/math/Makefile @@ -6,6 +6,9 @@ include ../../Make.inc TARG=math +OFILES_arm=\ + sqrt_arm.$O\ + OFILES_amd64=\ exp_amd64.$O\ fabs_amd64.$O\ diff --git a/src/pkg/math/sqrt_arm.s b/src/pkg/math/sqrt_arm.s new file mode 100644 index 0000000000..befbb8a898 --- /dev/null +++ b/src/pkg/math/sqrt_arm.s @@ -0,0 +1,10 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// func Sqrt(x float64) float64 +TEXT ·Sqrt(SB),7,$0 + MOVD x+0(FP),F0 + SQRTD F0,F0 + MOVD F0,r+8(FP) + RET diff --git a/src/pkg/math/sqrt_port.go b/src/pkg/math/sqrt_port.go index 83af255bf1..148239bcff 100644 --- a/src/pkg/math/sqrt_port.go +++ b/src/pkg/math/sqrt_port.go @@ -141,3 +141,7 @@ func sqrtGo(x float64) float64 { ix = q>>1 + uint64(exp-1+bias)<<shift // significand + biased exponent return Float64frombits(ix) } + +func sqrtGoC(f float64, r *float64) { + *r = sqrtGo(f) +} diff --git a/src/pkg/runtime/arm/softfloat.c b/src/pkg/runtime/arm/softfloat.c index f91a6fc09b..c5da888743 100644 --- a/src/pkg/runtime/arm/softfloat.c +++ b/src/pkg/runtime/arm/softfloat.c @@ -357,6 +357,15 @@ stage3: // regd, regm are 4bit variables regd, regm, m->freghi[regd], m->freglo[regd]); break; + case 0xeeb10bc0: // D[regd] = sqrt D[regm] + math·sqrtGoC(getd(regm), &uval); + putd(regd, uval); + + if(trace) + runtime·printf("*** D[%d] = sqrt D[%d] %x-%x\n", + regd, regm, m->freghi[regd], m->freglo[regd]); + break; + case 0xeeb40bc0: // D[regd] :: D[regm] (CMPD) runtime·fcmp64c(getd(regd), getd(regm), &cmp, &nan); m->fflag = fstatus(nan, cmp); |
