Cranelift AArch64: Improve code generation for vector constants
In particular, introduce initial support for the MOVI and MVNI instructions, with 8-bit elements. Also, treat vector constants as 32- or 64-bit floating-point numbers, if their value allows it, by relying on the architectural zero extension. Finally, stop generating literal loads for 32-bit constants. Copyright (c) 2020, Arm Limited.
This commit is contained in:
@@ -609,10 +609,27 @@ pub enum VectorSize {
|
||||
}
|
||||
|
||||
impl VectorSize {
|
||||
/// Get the vector operand size with the given scalar size as lane size.
|
||||
pub fn from_lane_size(size: ScalarSize, is_128bit: bool) -> VectorSize {
|
||||
match (size, is_128bit) {
|
||||
(ScalarSize::Size8, false) => VectorSize::Size8x8,
|
||||
(ScalarSize::Size8, true) => VectorSize::Size8x16,
|
||||
(ScalarSize::Size16, false) => VectorSize::Size16x4,
|
||||
(ScalarSize::Size16, true) => VectorSize::Size16x8,
|
||||
(ScalarSize::Size32, false) => VectorSize::Size32x2,
|
||||
(ScalarSize::Size32, true) => VectorSize::Size32x4,
|
||||
(ScalarSize::Size64, true) => VectorSize::Size64x2,
|
||||
_ => panic!("Unexpected scalar FP operand size: {:?}", size),
|
||||
}
|
||||
}
|
||||
|
||||
/// Convert from a type into a vector operand size.
|
||||
pub fn from_ty(ty: Type) -> VectorSize {
|
||||
match ty {
|
||||
B8X16 => VectorSize::Size8x16,
|
||||
B16X8 => VectorSize::Size16x8,
|
||||
B32X4 => VectorSize::Size32x4,
|
||||
B64X2 => VectorSize::Size64x2,
|
||||
F32X2 => VectorSize::Size32x2,
|
||||
F32X4 => VectorSize::Size32x4,
|
||||
F64X2 => VectorSize::Size64x2,
|
||||
|
||||
Reference in New Issue
Block a user