diff options
author | Cherry Zhang <cherryyz@google.com> | 2020-10-06 22:07:15 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2020-10-07 14:57:54 +0000 |
commit | 67edc0ed81947a55adbcd0c9d2317abb93ac9510 (patch) | |
tree | 807e89bed84352b1db0b4eb71d39193b08b3eb94 /src/runtime/mkpreempt.go | |
parent | c19725016df2600a204c9f8447bfcb7dcbdb128a (diff) | |
download | go-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.go | 28 |
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") } |