<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8" -->

---
title: Arch-specific SIMD in Go | daily.dev
description: Go 1.27 extends the experimental SIMD support introduced in Go 1.26 (amd64 only) to arm64 (NEON, with SVE/SVE2 in progress) and wasm (128-bit SIMD), via the...
canonical: https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Arch-specific SIMD in Go | daily.dev
og:description: Go 1.27 extends the experimental SIMD support introduced in Go 1.26 (amd64 only) to arm64 (NEON, with SVE/SVE2 in progress) and wasm (128-bit SIMD), via the...
og:url: https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8
og:image: https://api.daily.dev/og/posts/ZPiZVEyj8.png
og:image:alt: Arch-specific SIMD in Go
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Arch-specific SIMD in Go

**[Go](https://daily.dev/sources/golang)** · 14 min read · 8 upvotes · 0 comments

## Summary

Go 1.27 extends the experimental SIMD support introduced in Go 1.26 (amd64 only) to arm64 (NEON, with SVE/SVE2 in progress) and wasm (128-bit SIMD), via the new simd/archsimd package enabled with GOEXPERIMENT=simd. The archsimd API offers a lower-level, architecture-specific intrinsics layer beneath the portable simd package, with sensible naming conventions, zero-cost type reinterpretation, opaque mask types, and compiler peepholing of masked operations into single instructions. The post covers API design decisions, detailed code examples (bit reversal via GaloisFieldAffineTransform, 8x8 matrix transpose using AVX2), and best practices around CPU feature checks, bounds-check elimination in strided loops, and avoiding large composite types to keep vectors in registers. Future plans include completing SVE/SVE2 support and expanding to riscv64, ppc64, s390x, and loong64.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://go.dev/blog/archsimd>

## Questions this post answers

### What architectures does the archsimd package support in Go 1.27?

Go 1.27 adds arm64 (NEON, with SVE and SVE2 partially available) and wasm (128-bit SIMD) support to the experimental simd/archsimd package, in addition to the amd64 support introduced in Go 1.26. The API is enabled by building with GOEXPERIMENT=simd, and amd64 remains the most complete, covering AVX, AVX2, and several AVX-512 extensions.

_Developers evaluating low-level SIMD in Go can track archsimd's architecture rollout on daily.dev before committing code to it._

### How do I avoid SIGILL crashes when using Go's archsimd package on hardware without certain SIMD extensions?

Guard SIMD code with runtime CPU feature checks such as archsimd.X86.AVX512GFNI(), archsimd.X86.AVX2(), or archsimd.ARM64.SVE() before executing instructions tied to optional extensions. Without this guard, the binary can crash with SIGILL on machines lacking that instruction, and the compiler also uses these checks as optimization hints to fuse operations like masked adds into a single instruction.

_Teams shipping SIMD-accelerated Go code can keep tabs on these gotchas through daily.dev before they hit production._

### Why does Transpose8 in Go's archsimd take 8 separate vector parameters instead of an array or struct?

Passing 8 individual archsimd.Int32x8 parameters keeps each vector in a register rather than spilling to memory, because Go's ABI and SSA backend currently place large composite types like arrays or structs in memory rather than registers (tracked as issue #24416). Since SIMD vectors are 16 to 64 bytes each, spilling them to the stack costs far more performance than spilling scalar values, so hot-loop code should avoid wrapping vectors in composite types.

_Developers optimizing hot loops in Go can follow these register-allocation nuances via daily.dev as the SIMD API matures._

## Similar posts on daily.dev

- [Platform-independent SIMD in Go](https://daily.dev/posts/platform-independent-simd-in-go-ymat2hnb8) · Go · 22 upvotes · 1 comments
- [Go's Improving SIMD Support, Platform-Independent SIMD Interface](https://daily.dev/posts/go-s-improving-simd-support-platform-independent-simd-interface-nvfoxnysf) · Phoronix · 6 upvotes · 0 comments
- [Issue \#619: Go 1.27's portable SIMD — Go Weekly](https://daily.dev/posts/issue-619-go-1-27-s-portable-simd-go-weekly-ldnl4glb2) · Golang Weekly · 4 upvotes · 0 comments

---

Tags: [#performance](https://daily.dev/tags/performance), [#golang](https://daily.dev/tags/golang), [#webassembly](https://daily.dev/tags/webassembly), [#compiler-optimization](https://daily.dev/tags/compiler-optimization)

[View this post on daily.dev](https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Arch-specific SIMD in Go","url":"https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8"},"datePublished":"2026-10-02T20:52:43.349Z","dateModified":"2026-10-02T20:53:07.452Z","description":"Go 1.27 extends the experimental SIMD support introduced in Go 1.26 (amd64 only) to arm64 (NEON, with SVE/SVE2 in progress) and wasm (128-bit SIMD), via the...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/39b837b91d435ac673a1daa7b32a05fa?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/39b837b91d435ac673a1daa7b32a05fa?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Go","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Go","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/f416aeab0a1f4b9faa22d93768c97905","url":"https://daily.dev/sources/golang"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":8},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"performance,golang,webassembly,compiler-optimization","timeRequired":"PT14M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Go","item":"https://daily.dev/sources/golang"},{"@type":"ListItem","position":3,"name":"Arch-specific SIMD in Go"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/arch-specific-simd-in-go-zpizveyj8#faq","mainEntity":[{"@type":"Question","name":"What architectures does the archsimd package support in Go 1.27?","acceptedAnswer":{"@type":"Answer","text":"Go 1.27 adds arm64 (NEON, with SVE and SVE2 partially available) and wasm (128-bit SIMD) support to the experimental simd/archsimd package, in addition to the amd64 support introduced in Go 1.26. The API is enabled by building with GOEXPERIMENT=simd, and amd64 remains the most complete, covering AVX, AVX2, and several AVX-512 extensions. Developers evaluating low-level SIMD in Go can track archsimd's architecture rollout on daily.dev before committing code to it."}},{"@type":"Question","name":"How do I avoid SIGILL crashes when using Go's archsimd package on hardware without certain SIMD extensions?","acceptedAnswer":{"@type":"Answer","text":"Guard SIMD code with runtime CPU feature checks such as archsimd.X86.AVX512GFNI(), archsimd.X86.AVX2(), or archsimd.ARM64.SVE() before executing instructions tied to optional extensions. Without this guard, the binary can crash with SIGILL on machines lacking that instruction, and the compiler also uses these checks as optimization hints to fuse operations like masked adds into a single instruction. Teams shipping SIMD-accelerated Go code can keep tabs on these gotchas through daily.dev before they hit production."}},{"@type":"Question","name":"Why does Transpose8 in Go's archsimd take 8 separate vector parameters instead of an array or struct?","acceptedAnswer":{"@type":"Answer","text":"Passing 8 individual archsimd.Int32x8 parameters keeps each vector in a register rather than spilling to memory, because Go's ABI and SSA backend currently place large composite types like arrays or structs in memory rather than registers (tracked as issue #24416). Since SIMD vectors are 16 to 64 bytes each, spilling them to the stack costs far more performance than spilling scalar values, so hot-loop code should avoid wrapping vectors in composite types. Developers optimizing hot loops in Go can follow these register-allocation nuances via daily.dev as the SIMD API matures."}}]}
```

