From ccdefe7033ba76613ef105b44039818bfcbb1fba Mon Sep 17 00:00:00 2001 From: sofia Date: Thu, 24 Jul 2025 19:07:35 +0300 Subject: [PATCH] Add u16 div and mod to intrinsics --- reid/src/intrinsics.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/reid/src/intrinsics.rs b/reid/src/intrinsics.rs index 9d7560c..70c8752 100644 --- a/reid/src/intrinsics.rs +++ b/reid/src/intrinsics.rs @@ -68,6 +68,20 @@ pub fn form_intrinsic_binops() -> Vec { TypeKind::U16, IntrinsicIAdd(TypeKind::U16), )); + intrinsics.push(intrinsic_binop( + BinaryOperator::Div, + TypeKind::U16, + TypeKind::U16, + TypeKind::U16, + IntrinsicUDiv(TypeKind::U16), + )); + intrinsics.push(intrinsic_binop( + BinaryOperator::Mod, + TypeKind::U16, + TypeKind::U16, + TypeKind::U16, + IntrinsicUMod(TypeKind::U16), + )); intrinsics } @@ -95,3 +109,37 @@ impl IntrinsicFunction for IntrinsicIAdd { Ok(StackValue(StackValueKind::Literal(add), self.0.clone())) } } + +#[derive(Debug, Clone)] +pub struct IntrinsicUDiv(TypeKind); + +impl IntrinsicFunction for IntrinsicUDiv { + fn codegen<'ctx, 'a>( + &self, + scope: &mut Scope<'ctx, 'a>, + params: &[InstructionValue], + ) -> Result { + let lhs = params.get(0).unwrap(); + let rhs = params.get(1).unwrap(); + let add = scope.block.build(Instr::UDiv(*lhs, *rhs)).unwrap(); + Ok(StackValue(StackValueKind::Literal(add), self.0.clone())) + } +} + +#[derive(Debug, Clone)] +pub struct IntrinsicUMod(TypeKind); + +impl IntrinsicFunction for IntrinsicUMod { + fn codegen<'ctx, 'a>( + &self, + scope: &mut Scope<'ctx, 'a>, + params: &[InstructionValue], + ) -> Result { + let lhs = params.get(0).unwrap(); + let rhs = params.get(1).unwrap(); + let div = scope.block.build(Instr::UDiv(*lhs, *rhs)).unwrap(); + let mul = scope.block.build(Instr::Mul(*rhs, div)).unwrap(); + let sub = scope.block.build(Instr::Sub(*lhs, mul)).unwrap(); + Ok(StackValue(StackValueKind::Literal(sub), self.0.clone())) + } +}