IT WORKS HELL YEAH.
This commit is contained in:
@@ -155,3 +155,54 @@ impl TryFrom<u32> for RTypeArgs {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! args {
|
||||
// R-type arguments - allows omitting any field
|
||||
(R $(, $field:ident: $value:expr)* $(,)?) => {{
|
||||
let mut sr1: Option<Register> = None;
|
||||
let mut sr2: Option<Register> = None;
|
||||
let mut dr: Option<Register> = None;
|
||||
let mut shamt: Option<u8> = None;
|
||||
|
||||
$(
|
||||
args!(@assign_r_option sr1, sr2, dr, shamt, $field, $value);
|
||||
)*
|
||||
|
||||
RTypeArgs::new(sr1, sr2, dr, shamt)
|
||||
}};
|
||||
|
||||
// I-type arguments - requires immediate, allows omitting registers
|
||||
(I, immediate: $immediate:expr $(, $field:ident: $value:expr)* $(,)?) => {{
|
||||
let mut r1: Option<Register> = None;
|
||||
let mut r2: Option<Register> = None;
|
||||
|
||||
$(
|
||||
args!(@assign_i_option r1, r2, $field, $value);
|
||||
)*
|
||||
|
||||
ITypeArgs::new($immediate, r1, r2)
|
||||
}};
|
||||
|
||||
// Internal helpers (same as above for R-type)
|
||||
(@assign_r_option $sr1:ident, $sr2:ident, $dr:ident, $shamt:ident, sr1, $value:expr) => {
|
||||
$sr1 = Some($value);
|
||||
};
|
||||
(@assign_r_option $sr1:ident, $sr2:ident, $dr:ident, $shamt:ident, sr2, $value:expr) => {
|
||||
$sr2 = Some($value);
|
||||
};
|
||||
(@assign_r_option $sr1:ident, $sr2:ident, $dr:ident, $shamt:ident, dr, $value:expr) => {
|
||||
$dr = Some($value);
|
||||
};
|
||||
(@assign_r_option $sr1:ident, $sr2:ident, $dr:ident, $shamt:ident, shamt, $value:expr) => {
|
||||
$shamt = Some($value);
|
||||
};
|
||||
|
||||
// Internal helpers for I-type (without immediate handling)
|
||||
(@assign_i_option $r1:ident, $r2:ident, r1, $value:expr) => {
|
||||
$r1 = Some($value);
|
||||
};
|
||||
(@assign_i_option $r1:ident, $r2:ident, r2, $value:expr) => {
|
||||
$r2 = Some($value);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user