mech_interpreter/stdlib/math/
mul.rs1#[macro_use]
2use crate::stdlib::*;
3
4macro_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);