-
Russ Cox authored
It's okay to preempt at ordinary function calls because compilers arrange that there are no live registers to save on entry to the function call. The software floating point routines are function calls masquerading as individual machine instructions. They are expected to keep all the registers intact. In particular, they are expected not to clobber all the floating point registers. The floating point registers are kept per-M, because they are not live at non-preemptive goroutine scheduling events, and so keeping them per-M reduces the number of 132-byte register blocks we are keeping in memory. Because they are per-M, allowing the goroutine to be rescheduled during software floating point simulation would mean some other goroutine could overwrite the registers or perhaps the goroutine would continue running on a different M entirely. Disallow preemption during the software floating point routines to make sure that a function full of floating point instructions has the same floating point registers throughout its execution. R=golang-dev, dave CC=golang-dev https://golang.org/cl/12298043
e03dd079