cmd/compile: factor out code to generate equal func

So next CL can use it for generating equal func during walk compare.

Passes toolstash-check.

Change-Id: I76545c1d471eb496be352908db1b05feae83fc33
Reviewed-on: https://go-review.googlesource.com/c/go/+/436435
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
diff --git a/src/cmd/compile/internal/reflectdata/alg.go b/src/cmd/compile/internal/reflectdata/alg.go
index c04de83..1a8b768 100644
--- a/src/cmd/compile/internal/reflectdata/alg.go
+++ b/src/cmd/compile/internal/reflectdata/alg.go
@@ -342,17 +342,27 @@
 	if len(closure.P) > 0 { // already generated
 		return closure
 	}
-	sym := TypeSymPrefix(".eq", t)
+
 	if base.Flag.LowerR != 0 {
 		fmt.Printf("geneq %v\n", t)
 	}
 
+	fn := eqFunc(t)
+
+	// Generate a closure which points at the function we just generated.
+	objw.SymPtr(closure, 0, fn.Linksym(), 0)
+	objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
+	return closure
+}
+
+func eqFunc(t *types.Type) *ir.Func {
 	// Autogenerate code for equality of structs and arrays.
 
 	base.Pos = base.AutogeneratedPos // less confusing than end of input
 	typecheck.DeclContext = ir.PEXTERN
 
 	// func sym(p, q *T) bool
+	sym := TypeSymPrefix(".eq", t)
 	fn := typecheck.DeclFunc(sym, nil,
 		[]*ir.Field{ir.NewField(base.Pos, typecheck.Lookup("p"), types.NewPtr(t)), ir.NewField(base.Pos, typecheck.Lookup("q"), types.NewPtr(t))},
 		[]*ir.Field{ir.NewField(base.Pos, typecheck.Lookup("r"), types.Types[types.TBOOL])},
@@ -554,11 +564,7 @@
 	// are shallow.
 	fn.SetNilCheckDisabled(true)
 	typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
-
-	// Generate a closure which points at the function we just generated.
-	objw.SymPtr(closure, 0, fn.Linksym(), 0)
-	objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA)
-	return closure
+	return fn
 }
 
 func anyCall(fn *ir.Func) bool {