"cmd/compile/internal/ssagen"
"cmd/compile/internal/typecheck"
"cmd/compile/internal/types"
+ "cmd/internal/objabi"
"cmd/internal/sys"
)
return false
}
+ // Helper to determine whether a given type (when passed to a
+ // function) will fit into a single integer register, assuming
+ // that the reg abi is in effect. This is somewhat ad-hoc, there
+ // may be a cleaner way to do this.
+ fitsInSingleIntReg := func(t *types.Type) bool {
+ return from.IsScalar() || types.IsDirectIface(from)
+ }
+
tkind := to.Tie()
switch from.Tie() {
case 'I':
return "convT32", false
case from.Size() == 8 && isFloatLike(from):
return "convT64F", false
- case from.Size() == 8 && from.Align == types.Types[types.TUINT64].Align && !from.HasPointers():
+ case from.Size() == 8 && from.Align == types.Types[types.TUINT64].Align && !from.HasPointers() && (!objabi.Experiment.RegabiArgs || fitsInSingleIntReg(from)):
return "convT64", false
}
if sc := from.SoleComponent(); sc != nil {
--- /dev/null
+// run
+
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "fmt"
+)
+
+type MyStruct struct {
+ F0 [0]float64
+ F1 byte
+ F2 int16
+ _ struct {
+ F0 uint32
+ }
+}
+
+func main() {
+ p0 := MyStruct{F0: [0]float64{}, F1: byte(27), F2: int16(9887)}
+ fmt.Println(p0)
+}