aarch64: Use VCodeConstant for f64/v128 constants (#5997)
* aarch64: Translate float and splat lowering to ISLE
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.
* aarch64: Load f64/v128 constants from a pool
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.
This commit is contained in:
@@ -80,6 +80,11 @@ macro_rules! isle_common_prelude_methods {
|
||||
x ^ y
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn u64_shl(&mut self, x: u64, y: u64) -> u64 {
|
||||
x << y
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn imm64_shl(&mut self, ty: Type, x: Imm64, y: Imm64) -> Imm64 {
|
||||
// Mask off any excess shift bits.
|
||||
@@ -502,8 +507,8 @@ macro_rules! isle_common_prelude_methods {
|
||||
}
|
||||
}
|
||||
|
||||
fn u64_from_ieee32(&mut self, val: Ieee32) -> u64 {
|
||||
val.bits().into()
|
||||
fn u32_from_ieee32(&mut self, val: Ieee32) -> u32 {
|
||||
val.bits()
|
||||
}
|
||||
|
||||
fn u64_from_ieee64(&mut self, val: Ieee64) -> u64 {
|
||||
@@ -748,5 +753,13 @@ macro_rules! isle_common_prelude_methods {
|
||||
fn pack_block_array_2(&mut self, a: BlockCall, b: BlockCall) -> BlockArray2 {
|
||||
[a, b]
|
||||
}
|
||||
|
||||
fn u128_as_u64(&mut self, val: u128) -> Option<u64> {
|
||||
u64::try_from(val).ok()
|
||||
}
|
||||
|
||||
fn u64_as_u32(&mut self, val: u64) -> Option<u32> {
|
||||
u32::try_from(val).ok()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user