mech_interpreter/stdlib/math/
mul.rs

1#[macro_use]
2use crate::stdlib::*;
3
4// Mul ------------------------------------------------------------------------
5
6macro_rules! mul_op {
7    ($lhs:expr, $rhs:expr, $out:expr) => {
8      unsafe { *$out = *$lhs * *$rhs; }};}
9  
10macro_rules! mul_vec_op {
11($lhs:expr, $rhs:expr, $out:expr) => {
12  unsafe {
13    let mut out_deref = &mut (*$out);
14    let lhs_deref = &(*$lhs);
15    let rhs_deref = &(*$rhs);
16    for (o,(l,r)) in out_deref.iter_mut().zip(lhs_deref.iter().zip(rhs_deref.iter())) {
17      *o = *l * *r;
18    }
19  }};}
20
21macro_rules! mul_scalar_lhs_op {
22($lhs:expr, $rhs:expr, $out:expr) => {
23    unsafe { 
24      let mut out_deref = &mut (*$out);
25      let lhs_deref = &(*$lhs);
26      let rhs_deref = (*$rhs);
27      for (o,l) in out_deref.iter_mut().zip(lhs_deref.iter()) {
28        *o = *l * rhs_deref;
29      }
30    }};}
31
32macro_rules! mul_scalar_rhs_op {
33($lhs:expr, $rhs:expr, $out:expr) => {
34  unsafe {
35    let mut out_deref = &mut (*$out);
36    let lhs_deref = (*$lhs);
37    let rhs_deref = &(*$rhs);
38    for (o,r) in out_deref.iter_mut().zip(rhs_deref.iter()) {
39      *o = lhs_deref * *r;
40    }
41  }};}
42
43macro_rules! mul_mat_vec_op {
44  ($lhs:expr, $rhs:expr, $out:expr) => {
45    unsafe {
46      let mut out_deref = &mut (*$out);
47      let lhs_deref = &(*$lhs);
48      let rhs_deref = &(*$rhs);
49      for (mut col, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
50        for i in 0..col.len() {
51          col[i] = lhs_col[i] * rhs_deref[i];
52        }
53      }
54    }
55  };}
56
57macro_rules! mul_vec_mat_op {
58  ($lhs:expr, $rhs:expr, $out:expr) => {
59    unsafe {
60      let mut out_deref = &mut (*$out);
61      let lhs_deref = &(*$lhs);
62      let rhs_deref = &(*$rhs);
63      for (mut col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
64        for i in 0..col.len() {
65          col[i] = lhs_deref[i] * rhs_col[i];
66        }
67      }
68    }
69  };}
70
71macro_rules! mul_mat_row_op {
72  ($lhs:expr, $rhs:expr, $out:expr) => {
73    unsafe {
74      let mut out_deref = &mut (*$out);
75      let lhs_deref = &(*$lhs);
76      let rhs_deref = &(*$rhs);
77      for (mut row, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
78        for i in 0..row.len() {
79          row[i] = lhs_row[i] * rhs_deref[i];
80        }
81      }
82    }
83  };}
84
85macro_rules! mul_row_mat_op {
86  ($lhs:expr, $rhs:expr, $out:expr) => {
87    unsafe {
88      let mut out_deref = &mut (*$out);
89      let lhs_deref = &(*$lhs);
90      let rhs_deref = &(*$rhs);
91      for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
92        for i in 0..row.len() {
93          row[i] = lhs_deref[i] * rhs_row[i];
94        }
95      }
96    }
97  };}  
98
99impl_math_fxns!(Mul);
100
101fn impl_mul_fxn(lhs_value: Value, rhs_value: Value) -> Result<Box<dyn MechFunction>, MechError> {
102  impl_binop_match_arms!(
103    Mul,
104    (lhs_value, rhs_value),
105    I8,   I8   => MatrixI8,   i8,   i8::zero(), "I8";
106    I16,  I16  => MatrixI16,  i16,  i16::zero(), "I16";
107    I32,  I32  => MatrixI32,  i32,  i32::zero(), "I32";
108    I64,  I64  => MatrixI64,  i64,  i64::zero(), "I64";
109    I128, I128 => MatrixI128, i128, i128::zero(), "I128";
110    U8,   U8   => MatrixU8,   u8,   u8::zero(), "U8";
111    U16,  U16  => MatrixU16,  u16,  u16::zero(), "U16";
112    U32,  U32  => MatrixU32,  u32,  u32::zero(), "U32";
113    U64,  U64  => MatrixU64,  u64,  u64::zero(), "U64";
114    U128, U128 => MatrixU128, u128, u128::zero(), "U128";
115    F32,  F32  => MatrixF32,  F32,  F32::zero(), "F32";
116    F64,  F64  => MatrixF64,  F64,  F64::zero(), "F64";
117  )
118}
119
120impl_mech_binop_fxn!(MathMul,impl_mul_fxn);