Skip to content

Commit

Permalink
cmd/go, cmd/cgo: pass -mfp32 and -mhard/soft-float to MIPS GCC
Browse files Browse the repository at this point in the history
For mips32 currently, we are using FP32, while the gcc may be FPXX,
which may generate .MIPS.abiflags and .gnu.attributes section with
value as FPXX. So the kernel will treat the exe as FPXX, and may
choose to use FR=1 FPU mode for it.
Currently, in Go, we use 2 lwc1 to load both half of a double value
to a pair of even-odd FPR. This behavior can only work with FR=0 mode.

In FR=1 mode, all of 32 FPR are 64bit. If we lwc1 the high-half of a double
value to an odd FPR, and try to use the previous even FPR to compute, the
real high-half of even FPR will be unpredicatable.
We set -mfp32 to force the gcc generate FP32 code and section value.

More details about FP32/FPXX/FP64 are explained in:
https://web.archive.org/web/20180828210612/https://dmz-portal.mips.com/wiki/MIPS_O32_ABI_-_FR0_and_FR1_Interlinking

When GOMIPS/GOMIPS64 is set as softfloat, we should also pass
 -msoft-float to gcc.

Here we also add -mno-odd-spreg option, since Loongson's CPU cannot use
odd-number FR in FR=0 mode.

Fixes #39435

Change-Id: I54026ad416a815fe43a9261ebf6d02e5519c3930
Reviewed-on: https://go-review.googlesource.com/c/go/+/237058
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Meng Zhuo <mzh@golangcn.org>
  • Loading branch information
wzssyqa authored and cherrymui committed Feb 24, 2021
1 parent 07c6583 commit b97b145
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
12 changes: 10 additions & 2 deletions src/cmd/cgo/gcc.go
Original file line number Diff line number Diff line change
Expand Up @@ -1566,9 +1566,17 @@ func (p *Package) gccMachine() []string {
case "s390x":
return []string{"-m64"}
case "mips64", "mips64le":
return []string{"-mabi=64"}
if gomips64 == "hardfloat" {
return []string{"-mabi=64", "-mhard-float"}
} else if gomips64 == "softfloat" {
return []string{"-mabi=64", "-msoft-float"}
}
case "mips", "mipsle":
return []string{"-mabi=32"}
if gomips == "hardfloat" {
return []string{"-mabi=32", "-mfp32", "-mhard-float", "-mno-odd-spreg"}
} else if gomips == "softfloat" {
return []string{"-mabi=32", "-msoft-float"}
}
}
return nil
}
Expand Down
4 changes: 3 additions & 1 deletion src/cmd/cgo/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ var importRuntimeCgo = flag.Bool("import_runtime_cgo", true, "import runtime/cgo
var importSyscall = flag.Bool("import_syscall", true, "import syscall in generated code")
var trimpath = flag.String("trimpath", "", "applies supplied rewrites or trims prefixes to recorded source file paths")

var goarch, goos string
var goarch, goos, gomips, gomips64 string

func main() {
objabi.AddVersionFlag() // -V
Expand Down Expand Up @@ -405,6 +405,8 @@ func newPackage(args []string) *Package {
if s := os.Getenv("GOOS"); s != "" {
goos = s
}
gomips = objabi.GOMIPS
gomips64 = objabi.GOMIPS64
ptrSize := ptrSizeMap[goarch]
if ptrSize == 0 {
fatalf("unknown ptrSize for $GOARCH %q", goarch)
Expand Down
14 changes: 12 additions & 2 deletions src/cmd/go/internal/work/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -2599,9 +2599,19 @@ func (b *Builder) gccArchArgs() []string {
case "s390x":
return []string{"-m64", "-march=z196"}
case "mips64", "mips64le":
return []string{"-mabi=64"}
args := []string{"-mabi=64"}
if cfg.GOMIPS64 == "hardfloat" {
return append(args, "-mhard-float")
} else if cfg.GOMIPS64 == "softfloat" {
return append(args, "-msoft-float")
}
case "mips", "mipsle":
return []string{"-mabi=32", "-march=mips32"}
args := []string{"-mabi=32", "-march=mips32"}
if cfg.GOMIPS == "hardfloat" {
return append(args, "-mhard-float", "-mfp32", "-mno-odd-spreg")
} else if cfg.GOMIPS == "softfloat" {
return append(args, "-msoft-float")
}
case "ppc64":
if cfg.Goos == "aix" {
return []string{"-maix64"}
Expand Down

0 comments on commit b97b145

Please sign in to comment.