]> Cypherpunks repositories - gostls13.git/commitdiff
math: add sqrt_arm.s and sqrtGoC.go as fallback to soft fp emulation
authorFan Hongjian <fan.howard@gmail.com>
Thu, 9 Jun 2011 21:19:08 +0000 (17:19 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 9 Jun 2011 21:19:08 +0000 (17:19 -0400)
5a: add SQRTF and SQRTD
5l: add ASQRTF and ASQRTD

Use ARMv7 VFP VSQRT instruction to speed up math.Sqrt

R=rsc, dave, m
CC=golang-dev
https://golang.org/cl/4551082

src/cmd/5a/lex.c
src/cmd/5l/5.out.h
src/cmd/5l/asm.c
src/cmd/5l/obj.c
src/cmd/5l/softfloat.c
src/cmd/5l/span.c
src/pkg/math/Makefile
src/pkg/math/sqrt_arm.s [new file with mode: 0644]
src/pkg/math/sqrt_port.go
src/pkg/runtime/arm/softfloat.c

index a04cda2201aeda13baee478a94bb4175dcb74b05..3978f1a6c13353a011bb5ee0660ab33a3b6db96d 100644 (file)
@@ -338,6 +338,8 @@ struct
        "NRMD",         LTYPEI, ANRMD,
 */
 
+       "SQRTF",        LTYPEI, ASQRTF,
+       "SQRTD",        LTYPEI, ASQRTD,
        "CMPF",         LTYPEL, ACMPF,
        "CMPD",         LTYPEL, ACMPD,
        "ADDF",         LTYPEK, AADDF,
index 002b46d451bdb1933eb06afdd1ad3878606f14b9..bdc2c956f843c6c943e8394aad25e3f36537e117 100644 (file)
@@ -126,6 +126,8 @@ enum        as
        AMULD,
        ADIVF,
        ADIVD,
+       ASQRTF,
+       ASQRTD,
 
        ASRL,
        ASRA,
index 011e7f8424cbce65dfe202449510babd435fb24c..8dfcd946102d9e56e7525c2749e80fa86d99edb7 100644 (file)
@@ -1186,7 +1186,7 @@ if(debug['G']) print("%ux: %s: arm %d %d %d\n", (uint32)(p->pc), p->from.sym->na
                r = p->reg;
                if(r == NREG) {
                        r = rt;
-                       if(p->as == AMOVF || p->as == AMOVD)
+                       if(p->as == AMOVF || p->as == AMOVD || p->as == ASQRTF || p->as == ASQRTD)
                                r = 0;
                }
                o1 |= rf | (r<<16) | (rt<<12);
@@ -1620,6 +1620,8 @@ oprrr(int a, int sc)
        case AMULF:     return o | (0xe<<24) | (0x2<<20) | (0xa<<8) | (0<<4);
        case ADIVD:     return o | (0xe<<24) | (0x8<<20) | (0xb<<8) | (0<<4);
        case ADIVF:     return o | (0xe<<24) | (0x8<<20) | (0xa<<8) | (0<<4);
+       case ASQRTD:    return o | (0xe<<24) | (0xb<<20) | (1<<16) | (0xb<<8) | (0xc<<4);
+       case ASQRTF:    return o | (0xe<<24) | (0xb<<20) | (1<<16) | (0xa<<8) | (0xc<<4);
        case ACMPD:     return o | (0xe<<24) | (0xb<<20) | (4<<16) | (0xb<<8) | (0xc<<4);
        case ACMPF:     return o | (0xe<<24) | (0xb<<20) | (4<<16) | (0xa<<8) | (0xc<<4);
 
index 96ba0010fa25463c6550b99027646107fdce9f67..2089e8f0bd30b61cd683a2bb2b035dab339aeb29 100644 (file)
@@ -67,6 +67,7 @@ static char*
 linkername[] =
 {
        "runtime.softfloat",
+       "math.sqrtGoC",
 };
 
 void
index 03d8c6d26223df5cf01707b45022dab5598807d8..4f799d17ee6f136ebbd40c34fd8e561fd71905ab 100644 (file)
@@ -54,6 +54,8 @@ softfloat(void)
                        case AMULD:
                        case ADIVF:
                        case ADIVD:
+                       case ASQRTF:
+                       case ASQRTD:
                                goto soft;
 
                        default:
index 4067f1a3270962c0c0bd0798818b577f0e0f49a2..0fe31059761e418d9741db47ee40b0e97814a980 100644 (file)
@@ -1023,6 +1023,8 @@ buildop(void)
                        oprange[AMULD] = oprange[r];
                        oprange[ADIVF] = oprange[r];
                        oprange[ADIVD] = oprange[r];
+                       oprange[ASQRTF] = oprange[r];
+                       oprange[ASQRTD] = oprange[r];
                        oprange[AMOVFD] = oprange[r];
                        oprange[AMOVDF] = oprange[r];
                        break;
index 71347b7fa1cc5582506584b7ffe8e4efdd443f3b..8e8e74ae4cf6b419e7eafd9859a6f4a0d48c4dc8 100644 (file)
@@ -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 (file)
index 0000000..befbb8a
--- /dev/null
@@ -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
index 83af255bf18f46b435fc15b584289c7073889f92..148239bcff660c5bc6f546bee1170db53b3a7a73 100644 (file)
@@ -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)
+}
index f91a6fc09b73f0756147d436ecb7fcbaa46f66e4..c5da888743d2363d529978f7724c1f179d88e5ae 100644 (file)
@@ -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);