Skip to content

cmd/internal/obj/arm64,internal/cpu,runtime: add FEAT_MOPS support#79993

Open
mauri870 wants to merge 1 commit into
golang:masterfrom
mauri870:arm64-mops-asm
Open

cmd/internal/obj/arm64,internal/cpu,runtime: add FEAT_MOPS support#79993
mauri870 wants to merge 1 commit into
golang:masterfrom
mauri870:arm64-mops-asm

Conversation

@mauri870

@mauri870 mauri870 commented Jun 13, 2026

Copy link
Copy Markdown
Member

DO NOT REVIEW
DO NOT SUBMIT

FEAT_MOPS (Memory Operations) is an ARM extension introduced as
optional in Armv8.7 and mandatory from Armv8.8 onwards. It provides
CPY{P,M,E} and SET{P,M,E} instruction sequences for hardware-accelerated
memory copy and memory zeroing.

This change adds assembler support for the CPY and SET instruction
families:

CPYP/CPYM/CPYE (Xs), Xn, (Xd) - memory copy
SETP/SETM/SETE Xs, Xn, (Xd) - memory set

It also adds ARM64.HasMOPS detection to internal/cpu via HWCAP2 on
Linux, and fast paths in the runtime for large operations when the
feature is available at runtime: memmove uses CPY{P,M,E} for copies
larger than 256 bytes, and memclrNoHeapPointers uses SET{P,M,E} for
zeroing larger than 512 bytes. The differing thresholds follow clang's
own codegen behaviour for variable-size operations of each kind.

For #79994

@gopherbot

Copy link
Copy Markdown
Contributor

This PR (HEAD: 987fb18) has been imported to Gerrit for code review.

Please visit Gerrit at https://go-review.googlesource.com/c/go/+/790322.

Important tips:

  • Don't comment on this PR. All discussion takes place in Gerrit.
  • You need a Gmail or other Google account to log in to Gerrit.
  • To change your code in response to feedback:
    • Push a new commit to the branch used by your GitHub PR.
    • A new "patch set" will then appear in Gerrit.
    • Respond to each comment by marking as Done in Gerrit if implemented as suggested. You can alternatively write a reply.
    • Critical: you must click the blue Reply button near the top to publish your Gerrit responses.
    • Multiple commits in the PR will be squashed by GerritBot.
  • The title and description of the GitHub PR are used to construct the final commit message.
    • Edit these as needed via the GitHub web interface (not via Gerrit or git).
    • You should word wrap the PR description at ~76 characters unless you need longer lines (e.g., for tables or URLs).
  • See the Sending a change via GitHub and Reviews sections of the Contribution Guide as well as the FAQ for details.

@mauri870 mauri870 force-pushed the arm64-mops-asm branch 2 times, most recently from 0c691be to 719ac8e Compare June 13, 2026 00:47
@gopherbot

Copy link
Copy Markdown
Contributor

Message from Gopher Robot:

Patch Set 1:

(1 comment)


Please don’t reply on this GitHub thread. Visit golang.org/cl/790322.
After addressing review feedback, remember to publish your drafts!

@gopherbot

Copy link
Copy Markdown
Contributor

This PR (HEAD: 719ac8e) has been imported to Gerrit for code review.

Please visit Gerrit at https://go-review.googlesource.com/c/go/+/790322.

Important tips:

  • Don't comment on this PR. All discussion takes place in Gerrit.
  • You need a Gmail or other Google account to log in to Gerrit.
  • To change your code in response to feedback:
    • Push a new commit to the branch used by your GitHub PR.
    • A new "patch set" will then appear in Gerrit.
    • Respond to each comment by marking as Done in Gerrit if implemented as suggested. You can alternatively write a reply.
    • Critical: you must click the blue Reply button near the top to publish your Gerrit responses.
    • Multiple commits in the PR will be squashed by GerritBot.
  • The title and description of the GitHub PR are used to construct the final commit message.
    • Edit these as needed via the GitHub web interface (not via Gerrit or git).
    • You should word wrap the PR description at ~76 characters unless you need longer lines (e.g., for tables or URLs).
  • See the Sending a change via GitHub and Reviews sections of the Contribution Guide as well as the FAQ for details.

@gopherbot

Copy link
Copy Markdown
Contributor

This PR (HEAD: 3c15b31) has been imported to Gerrit for code review.

Please visit Gerrit at https://go-review.googlesource.com/c/go/+/790322.

Important tips:

  • Don't comment on this PR. All discussion takes place in Gerrit.
  • You need a Gmail or other Google account to log in to Gerrit.
  • To change your code in response to feedback:
    • Push a new commit to the branch used by your GitHub PR.
    • A new "patch set" will then appear in Gerrit.
    • Respond to each comment by marking as Done in Gerrit if implemented as suggested. You can alternatively write a reply.
    • Critical: you must click the blue Reply button near the top to publish your Gerrit responses.
    • Multiple commits in the PR will be squashed by GerritBot.
  • The title and description of the GitHub PR are used to construct the final commit message.
    • Edit these as needed via the GitHub web interface (not via Gerrit or git).
    • You should word wrap the PR description at ~76 characters unless you need longer lines (e.g., for tables or URLs).
  • See the Sending a change via GitHub and Reviews sections of the Contribution Guide as well as the FAQ for details.

@gopherbot

Copy link
Copy Markdown
Contributor

Message from Mauri de Souza Meneguzzo:

Patch Set 2:

(1 comment)


Please don’t reply on this GitHub thread. Visit golang.org/cl/790322.
After addressing review feedback, remember to publish your drafts!

@mauri870 mauri870 changed the title cmd/internal/obj/arm64,internal/cpu: add FEAT_MOPS assembler support cmd/internal/obj/arm64,internal/cpu,runtime: add FEAT_MOPS support Jun 13, 2026
FEAT_MOPS (Memory Operations) is an ARM extension introduced as
optional in Armv8.7 and mandatory from Armv8.8 onwards. It provides
CPY{P,M,E} and SET{P,M,E} instruction sequences for hardware-accelerated
memory copy and memory zeroing.

This change adds assembler support for the CPY and SET instruction
families:

  CPYP/CPYM/CPYE (Xs), Xn, (Xd)  - memory copy
  SETP/SETM/SETE Xs, Xn, (Xd)    - memory set

It also adds ARM64.HasMOPS detection to internal/cpu via HWCAP2 on
Linux, and fast paths in the runtime for large operations when the
feature is available at runtime: memmove uses CPY{P,M,E} for copies
larger than 256 bytes, and memclrNoHeapPointers uses SET{P,M,E} for
zeroing larger than 512 bytes. The differing thresholds follow clang's
own codegen behaviour for variable-size operations of each kind.
@gopherbot

Copy link
Copy Markdown
Contributor

This PR (HEAD: 9d60671) has been imported to Gerrit for code review.

Please visit Gerrit at https://go-review.googlesource.com/c/go/+/790322.

Important tips:

  • Don't comment on this PR. All discussion takes place in Gerrit.
  • You need a Gmail or other Google account to log in to Gerrit.
  • To change your code in response to feedback:
    • Push a new commit to the branch used by your GitHub PR.
    • A new "patch set" will then appear in Gerrit.
    • Respond to each comment by marking as Done in Gerrit if implemented as suggested. You can alternatively write a reply.
    • Critical: you must click the blue Reply button near the top to publish your Gerrit responses.
    • Multiple commits in the PR will be squashed by GerritBot.
  • The title and description of the GitHub PR are used to construct the final commit message.
    • Edit these as needed via the GitHub web interface (not via Gerrit or git).
    • You should word wrap the PR description at ~76 characters unless you need longer lines (e.g., for tables or URLs).
  • See the Sending a change via GitHub and Reviews sections of the Contribution Guide as well as the FAQ for details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants