diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index 189876b003..02485c02a7 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -1555,10 +1555,6 @@ impl Writer { kind, convert, } => { - if !convert { - return Err(Error::FeatureNotImplemented("bitcast")); - } - let expr_id = self.write_expression(ir_module, ir_function, expr, block, function)?; let expr_kind = self diff --git a/src/front/spv/mod.rs b/src/front/spv/mod.rs index 16ab05d80c..2bf98b8b91 100644 --- a/src/front/spv/mod.rs +++ b/src/front/spv/mod.rs @@ -1466,9 +1466,29 @@ impl> Parser { inst.expect_at_least(3)?; let selector = self.next()?; - let selector = self.lookup_expression[&selector].handle; let default = self.next()?; + let selector_lexp = &self.lookup_expression[&selector]; + let selector_lty = self.lookup_type.lookup(selector_lexp.type_id)?; + let selector = match type_arena[selector_lty.handle].inner { + crate::TypeInner::Scalar { + kind: crate::ScalarKind::Uint, + width: _, + } => { + // IR expects a signed integer, so do a bitcast + expressions.append(crate::Expression::As { + kind: crate::ScalarKind::Sint, + expr: selector_lexp.handle, + convert: false, + }) + } + crate::TypeInner::Scalar { + kind: crate::ScalarKind::Sint, + width: _, + } => selector_lexp.handle, + ref other => unimplemented!("Unexpected selector {:?}", other), + }; + let mut targets = Vec::new(); for _ in 0..(inst.wc - 3) / 2 { let literal = self.next()?;