cranelift: Add coerce_bools_to_ints helper
This commit is contained in:
@@ -340,6 +340,19 @@ impl Type {
|
|||||||
Err(()) => panic!("unable to determine architecture pointer width"),
|
Err(()) => panic!("unable to determine architecture pointer width"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Coerces boolean types (scalar and vectors) into their integer counterparts.
|
||||||
|
/// B1 is converted into I8.
|
||||||
|
pub fn coerce_bools_to_ints(self) -> Self {
|
||||||
|
let is_scalar_bool = self.is_bool();
|
||||||
|
let is_vector_bool = self.is_vector() && self.lane_type().is_bool();
|
||||||
|
|
||||||
|
if is_scalar_bool || is_vector_bool {
|
||||||
|
self.as_int()
|
||||||
|
} else {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Type {
|
impl Display for Type {
|
||||||
|
|||||||
@@ -297,15 +297,7 @@ fn make_trampoline(signature: &ir::Signature, isa: &dyn TargetIsa) -> Function {
|
|||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, param)| {
|
.map(|(i, param)| {
|
||||||
// Calculate the type to load from memory, using integers for booleans (no encodings).
|
// Calculate the type to load from memory, using integers for booleans (no encodings).
|
||||||
let is_scalar_bool = param.value_type.is_bool();
|
let ty = param.value_type.coerce_bools_to_ints();
|
||||||
let is_vector_bool =
|
|
||||||
param.value_type.is_vector() && param.value_type.lane_type().is_bool();
|
|
||||||
|
|
||||||
let ty = if is_scalar_bool || is_vector_bool {
|
|
||||||
param.value_type.as_int()
|
|
||||||
} else {
|
|
||||||
param.value_type
|
|
||||||
};
|
|
||||||
|
|
||||||
// Load the value.
|
// Load the value.
|
||||||
let loaded = builder.ins().load(
|
let loaded = builder.ins().load(
|
||||||
@@ -314,6 +306,11 @@ fn make_trampoline(signature: &ir::Signature, isa: &dyn TargetIsa) -> Function {
|
|||||||
values_vec_ptr_val,
|
values_vec_ptr_val,
|
||||||
(i * UnboxedValues::SLOT_SIZE) as i32,
|
(i * UnboxedValues::SLOT_SIZE) as i32,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let is_scalar_bool = param.value_type.is_bool();
|
||||||
|
let is_vector_bool =
|
||||||
|
param.value_type.is_vector() && param.value_type.lane_type().is_bool();
|
||||||
|
|
||||||
// For booleans, we want to type-convert the loaded integer into a boolean and ensure
|
// For booleans, we want to type-convert the loaded integer into a boolean and ensure
|
||||||
// that we are using the architecture's canonical boolean representation (presumably
|
// that we are using the architecture's canonical boolean representation (presumably
|
||||||
// comparison will emit this).
|
// comparison will emit this).
|
||||||
|
|||||||
Reference in New Issue
Block a user