]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.14] runtime: don't save/restore FP registers in softfloat mode...
authorCherry Zhang <cherryyz@google.com>
Wed, 4 Mar 2020 16:14:53 +0000 (11:14 -0500)
committerAlexander Rakoczy <alex@golang.org>
Tue, 10 Mar 2020 19:00:12 +0000 (19:00 +0000)
Fixes #37667.
Updates #37653.

Change-Id: I6188e44b4bc4aba7b56f29d9ce9de4618c70fd7b
Reviewed-on: https://go-review.googlesource.com/c/go/+/222057
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
(cherry picked from commit 588ee7987d7f6be605166872ff8c478aa125bc58)
Reviewed-on: https://go-review.googlesource.com/c/go/+/222062

src/runtime/mkpreempt.go
src/runtime/preempt_mips64x.s
src/runtime/preempt_mipsx.s

index c26406e55f1af971ffc554fd5a98f375e2b097ca..35ed42871f11dfef02ce02d951cbe85ce7740ccb 100644 (file)
@@ -382,6 +382,7 @@ func genMIPS(_64bit bool) {
        sub := "SUB"
        r28 := "R28"
        regsize := 4
+       softfloat := "GOMIPS_softfloat"
        if _64bit {
                mov = "MOVV"
                movf = "MOVD"
@@ -389,6 +390,7 @@ func genMIPS(_64bit bool) {
                sub = "SUBV"
                r28 = "RSB"
                regsize = 8
+               softfloat = "GOMIPS64_softfloat"
        }
 
        // Add integer registers R1-R22, R24-R25, R28
@@ -411,28 +413,36 @@ func genMIPS(_64bit bool) {
                mov+" LO, R1\n"+mov+" R1, %d(R29)",
                mov+" %d(R29), R1\n"+mov+" R1, LO",
                regsize)
+
        // Add floating point control/status register FCR31 (FCR0-FCR30 are irrelevant)
-       l.addSpecial(
+       var lfp = layout{sp: "R29", stack: l.stack}
+       lfp.addSpecial(
                mov+" FCR31, R1\n"+mov+" R1, %d(R29)",
                mov+" %d(R29), R1\n"+mov+" R1, FCR31",
                regsize)
        // Add floating point registers F0-F31.
        for i := 0; i <= 31; i++ {
                reg := fmt.Sprintf("F%d", i)
-               l.add(movf, reg, regsize)
+               lfp.add(movf, reg, regsize)
        }
 
        // allocate frame, save PC of interrupted instruction (in LR)
-       p(mov+" R31, -%d(R29)", l.stack)
-       p(sub+" $%d, R29", l.stack)
+       p(mov+" R31, -%d(R29)", lfp.stack)
+       p(sub+" $%d, R29", lfp.stack)
 
        l.save()
+       p("#ifndef %s", softfloat)
+       lfp.save()
+       p("#endif")
        p("CALL ·asyncPreempt2(SB)")
+       p("#ifndef %s", softfloat)
+       lfp.restore()
+       p("#endif")
        l.restore()
 
-       p(mov+" %d(R29), R31", l.stack)     // sigctxt.pushCall has pushed LR (at interrupt) on stack, restore it
-       p(mov + " (R29), R23")              // load PC to REGTMP
-       p(add+" $%d, R29", l.stack+regsize) // pop frame (including the space pushed by sigctxt.pushCall)
+       p(mov+" %d(R29), R31", lfp.stack)     // sigctxt.pushCall has pushed LR (at interrupt) on stack, restore it
+       p(mov + " (R29), R23")                // load PC to REGTMP
+       p(add+" $%d, R29", lfp.stack+regsize) // pop frame (including the space pushed by sigctxt.pushCall)
        p("JMP (R23)")
 }
 
index 8048a87cd3a10461be07fb99b21d13df0e3252d0..1e123e80773aa840168b640b9dbeea62ba0d0031 100644 (file)
@@ -37,6 +37,7 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVV R1, 208(R29)
        MOVV LO, R1
        MOVV R1, 216(R29)
+       #ifndef GOMIPS64_softfloat
        MOVV FCR31, R1
        MOVV R1, 224(R29)
        MOVD F0, 232(R29)
@@ -71,7 +72,9 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVD F29, 464(R29)
        MOVD F30, 472(R29)
        MOVD F31, 480(R29)
+       #endif
        CALL ·asyncPreempt2(SB)
+       #ifndef GOMIPS64_softfloat
        MOVD 480(R29), F31
        MOVD 472(R29), F30
        MOVD 464(R29), F29
@@ -106,6 +109,7 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVD 232(R29), F0
        MOVV 224(R29), R1
        MOVV R1, FCR31
+       #endif
        MOVV 216(R29), R1
        MOVV R1, LO
        MOVV 208(R29), R1
index 840e86149712bbfca5bf69786e75373cd2c3e5fc..afac33e0a03e911193f37919a524fcda035bb87e 100644 (file)
@@ -37,6 +37,7 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVW R1, 104(R29)
        MOVW LO, R1
        MOVW R1, 108(R29)
+       #ifndef GOMIPS_softfloat
        MOVW FCR31, R1
        MOVW R1, 112(R29)
        MOVF F0, 116(R29)
@@ -71,7 +72,9 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVF F29, 232(R29)
        MOVF F30, 236(R29)
        MOVF F31, 240(R29)
+       #endif
        CALL ·asyncPreempt2(SB)
+       #ifndef GOMIPS_softfloat
        MOVF 240(R29), F31
        MOVF 236(R29), F30
        MOVF 232(R29), F29
@@ -106,6 +109,7 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVF 116(R29), F0
        MOVW 112(R29), R1
        MOVW R1, FCR31
+       #endif
        MOVW 108(R29), R1
        MOVW R1, LO
        MOVW 104(R29), R1