From d0ef4e9dbe27cadfe6f64765763db9cef2e30511 Mon Sep 17 00:00:00 2001 From: Anthony Cowley Date: Sat, 13 Feb 2021 03:33:23 -0500 Subject: [PATCH] [spv-out] support select expressions --- src/back/spv/instructions.rs | 16 ++++++++++++++++ src/back/spv/writer.rs | 23 +++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/back/spv/instructions.rs b/src/back/spv/instructions.rs index f4b50afb3c..a4fe76706e 100644 --- a/src/back/spv/instructions.rs +++ b/src/back/spv/instructions.rs @@ -709,6 +709,22 @@ impl super::Instruction { instruction } + pub(super) fn select( + result_type_id: Word, + id: Word, + condition_id: Word, + accept_id: Word, + reject_id: Word, + ) -> Self { + let mut instruction = Self::new(Op::Select); + instruction.add_operand(result_type_id); + instruction.add_operand(id); + instruction.add_operand(condition_id); + instruction.add_operand(accept_id); + instruction.add_operand(reject_id); + instruction + } + pub(super) fn kill() -> Self { Self::new(Op::Kill) } diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index b60f173dbd..709dd8b922 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -1734,6 +1734,29 @@ impl Writer { block.body.push(main_instruction); RawExpression::Value(id) } + crate::Expression::Select { + condition, + accept, + reject, + } => { + let id = self.generate_id(); + let condition_id = + self.write_expression(ir_module, ir_function, condition, block, function)?; + let accept_id = + self.write_expression(ir_module, ir_function, accept, block, function)?; + let reject_id = + self.write_expression(ir_module, ir_function, reject, block, function)?; + + let instruction = Instruction::select( + result_type_id, + id, + condition_id, + accept_id, + reject_id, + ); + block.body.push(instruction); + RawExpression::Value(id) + } ref other => { log::error!("unimplemented {:?}", other); return Err(Error::FeatureNotImplemented("expression"));