]> git.ipfire.org Git - thirdparty/gcc.git/commit
aarch64: Prevent streaming-compatible code from assembler rejection [PR121028]
authorSpencer Abson <spencer.abson@arm.com>
Thu, 31 Jul 2025 14:07:31 +0000 (14:07 +0000)
committerSpencer Abson <spencer.abson@arm.com>
Thu, 31 Jul 2025 14:21:08 +0000 (14:21 +0000)
commitb3da1801bef08c75f69f4376ffa05f1de2591ca8
treed8f0f1827b7e10198ea16e0b526fd12f5e98b25d
parent9e84a4552dd90ad2d15bd56ea168d945b4b71b98
aarch64: Prevent streaming-compatible code from assembler rejection [PR121028]

Streaming-compatible functions can be compiled without SME enabled, but need
to use "SMSTART SM" and "SMSTOP SM" to temporarily switch into the streaming
state of a callee.  These switches are conditional on the current mode being
opposite to the target mode, so no SME instructions are executed if SME is not
available.

However, in GAS, "SMSTART SM" and "SMSTOP SM" always require +sme.  A call
from a streaming-compatible function, compiled without SME enabled, to a non
-streaming function will be rejected as:

Error: selected processor does not support `smstop sm'..

To work around this, we make use of the .inst directive to insert the literal
encodings of "SMSTART SM" and "SMSTOP SM".

gcc/ChangeLog:
PR target/121028
* config/aarch64/aarch64-sme.md (aarch64_smstart_sm): Use the .inst
directive if !TARGET_SME.
(aarch64_smstop_sm): Likewise.

gcc/testsuite/ChangeLog:
PR target/121028
* gcc.target/aarch64/sme/call_sm_switch_1.c: Tell check-function
-bodies not to ignore .inst directives, and replace the test for
"smstart sm" with one for it's encoding.
* gcc.target/aarch64/sme/call_sm_switch_11.c: Likewise.
* gcc.target/aarch64/sme/pr121028.c: New test.

(cherry picked from commit d52e9ef98bb30872482a46e7a2ec6a20c3ca4a4c)
gcc/config/aarch64/aarch64-sme.md
gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_1.c
gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_11.c
gcc/testsuite/gcc.target/aarch64/sme/pr121028.c [new file with mode: 0644]