c backend: fix some inline assembly constraints #23794
Open
+142
−23
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds supports for:
+
as an output constraint=&{rax}
did not produce valid c code)How the last one works: when an input specifies a register which is in the clobber list, I remove said register from the clobber list and input for the input list, and add a new output, marked as
+r
, and creates a new variable that copy the value.So, this zig code
produces for the main function
So, if the assembly uses
in
as a clobber, it will only change the local variable and not the actual variable.I have not found a better way to go through the list of clobbers than adding multiple loops ...
By the way, is there a way to add tests for that ?
Also if someone could fix the x86 backend to support
%=
. I believe it could as simple as adding a counter that increments each time an inline assembly block is lowered to assembly, but I am not confident enough to edit that part of the codebase.