aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mkpreempt.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-10-06 22:07:15 -0400
committerCherry Zhang <cherryyz@google.com>2020-10-07 14:57:54 +0000
commit67edc0ed81947a55adbcd0c9d2317abb93ac9510 (patch)
tree807e89bed84352b1db0b4eb71d39193b08b3eb94 /src/runtime/mkpreempt.go
parentc19725016df2600a204c9f8447bfcb7dcbdb128a (diff)
downloadgo-67edc0ed81947a55adbcd0c9d2317abb93ac9510.tar.gz
go-67edc0ed81947a55adbcd0c9d2317abb93ac9510.zip
runtime: restore SSE guard in asyncPreempt on 386
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>
Diffstat (limited to 'src/runtime/mkpreempt.go')
-rw-r--r--src/runtime/mkpreempt.go28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/runtime/mkpreempt.go b/src/runtime/mkpreempt.go
index 40683bb9d9..76237bc31b 100644
--- a/src/runtime/mkpreempt.go
+++ b/src/runtime/mkpreempt.go
@@ -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")
}