]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: restore SSE guard in asyncPreempt on 386
authorCherry Zhang <cherryyz@google.com>
Wed, 7 Oct 2020 02:07:15 +0000 (22:07 -0400)
committerCherry Zhang <cherryyz@google.com>
Wed, 7 Oct 2020 14:57:54 +0000 (14:57 +0000)
So we don't use SSE instructions under GO386=softfloat.

Change-Id: I8ecc92340ee567f84a22501df2543ec041d25ef2
Reviewed-on: https://go-review.googlesource.com/c/go/+/260137
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/mkpreempt.go
src/runtime/preempt_386.s

index 40683bb9d9b36f3dbf38132def70f5c9ca3cbd3e..76237bc31b3dd1fa034affa41c21e7861e411d5d 100644 (file)
@@ -189,26 +189,34 @@ func (l *layout) restore() {
 
 func gen386() {
        p("PUSHFL")
-
-       // Assign stack offsets.
+       // Save general purpose registers.
        var l = layout{sp: "SP"}
        for _, reg := range regNames386 {
-               if reg == "SP" {
+               if reg == "SP" || strings.HasPrefix(reg, "X") {
                        continue
                }
-               if strings.HasPrefix(reg, "X") {
-                       l.add("MOVUPS", reg, 16)
-               } else {
-                       l.add("MOVL", reg, 4)
-               }
+               l.add("MOVL", reg, 4)
        }
 
-       p("ADJSP $%d", l.stack)
+       // Save SSE state only if supported.
+       lSSE := layout{stack: l.stack, sp: "SP"}
+       for i := 0; i < 8; i++ {
+               lSSE.add("MOVUPS", fmt.Sprintf("X%d", i), 16)
+       }
+
+       p("ADJSP $%d", lSSE.stack)
        p("NOP SP")
        l.save()
+       p("CMPB internal∕cpu·X86+const_offsetX86HasSSE2(SB), $1\nJNE nosse")
+       lSSE.save()
+       label("nosse:")
        p("CALL ·asyncPreempt2(SB)")
+       p("CMPB internal∕cpu·X86+const_offsetX86HasSSE2(SB), $1\nJNE nosse2")
+       lSSE.restore()
+       label("nosse2:")
        l.restore()
-       p("ADJSP $%d", -l.stack)
+       p("ADJSP $%d", -lSSE.stack)
+
        p("POPFL")
        p("RET")
 }
index 5c9b8ea224ae9488099f7789abc47f65b7dd194c..c3a5fa1f361cfb28c653c27c2f764b54031c7aaf 100644 (file)
@@ -14,6 +14,8 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVL BP, 16(SP)
        MOVL SI, 20(SP)
        MOVL DI, 24(SP)
+       CMPB internal∕cpu·X86+const_offsetX86HasSSE2(SB), $1
+       JNE nosse
        MOVUPS X0, 28(SP)
        MOVUPS X1, 44(SP)
        MOVUPS X2, 60(SP)
@@ -22,7 +24,10 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVUPS X5, 108(SP)
        MOVUPS X6, 124(SP)
        MOVUPS X7, 140(SP)
+nosse:
        CALL ·asyncPreempt2(SB)
+       CMPB internal∕cpu·X86+const_offsetX86HasSSE2(SB), $1
+       JNE nosse2
        MOVUPS 140(SP), X7
        MOVUPS 124(SP), X6
        MOVUPS 108(SP), X5
@@ -31,6 +36,7 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
        MOVUPS 60(SP), X2
        MOVUPS 44(SP), X1
        MOVUPS 28(SP), X0
+nosse2:
        MOVL 24(SP), DI
        MOVL 20(SP), SI
        MOVL 16(SP), BP