Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

aarch64: Use VCodeConstant for f64/v128 constants #5997

Merged

Conversation

alexcrichton
Copy link
Member

As was pointed out recently one minor improvement to the AArch64 backend is to use the same infrastructure that x64 uses for loading constants which is to pool them at the end of the function instead of having them inline in the body. This commit implements this strategy to ensure that fallback shuffle instructions, for example, don't generate a branch instruction to skip over immediates.

Additionally in these commits is a refactoring of float/splat lowering in the aarch64 backend. Previously it was all living in Rust but to get to know it I translated it all to ISLE. I felt that the logic was a bit more understandable after the transition and more easily shows off what all the special cases are (the problem is more well-suited for ISLE I think than Rust, nothing against the prior code of course which was perfectly readable).

I was looking into `constant_f128` and its fallback lowering into memory
and to get familiar with the code I figured it'd be good to port some
Rust logic to ISLE. This commit ports the `constant_{f128,f64,f32}`
helpers into ISLE from Rust as well as the `splat_const` helper which
ended up being closely related.

Tests reflect a number of regalloc changes that happened but also namely
one major difference is that in the lowering of `f32` a 32-bit immediate
is created now instead of a 64-bit immediate (in a GP register before
it's moved into a FP register). This semantically has no change but the
generated code is slightly different in a few minor cases.
This commit removes the `LoadFpuConst64` and `LoadFpuConst128`
pseudo-instructions from the AArch64 backend which internally loaded a
nearby constant and then jumped over it. Constants now go through the
`VCodeConstant` infrastructure which gets placed at the end of the
function similar to how x64 works. Some minor support was added in as
well to add a new addressing mode for a `MachLabel`-relative load.
@github-actions github-actions bot added cranelift Issues related to the Cranelift code generator cranelift:area:aarch64 Issues related to AArch64 backend. cranelift:area:x64 Issues related to x64 codegen labels Mar 12, 2023
Copy link
Member

@fitzgen fitzgen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@alexcrichton alexcrichton added this pull request to the merge queue Mar 13, 2023
Merged via the queue into bytecodealliance:main with commit 03b5dbb Mar 13, 2023
@alexcrichton alexcrichton deleted the aarch64-constant-pool branch March 13, 2023 20:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cranelift:area:aarch64 Issues related to AArch64 backend. cranelift:area:x64 Issues related to x64 codegen cranelift Issues related to the Cranelift code generator
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants