From 7526cdc65e4f511f3835452b611b2ccd34d08d58 Mon Sep 17 00:00:00 2001 From: Afonso Bordado Date: Thu, 8 Jul 2021 10:15:01 +0100 Subject: [PATCH] cranelift: Use ValueConversionKind in branches --- cranelift/interpreter/src/step.rs | 20 ++++++++++---------- cranelift/interpreter/src/value.rs | 8 ++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/cranelift/interpreter/src/step.rs b/cranelift/interpreter/src/step.rs index a29590e6a7..2030d15a40 100644 --- a/cranelift/interpreter/src/step.rs +++ b/cranelift/interpreter/src/step.rs @@ -142,16 +142,16 @@ where // Interpret a Cranelift instruction. Ok(match inst.opcode() { Opcode::Jump | Opcode::Fallthrough => ControlFlow::ContinueAt(branch(), args()?), - Opcode::Brz => branch_when(match arg(0)?.ty() { - ty if ty.is_bool() => !arg(0)?.into_bool()?, - ty if ty.is_int() => arg(0)?.into_int()? == 0, - _ => return Err(StepError::ValueError(ValueError::InvalidValue(types::B1))), - })?, - Opcode::Brnz => branch_when(match arg(0)?.ty() { - ty if ty.is_bool() => arg(0)?.into_bool()?, - ty if ty.is_int() => arg(0)?.into_int()? != 0, - _ => return Err(StepError::ValueError(ValueError::InvalidValue(types::B1))), - })?, + Opcode::Brz => branch_when( + !arg(0)? + .convert(ValueConversionKind::ToBoolean)? + .into_bool()?, + )?, + Opcode::Brnz => branch_when( + arg(0)? + .convert(ValueConversionKind::ToBoolean)? + .into_bool()?, + )?, Opcode::BrIcmp => branch_when(icmp(inst.cond_code().unwrap(), &arg(0)?, &arg(1)?)?)?, Opcode::Brif => branch_when(state.has_iflag(inst.cond_code().unwrap()))?, Opcode::Brff => branch_when(state.has_fflag(inst.fp_cond_code().unwrap()))?, diff --git a/cranelift/interpreter/src/value.rs b/cranelift/interpreter/src/value.rs index 991e83bad3..54bff022a2 100644 --- a/cranelift/interpreter/src/value.rs +++ b/cranelift/interpreter/src/value.rs @@ -108,6 +108,9 @@ pub enum ValueConversionKind { /// Convert a floating point number by rounding to the nearest possible value with ties to even. /// See `fdemote`, e.g. RoundNearestEven(Type), + /// Converts an integer into a boolean, zero integers are converted into a + /// `false`, while other integers are converted into `true`. Booleans are passed through. + ToBoolean, } /// Helper for creating match expressions over [DataValue]. @@ -263,6 +266,11 @@ impl Value for DataValue { (types::F64, types::F32) => unimplemented!(), _ => unimplemented!("conversion: {} -> {:?}", self.ty(), kind), }, + ValueConversionKind::ToBoolean => match self.ty() { + ty if ty.is_bool() => DataValue::B(self.into_bool()?), + ty if ty.is_int() => DataValue::B(self.into_int()? != 0), + ty => unimplemented!("conversion: {} -> {:?}", ty, kind), + }, }) }