#[macro_export]
macro_rules! rgbasm {
($( $tt:tt )+) => {{ #[allow(unused_imports)] {
use amplify::num::{u4, u5};
use $crate::vm::{RgbIsa, ContractOp};
use $crate::vm::aluasm_isa;
use $crate::isa_instr;
aluasm_isa! { RgbIsa<_> => $( $tt )+ }
} }};
}
#[macro_export]
macro_rules! isa_instr {
(svs $no:ident) => {{
RgbIsa::Contract(ContractOp::Svs($no))
}};
(sas $no:ident) => {{
RgbIsa::Contract(ContractOp::Sas($no))
}};
(sps $no:ident) => {{
RgbIsa::Contract(ContractOp::Sps($no))
}};
(cnp $t:ident,a16[$a_idx:literal]) => {{
RgbIsa::Contract(ContractOp::CnP($t, Reg32::from(u5::with($a_idx))))
}};
(cns $t:ident,a16[$a_idx:literal]) => {{
RgbIsa::Contract(ContractOp::CnS($t, Reg32::from(u5::with($a_idx))))
}};
(cng $t:ident,a8[$a_idx:literal]) => {{
RgbIsa::Contract(ContractOp::CnG($t, Reg32::from(u5::with($a_idx))))
}};
(cnc $t:ident,a16[$a_idx:literal]) => {{
RgbIsa::Contract(ContractOp::CnC($t, Reg32::from(u5::with($a_idx))))
}};
(ldc $t:ident,a32[$a_idx:literal],s16[$s_idx:literal]) => {{
RgbIsa::Contract(ContractOp::LdC($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx)))
}};
(ldm $t:ident,s16[$s_idx:literal]) => {{
RgbIsa::Contract(ContractOp::LdM($t, RegS::from($s_idx)))
}};
(ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{
RgbIsa::Contract(ContractOp::LdG($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx)))
}};
(ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{
RgbIsa::Contract(ContractOp::LdP($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx)))
}};
(lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{
RgbIsa::Contract(ContractOp::LdS($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx)))
}};
(ldf $t:ident,a16[$a_idx:literal],a64[$dst_idx:literal]) => {{
RgbIsa::Contract(ContractOp::LdF(
$t,
Reg16::from(u4::with($a_idx)),
Reg16::from(u4::with($dst_idx)),
))
}};
(vts s16[$s_idx:literal]) => {{
RgbIsa::Contract(ContractOp::Vts(RegS::from($s_idx)))
}};
($op:ident $($tt:tt)+) => {{
compile_error!(concat!("unknown RGB assembly opcode `", stringify!($op), "`"))
}};
}