On Tue, Apr 25, 2023 at 10:57 AM Sam Vilain <s...@vilain.net> wrote: > > (a) where can I find how this specific optimization is defined?
It's in the compiler. It's not especially easy to pull it out. In this specific case, it's something like cmd/compile/internal/ssagen/ssa.go: addF("math/bits", "TrailingZeros64", func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz64, types.Types[types.TINT], args[0]) }, sys.AMD64, sys.I386, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) cmd/compile/internal/ssa/_gen/AMD64.rules: (Ctz64 x) && buildcfg.GOAMD64 >= 3 => (TZCNTQ x) cmd/compile/internal/ssa/_gen/AMD64Ops.go: // count the number of trailing zero bits, prefer TZCNTQ over BSFQ, as TZCNTQ(0)==64 // and BSFQ(0) is undefined. Same for TZCNTL(0)==32 {name: "TZCNTQ", argLength: 1, reg: gp11, asm: "TZCNTQ", clobberFlags: true}, > (b) is it possible to write assembly functions that avoid the wrapper code, > assuming that one follows the platform's calling convention? Go uses its own calling convention. There is an internal register-based ABI, but I don't think it's stable. See https://go.googlesource.com/proposal/+/refs/heads/master/design/40724-register-calling.md. Ian -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAOyqgcXbQR1j2qqqqgnKn0267nyFFMBfPsOhyfsj1%2BQzupzJTw%40mail.gmail.com.