#2104·gonum

internal/asm/c64: AMD64 DotcInc 和 DotuInc 标量尾部读取 16 个字节,用于处理一个复杂 64

作者: jamestjsp创建于 2026年9月8日更新于 2026年9月8日

func TestUpstreamDotTail(t *testing.T) { for _, conjugate := range []bool{false, true} { name := "DotuInc" if conjugate { name = "DotcInc" } t.Run(name, func(t testing.T) { page := syscall.Getpagesize() mem, err := syscall.Mmap(-1, 0, 2page, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE) if err != nil { t.Fatal(err) } defer syscall.Munmap(mem) if err := syscall.Mprotect(mem[page:], syscall.PROT_NONE); err != nil { t.Fatal(err) } y := unsafe.Slice((*complex64)(unsafe.Pointer(&mem[page-8])), 1) y[0] = 3 + 4i x := []complex64{1 + 2i} got, want := complex64(0), complex64(-5+10i) if conjugate { got = c64.DotcInc(x, y, 1, 1, 1, 0, 0) want = 11 - 2i } else { got = c64.DotuInc(x, y, 1, 1, 1, 0, 0) } runtime.KeepAlive(mem) if got != want { t.Fatalf("got %v want %v", got, want) } }) } }


ASM may terminate the process; use `ulimit -c 0`. Verification: source audited; noasm control passed on darwin/arm64, Go 1.27.1. Fresh native AMD64 execution not yet verified.