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")
}