cranelift: Port ushr SIMD lowerings to ISLE on x64
This commit is contained in:
@@ -270,7 +270,7 @@ where
|
||||
debug_assert!(amt < 8);
|
||||
let mask_offset = amt as usize * 16;
|
||||
let mask_constant = self.lower_ctx.use_constant(VCodeConstantData::WellKnown(
|
||||
&I8X16_SHL_MASKS[mask_offset..mask_offset + 16],
|
||||
&I8X16_ISHL_MASKS[mask_offset..mask_offset + 16],
|
||||
));
|
||||
SyntheticAmode::ConstantOffset(mask_constant)
|
||||
}
|
||||
@@ -278,7 +278,25 @@ where
|
||||
fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode {
|
||||
let mask_table = self
|
||||
.lower_ctx
|
||||
.use_constant(VCodeConstantData::WellKnown(&I8X16_SHL_MASKS));
|
||||
.use_constant(VCodeConstantData::WellKnown(&I8X16_ISHL_MASKS));
|
||||
SyntheticAmode::ConstantOffset(mask_table)
|
||||
}
|
||||
|
||||
fn ushr_i8x16_mask_for_const(&mut self, amt: u32) -> SyntheticAmode {
|
||||
// When the shift amount is known, we can statically (i.e. at compile
|
||||
// time) determine the mask to use and only emit that.
|
||||
debug_assert!(amt < 8);
|
||||
let mask_offset = amt as usize * 16;
|
||||
let mask_constant = self.lower_ctx.use_constant(VCodeConstantData::WellKnown(
|
||||
&I8X16_USHR_MASKS[mask_offset..mask_offset + 16],
|
||||
));
|
||||
SyntheticAmode::ConstantOffset(mask_constant)
|
||||
}
|
||||
|
||||
fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode {
|
||||
let mask_table = self
|
||||
.lower_ctx
|
||||
.use_constant(VCodeConstantData::WellKnown(&I8X16_USHR_MASKS));
|
||||
SyntheticAmode::ConstantOffset(mask_table)
|
||||
}
|
||||
}
|
||||
@@ -289,8 +307,9 @@ where
|
||||
// right by 0 (no movement), we want to retain all the bits so we mask with
|
||||
// `0xff`; if we shift right by 1, we want to retain all bits except the MSB so
|
||||
// we mask with `0x7f`; etc.
|
||||
|
||||
#[rustfmt::skip] // Preserve 16 bytes (i.e. one mask) per row.
|
||||
const I8X16_SHL_MASKS: [u8; 128] = [
|
||||
const I8X16_ISHL_MASKS: [u8; 128] = [
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
@@ -301,6 +320,18 @@ const I8X16_SHL_MASKS: [u8; 128] = [
|
||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
];
|
||||
|
||||
#[rustfmt::skip] // Preserve 16 bytes (i.e. one mask) per row.
|
||||
const I8X16_USHR_MASKS: [u8; 128] = [
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
|
||||
0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
|
||||
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
];
|
||||
|
||||
#[inline]
|
||||
fn to_simm32(constant: i64) -> Option<RegMemImm> {
|
||||
if constant == ((constant << 32) >> 32) {
|
||||
|
||||
Reference in New Issue
Block a user