feat(asm): assemble static symbols and the whole go-flac AVX2 kernel byte-identically
Assisted-by: Qwen 3.8 Max Preview
This commit is contained in:
+38
-19
@@ -26,7 +26,7 @@ import (
|
||||
|
||||
// version is the release version, stamped at build time via
|
||||
// -ldflags "-X main.version=…" (defaulting to the current release).
|
||||
var version = "0.3.0"
|
||||
var version = "0.4.0"
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
@@ -238,20 +238,18 @@ func cmdAsm(args []string) int {
|
||||
return 1
|
||||
}
|
||||
|
||||
var all []byte
|
||||
functions := 0
|
||||
for _, d := range f.Decls {
|
||||
txt, ok := d.(*ast.Text)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
code, _, err := asm.Assemble(txt)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%s: %s: %v\n", path, txt.Name.Name, err)
|
||||
return 1
|
||||
}
|
||||
functions++
|
||||
fmt.Printf("%s: %d bytes\n", txt.Name.Name, len(code))
|
||||
img, err := asm.AssembleFile(f)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%s: %v\n", path, err)
|
||||
return 1
|
||||
}
|
||||
if len(img.Funcs) == 0 {
|
||||
fmt.Fprintln(os.Stderr, "gasm asm: no assemblable TEXT functions found")
|
||||
return 1
|
||||
}
|
||||
for _, fn := range img.Funcs {
|
||||
code := img.Code[fn.Offset : fn.Offset+fn.Size]
|
||||
fmt.Printf("%s: %d bytes\n", fn.Name, fn.Size)
|
||||
for i := 0; i < len(code); i += 16 {
|
||||
end := i + 16
|
||||
if end > len(code) {
|
||||
@@ -263,13 +261,34 @@ func cmdAsm(args []string) int {
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
all = append(all, code...)
|
||||
}
|
||||
if functions == 0 {
|
||||
fmt.Fprintln(os.Stderr, "gasm asm: no assemblable TEXT functions found")
|
||||
return 1
|
||||
if len(img.Data) > 0 {
|
||||
fmt.Printf("data: %d bytes at 0x%x\n", len(img.Data), len(img.Code))
|
||||
for _, d := range f.Decls {
|
||||
g, ok := d.(*ast.Globl)
|
||||
if !ok || g.Name == nil || g.Name.Pseudo != "SB" {
|
||||
continue
|
||||
}
|
||||
size := 0
|
||||
if g.Size != nil && g.Size.Imm.HasVal {
|
||||
size = int(g.Size.Imm.Val)
|
||||
}
|
||||
fmt.Printf(" %s: %d bytes at 0x%x\n", g.Name.Name, size, img.Symbols[g.Name.Name])
|
||||
}
|
||||
for i := 0; i < len(img.Data); i += 16 {
|
||||
end := i + 16
|
||||
if end > len(img.Data) {
|
||||
end = len(img.Data)
|
||||
}
|
||||
fmt.Printf(" %04x:", len(img.Code)+i)
|
||||
for _, b := range img.Data[i:end] {
|
||||
fmt.Printf(" %02x", b)
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
if *out != "" {
|
||||
all := img.Bytes()
|
||||
if err := os.WriteFile(*out, all, 0o644); err != nil {
|
||||
fmt.Fprintln(os.Stderr, "gasm asm:", err)
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user