diff --git a/Cargo.lock b/Cargo.lock index b66c96e..ff40d83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,8 +13,6 @@ dependencies = [ "amplify_num", "amplify_syn", "ascii", - "serde", - "stringly_conversions", "wasm-bindgen", ] @@ -47,7 +45,6 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afed304556696656d2d71495e1e5f2c4b524a3fb6eb0f2f3778ffc482a40b8a8" dependencies = [ - "serde", "wasm-bindgen", ] @@ -79,19 +76,16 @@ name = "ascii" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" -dependencies = [ - "serde", -] [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] @@ -144,9 +138,9 @@ checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" [[package]] name = "bitcoin" -version = "0.32.101" +version = "0.32.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed8ccb78a9ff7a6fbb90e2fb9b8588b4a9928d49d8af3cb789108a84ea6b0ce" +checksum = "bb0ce8bd5baaa0d303a19915a6d93afed161f528654e42da2a7a97d05c59499a" dependencies = [ "base58ck", "bech32", @@ -205,15 +199,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "blake3" -version = "1.8.5" +version = "1.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +checksum = "76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77" dependencies = [ "arrayref", "arrayvec", @@ -255,9 +249,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.67" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" dependencies = [ "find-msvc-tools", "shlex", @@ -385,27 +379,27 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-core", "futures-task", @@ -486,9 +480,9 @@ checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" [[package]] name = "hybrid-array" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] @@ -511,9 +505,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", @@ -522,9 +516,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" @@ -585,12 +579,6 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pin-project-lite" version = "0.2.17" @@ -608,18 +596,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -669,7 +657,6 @@ dependencies = [ "curve25519-dalek", "getrandom", "half", - "paste", "rgb-ascii-armor", "rgb-strict-encoding", "rgb-strict-types", @@ -697,8 +684,7 @@ dependencies = [ [[package]] name = "rgb-strict-encoding" version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f68326e14d4b627f86634ea324510135cb551e27c5583a74811fa230b0cf34d" +source = "git+https://github.com/rgb-protocol/rgb-strict-encoding?rev=7feb0f2#7feb0f2986a49cf3fa084e7030c8aa162356779d" dependencies = [ "amplify", "bitcoin", @@ -710,8 +696,7 @@ dependencies = [ [[package]] name = "rgb-strict-encoding-derive" version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33367536cfef03cb582cd9f8f25e193c2298d3ec3112eb59018a376b465f1ed9" +source = "git+https://github.com/rgb-protocol/rgb-strict-encoding?rev=7feb0f2#7feb0f2986a49cf3fa084e7030c8aa162356779d" dependencies = [ "amplify_syn", "heck", @@ -723,8 +708,7 @@ dependencies = [ [[package]] name = "rgb-strict-types" version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e920bdf61b662a3743572a03696b0d88992eeb7d4f7afa0902915968327b3ce6" +source = "git+https://github.com/rgb-protocol/rgb-strict-types?rev=8dfd921#8dfd9210f7c9d454409ac44f93cd72b7cd8c0a10" dependencies = [ "amplify", "baid64", @@ -815,9 +799,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -825,29 +809,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -856,16 +840,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_str_helpers" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b744a7c94f2f3785496af33a0d93857dfc0c521e25c38e993e9c5bb45f09c841" -dependencies = [ - "serde", - "serde_derive", -] - [[package]] name = "sha2" version = "0.10.9" @@ -900,16 +874,6 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" -[[package]] -name = "stringly_conversions" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff63080f492dd4d289ffcaed8d7ece38adfb423db910eb342c0e04d409536a7a" -dependencies = [ - "paste", - "serde_str_helpers", -] - [[package]] name = "subtle" version = "2.6.1" @@ -938,6 +902,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -997,9 +972,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -1010,9 +985,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.76" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ "js-sys", "wasm-bindgen", @@ -1020,9 +995,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1030,9 +1005,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", @@ -1043,18 +1018,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0d555ca874445df8d314f94f5c948a4e74e5418f332c89f660a3d8310a96f4" +checksum = "895a2607575412a4eda1df892084a375ea10dfeadc4d7d2ab87b854e4ddc7ba1" dependencies = [ "async-trait", "cast", @@ -1074,9 +1049,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94eb68555b95bcea5e8cf4abe280b529049479fa995bfc23734af96a6aedc120" +checksum = "4288cb0ebe215033bf949ae1fd046726daa4c32a157f24b9dc6ac387a52aa759" dependencies = [ "proc-macro2", "quote", @@ -1085,9 +1060,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-shared" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31d56021e873866c968588ed85ccdf56db5c426e44afdb4618c39895104b920" +checksum = "33ff1c1b360982e93b6d8ea9c04836f71dba0817a16f91e229cf3a51bdd9d987" [[package]] name = "winapi-util" @@ -1121,18 +1096,18 @@ checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 46b5aee..48bd5a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,6 @@ amplify = { version = "=4.8.1", default-features = false, features = [ ] } rgb-ascii-armor = { version = "1.0.2", optional = true } baid64 = "=0.4.1" -paste = "1" rgb-strict-encoding = { version = "~1.0.2", default-features = false, features = [ "float", "derive", @@ -77,7 +76,6 @@ curve25519 = [ ] serde = [ "serde_crate", - "amplify/serde", "std", "rgb-strict-encoding/serde", ] @@ -93,3 +91,7 @@ wasm-bindgen-test = "0.3" [package.metadata.docs.rs] features = ["all"] + +[patch.crates-io] +rgb-strict-encoding = { git = "https://github.com/rgb-protocol/rgb-strict-encoding", rev = "7feb0f2" } +rgb-strict-types = { git = "https://github.com/rgb-protocol/rgb-strict-types", rev = "8dfd921" } diff --git a/src/isa/macros.rs b/src/isa/macros.rs index e07ca3c..01a6b8b 100644 --- a/src/isa/macros.rs +++ b/src/isa/macros.rs @@ -229,8 +229,8 @@ macro_rules! instr { }; (clr $reg:ident[$idx:literal]) => { - Instr::Put($crate::_reg_sfx!(PutOp, Clr, $reg)( - $crate::_reg_ty!(Reg, $reg), + Instr::Put($crate::_reg_sfx!(PutOp::ClrA, PutOp::ClrF, PutOp::ClrR, $reg)( + $crate::_reg_ty!($reg), $crate::_reg_idx!($idx), )) }; @@ -278,7 +278,7 @@ macro_rules! instr { (len s16[$s_idx:literal], $rega:ident[$rega_idx:literal]) => {{ Instr::Bytes(BytesOp::Len( RegS::from($s_idx), - $crate::_reg_tya!(Reg, $rega), + $crate::_reg_tya!($rega), $crate::_reg_idx!($rega_idx), )) }}; @@ -310,22 +310,27 @@ macro_rules! instr { (put $reg:ident[$idx:literal], $val:literal) => {{ let s = stringify!($val); let mut num = s.parse::().expect(&format!("invalid number literal `{}`", s)); - let reg = $crate::_reg_ty!(Reg, $reg); + let reg = $crate::_reg_ty!($reg); num.reshape(reg.layout()); - Instr::Put($crate::_reg_sfx!(PutOp, Put, $reg)(reg, $crate::_reg_idx!($idx), Box::new(num))) + Instr::Put($crate::_reg_sfx!(PutOp::PutA, PutOp::PutF, PutOp::PutR, $reg)(reg, $crate::_reg_idx!($idx), Box::new(num))) }}; (put $reg:ident[$idx:literal], $val:ident) => {{ let mut num = MaybeNumber::from($val); - let reg = $crate::_reg_ty!(Reg, $reg); + let reg = $crate::_reg_ty!($reg); num.reshape(reg.layout()); - Instr::Put($crate::_reg_sfx!(PutOp, Put, $reg)(reg, $crate::_reg_idx!($idx), Box::new(num))) + Instr::Put($crate::_reg_sfx!(PutOp::PutA, PutOp::PutF, PutOp::PutR, $reg)(reg, $crate::_reg_idx!($idx), Box::new(num))) }}; (putif $reg:ident[$idx:literal], $val:literal) => {{ let s = stringify!($val); let mut num = s.parse::().expect(&format!("invalid number literal `{}`", s)); - let reg = $crate::_reg_ty!(Reg, $reg); + let reg = $crate::_reg_ty!($reg); num.reshape(reg.layout()); - Instr::Put($crate::_reg_sfx!(PutOp, PutIf, $reg)( + Instr::Put($crate::_reg_sfx!( + PutOp::PutIfA, + compile_error!("`putif` operation is not supported for `F` registers"), + PutOp::PutIfR, + $reg + )( reg, $crate::_reg_idx!($idx), Box::new(num), @@ -333,9 +338,14 @@ macro_rules! instr { }}; (putif $reg:ident[$idx:literal], $val:ident) => {{ let mut num = MaybeNumber::from($val); - let reg = $crate::_reg_ty!(Reg, $reg); + let reg = $crate::_reg_ty!($reg); num.reshape(reg.layout()); - Instr::Put($crate::_reg_sfx!(PutOp, PutIf, $reg)( + Instr::Put($crate::_reg_sfx!( + PutOp::PutIfA, + compile_error!("`putif` operation is not supported for `F` registers"), + PutOp::PutIfR, + $reg + )( reg, $crate::_reg_idx!($idx), Box::new(num), @@ -343,70 +353,80 @@ macro_rules! instr { }}; (swp $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => {{ - if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $reg2) { + if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($reg2) { panic!("Swap operation must be performed between registers of the same type"); } - Instr::Move($crate::_reg_sfx!(MoveOp, Swp, $reg1)( - $crate::_reg_ty!(Reg, $reg1), + Instr::Move($crate::_reg_sfx!( + MoveOp::SwpA, + MoveOp::SwpF, + compile_error!("`swp` operation is not supported for `R` registers"), + $reg1 + )( + $crate::_reg_ty!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) }}; (mov $src_reg:ident[$src_idx:literal], $dst_reg:ident[$dst_idx:literal]) => {{ - if $crate::_reg_ty!(Reg, $src_reg) != $crate::_reg_ty!(Reg, $dst_reg) { + if $crate::_reg_ty!($src_reg) != $crate::_reg_ty!($dst_reg) { panic!("Move operation must be performed between registers of the same type"); } - Instr::Move($crate::_reg_sfx!(MoveOp, Mov, $src_reg)( - $crate::_reg_ty!(Reg, $src_reg), + Instr::Move($crate::_reg_sfx!(MoveOp::MovA, MoveOp::MovF, MoveOp::MovR, $src_reg)( + $crate::_reg_ty!($src_reg), $crate::_reg_idx!($src_idx), $crate::_reg_idx!($dst_idx), )) }}; (dup $src_reg:ident[$src_idx:literal], $dst_reg:ident[$dst_idx:literal]) => {{ - if $crate::_reg_ty!(Reg, $src_reg) != $crate::_reg_ty!(Reg, $dst_reg) { + if $crate::_reg_ty!($src_reg) != $crate::_reg_ty!($dst_reg) { panic!("Dup operation must be performed between registers of the same type"); } - Instr::Move($crate::_reg_sfx!(MoveOp, Dup, $src_reg)( - $crate::_reg_ty!(Reg, $src_reg), + Instr::Move($crate::_reg_sfx!(MoveOp::DupA, MoveOp::DupF, MoveOp::DupR, $src_reg)( + $crate::_reg_ty!($src_reg), $crate::_reg_idx!($src_idx), $crate::_reg_idx!($dst_idx), )) }}; (cpy $src_reg:ident[$src_idx:literal], $dst_reg:ident[$dst_idx:literal]) => {{ - if $crate::_reg_ty!(Reg, $src_reg) != $crate::_reg_ty!(Reg, $dst_reg) { + if $crate::_reg_ty!($src_reg) != $crate::_reg_ty!($dst_reg) { panic!("Copy operation must be performed between registers of the same type"); } - Instr::Move($crate::_reg_sfx!(MoveOp, Cpy, $src_reg)( - $crate::_reg_ty!(Reg, $src_reg), + Instr::Move($crate::_reg_sfx!( + MoveOp::CpyA, + compile_error!("`cpy` operation is not supported for `F` registers"), + MoveOp::CpyR, + $src_reg + )( + $crate::_reg_ty!($src_reg), $crate::_reg_idx!($src_idx), - $crate::_reg_ty!(Reg, $dst_reg), + $crate::_reg_ty!($dst_reg), $crate::_reg_idx!($dst_idx), )) }}; (cnv $src_reg:ident[$src_idx:literal], $dst_reg:ident[$dst_idx:literal]) => {{ match ($crate::_reg_block!($src_reg), $crate::_reg_block!($dst_reg)) { (RegBlockAFR::A, RegBlockAFR::F) => Instr::Move(MoveOp::CnvAF( - $crate::_reg_tya!(Reg, $src_reg), + $crate::_reg_tya!($src_reg), $crate::_reg_idx!($src_idx), - $crate::_reg_tyf!(Reg, $dst_reg), + $crate::_reg_tyf!($dst_reg), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::F, RegBlockAFR::A) => Instr::Move(MoveOp::CnvFA( - $crate::_reg_tyf!(Reg, $src_reg), + $crate::_reg_tyf!($src_reg), $crate::_reg_idx!($src_idx), - $crate::_reg_tya!(Reg, $dst_reg), + $crate::_reg_tya!($dst_reg), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::A, RegBlockAFR::A) => Instr::Move(MoveOp::CnvA( - $crate::_reg_tya!(Reg, $src_reg), + $crate::_reg_tya!($src_reg), $crate::_reg_idx!($src_idx), - $crate::_reg_tya!(Reg, $dst_reg), + $crate::_reg_tya!($dst_reg), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::F, RegBlockAFR::F) => Instr::Move(MoveOp::CnvF( - $crate::_reg_tyf!(Reg, $src_reg), + $crate::_reg_tyf!($src_reg), $crate::_reg_idx!($src_idx), - $crate::_reg_tyf!(Reg, $dst_reg), + $crate::_reg_tyf!($dst_reg), $crate::_reg_idx!($dst_idx), )), (_, _) => panic!("Conversion operation between unsupported register types"), @@ -415,15 +435,15 @@ macro_rules! instr { (spy $src_reg:ident[$src_idx:literal], $dst_reg:ident[$dst_idx:literal]) => {{ match ($crate::_reg_block!($src_reg), $crate::_reg_block!($dst_reg)) { (RegBlockAFR::A, RegBlockAFR::R) => Instr::Move(MoveOp::SpyAR( - $crate::_reg_tya!(Reg, $src_reg), + $crate::_reg_tya!($src_reg), $crate::_reg_idx!($src_idx), - $crate::_reg_tyr!(Reg, $dst_reg), + $crate::_reg_tyr!($dst_reg), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::R, RegBlockAFR::A) => Instr::Move(MoveOp::SpyAR( - $crate::_reg_tya!(Reg, $dst_reg), + $crate::_reg_tya!($dst_reg), $crate::_reg_idx!($dst_idx), - $crate::_reg_tyr!(Reg, $src_reg), + $crate::_reg_tyr!($src_reg), $crate::_reg_idx!($src_idx), )), (_, _) => { @@ -440,7 +460,7 @@ macro_rules! instr { panic!("`gt` operation for arithmetic registers requires suffix"); } Instr::Cmp(CmpOp::GtR( - $crate::_reg_tyr!(Reg, $reg1), + $crate::_reg_tyr!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -451,7 +471,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::GtA( SignFlag::Unsigned, - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -462,7 +482,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::GtA( SignFlag::Signed, - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -473,7 +493,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::GtF( FloatEqFlag::Exact, - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -484,7 +504,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::GtF( FloatEqFlag::Rounding, - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -497,7 +517,7 @@ macro_rules! instr { panic!("`lt` operation for arithmetic registers requires suffix"); } Instr::Cmp(CmpOp::LtR( - $crate::_reg_tyr!(Reg, $reg1), + $crate::_reg_tyr!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -508,7 +528,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::LtA( SignFlag::Unsigned, - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -519,7 +539,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::LtA( SignFlag::Signed, - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -530,7 +550,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::LtF( FloatEqFlag::Exact, - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -541,7 +561,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::LtF( FloatEqFlag::Rounding, - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -555,19 +575,19 @@ macro_rules! instr { match $crate::_reg_block!($reg1) { RegBlockAFR::A => Instr::Cmp(CmpOp::EqA( NoneEqFlag::Equal, - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )), RegBlockAFR::R => Instr::Cmp(CmpOp::EqR( NoneEqFlag::Equal, - $crate::_reg_tyr!(Reg, $reg1), + $crate::_reg_tyr!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )), RegBlockAFR::F => Instr::Cmp(CmpOp::EqF( FloatEqFlag::Exact, - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )), @@ -582,13 +602,13 @@ macro_rules! instr { match $crate::_reg_block!($reg1) { RegBlockAFR::A => Instr::Cmp(CmpOp::EqA( NoneEqFlag::NonEqual, - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )), RegBlockAFR::R => Instr::Cmp(CmpOp::EqR( NoneEqFlag::NonEqual, - $crate::_reg_tyr!(Reg, $reg1), + $crate::_reg_tyr!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )), @@ -603,7 +623,7 @@ macro_rules! instr { } Instr::Cmp(CmpOp::EqF( FloatEqFlag::Rounding, - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($idx2), )) @@ -614,10 +634,10 @@ macro_rules! instr { (ifn $reg:ident[$idx:literal]) => { match $crate::_reg_block!($reg) { RegBlockAFR::A => { - Instr::Cmp(CmpOp::IfNA($crate::_reg_tya!(Reg, $reg), $crate::_reg_idx!($idx))) + Instr::Cmp(CmpOp::IfNA($crate::_reg_tya!($reg), $crate::_reg_idx!($idx))) } RegBlockAFR::R => { - Instr::Cmp(CmpOp::IfNR($crate::_reg_tyr!(Reg, $reg), $crate::_reg_idx!($idx))) + Instr::Cmp(CmpOp::IfNR($crate::_reg_tyr!($reg), $crate::_reg_idx!($idx))) } _ => panic!("Wrong registers for `ifn` operation"), } @@ -625,10 +645,10 @@ macro_rules! instr { (ifz $reg:ident[$idx:literal]) => { match $crate::_reg_block!($reg) { RegBlockAFR::A => { - Instr::Cmp(CmpOp::IfZA($crate::_reg_tya!(Reg, $reg), $crate::_reg_idx!($idx))) + Instr::Cmp(CmpOp::IfZA($crate::_reg_tya!($reg), $crate::_reg_idx!($idx))) } RegBlockAFR::R => { - Instr::Cmp(CmpOp::IfZR($crate::_reg_tyr!(Reg, $reg), $crate::_reg_idx!($idx))) + Instr::Cmp(CmpOp::IfZR($crate::_reg_tyr!($reg), $crate::_reg_idx!($idx))) } _ => panic!("Wrong registers for `ifz` operation"), } @@ -636,7 +656,7 @@ macro_rules! instr { (st. $flag:ident $reg:ident[$idx:literal]) => { Instr::Cmp(CmpOp::St( $crate::_merge_flag!($flag), - $crate::_reg_tya!(Reg, $reg), + $crate::_reg_tya!($reg), $crate::_reg_idx8!($idx), )) }; @@ -648,18 +668,18 @@ macro_rules! instr { match ($crate::_reg_block!($reg1), $crate::_reg_block!($dst_reg)) { (RegBlockAFR::A, RegBlockAFR::A) => Instr::Arithmetic(ArithmeticOp::AddA( $crate::_int_flags!($flag), - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::F, RegBlockAFR::F) => Instr::Arithmetic(ArithmeticOp::AddF( $crate::_rounding_flag!($flag), - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (a, b) if a == b => panic!("addition requires integer or float registers"), - (_, _) if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $dst_reg) => { + (_, _) if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($dst_reg) => { panic!("addition must be performed between registers of the same size") } (_, _) => panic!("addition must be performed between registers of the same type"), @@ -669,18 +689,18 @@ macro_rules! instr { match ($crate::_reg_block!($reg1), $crate::_reg_block!($dst_reg)) { (RegBlockAFR::A, RegBlockAFR::A) => Instr::Arithmetic(ArithmeticOp::SubA( $crate::_int_flags!($flag), - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::F, RegBlockAFR::F) => Instr::Arithmetic(ArithmeticOp::SubF( $crate::_rounding_flag!($flag), - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (a, b) if a == b => panic!("subtraction requires integer or float registers"), - (_, _) if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $dst_reg) => { + (_, _) if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($dst_reg) => { panic!("subtraction must be performed between registers of the same size") } (_, _) => panic!("subtraction must be performed between registers of the same type"), @@ -690,18 +710,18 @@ macro_rules! instr { match ($crate::_reg_block!($reg1), $crate::_reg_block!($dst_reg)) { (RegBlockAFR::A, RegBlockAFR::A) => Instr::Arithmetic(ArithmeticOp::MulA( $crate::_int_flags!($flag), - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::F, RegBlockAFR::F) => Instr::Arithmetic(ArithmeticOp::MulF( $crate::_rounding_flag!($flag), - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (a, b) if a == b => panic!("multiplication requires integer or float registers"), - (_, _) if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $dst_reg) => { + (_, _) if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($dst_reg) => { panic!("multiplication must be performed between registers of the same size") } (_, _) => panic!("multiplication must be performed between registers of the same type"), @@ -711,18 +731,18 @@ macro_rules! instr { match ($crate::_reg_block!($reg1), $crate::_reg_block!($dst_reg)) { (RegBlockAFR::A, RegBlockAFR::A) => Instr::Arithmetic(ArithmeticOp::DivA( $crate::_int_flags!($flag), - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (RegBlockAFR::F, RegBlockAFR::F) => Instr::Arithmetic(ArithmeticOp::DivF( $crate::_rounding_flag!($flag), - $crate::_reg_tyf!(Reg, $reg1), + $crate::_reg_tyf!($reg1), $crate::_reg_idx!($idx1), $crate::_reg_idx!($dst_idx), )), (a, b) if a == b => panic!("division requires integer or float registers"), - (_, _) if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $dst_reg) => { + (_, _) if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($dst_reg) => { panic!("division must be performed between registers of the same size") } (_, _) => panic!("division must be performed between registers of the same type"), @@ -735,50 +755,50 @@ macro_rules! instr { panic!("modulo division must be performed only using integer arithmetic registers"); } else { Instr::Arithmetic(ArithmeticOp::Rem( - $crate::_reg_tya!(Reg, $reg1), + $crate::_reg_tya!($reg1), $crate::_reg_idx!($idx1), - $crate::_reg_tya!(Reg, $dst_reg), + $crate::_reg_tya!($dst_reg), $crate::_reg_idx!($dst_idx), )) } }; (inc $reg:ident[$idx:literal]) => { Instr::Arithmetic(ArithmeticOp::Stp( - $crate::_reg_tya!(Reg, $reg), + $crate::_reg_tya!($reg), $crate::_reg_idx!($idx), Step::with(1), )) }; (add $reg:ident[$idx:literal], $step:literal) => { Instr::Arithmetic(ArithmeticOp::Stp( - $crate::_reg_tya!(Reg, $reg), + $crate::_reg_tya!($reg), $crate::_reg_idx!($idx), Step::with($step), )) }; (dec $reg:ident[$idx:literal]) => { Instr::Arithmetic(ArithmeticOp::Stp( - $crate::_reg_tya!(Reg, $reg), + $crate::_reg_tya!($reg), $crate::_reg_idx!($idx), Step::with(-1), )) }; (sub $reg:ident[$idx:literal], $step:literal) => { Instr::Arithmetic(ArithmeticOp::Stp( - $crate::_reg_tya!(Reg, $reg), + $crate::_reg_tya!($reg), $crate::_reg_idx!($idx), Step::with($step * -1), )) }; (neg $reg:ident[$idx:literal]) => { Instr::Arithmetic(ArithmeticOp::Neg( - $crate::_reg_ty!(Reg, $reg).into(), + $crate::_reg_ty!($reg).into(), $crate::_reg_idx16!($idx), )) }; (abs $reg:ident[$idx:literal]) => { Instr::Arithmetic(ArithmeticOp::Abs( - $crate::_reg_ty!(Reg, $reg).into(), + $crate::_reg_ty!($reg).into(), $crate::_reg_idx16!($idx), )) }; @@ -789,8 +809,8 @@ macro_rules! instr { $reg2:ident[$idx2:literal], $dst_reg:ident[$dst_idx:literal] ) => { - if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $reg2) - || $crate::_reg_ty!(Reg, $reg2) != $crate::_reg_ty!(Reg, $dst_reg) + if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($reg2) + || $crate::_reg_ty!($reg2) != $crate::_reg_ty!($dst_reg) { panic!("`and` operation must use the same type of registers for all of its operands"); } else if $crate::_reg_block!($reg1) != RegBlockAFR::A @@ -799,7 +819,7 @@ macro_rules! instr { panic!("`and` operation requires integer arithmetic or generic registers"); } else { Instr::Bitwise(BitwiseOp::And( - $crate::_reg_ty!(Reg, $reg1).into(), + $crate::_reg_ty!($reg1).into(), $crate::_reg_idx16!($idx1), $crate::_reg_idx16!($idx2), $crate::_reg_idx16!($dst_idx), @@ -809,8 +829,8 @@ macro_rules! instr { ( or $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal], $dst_reg:ident[$dst_idx:literal] ) => { - if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $reg2) - || $crate::_reg_ty!(Reg, $reg2) != $crate::_reg_ty!(Reg, $dst_reg) + if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($reg2) + || $crate::_reg_ty!($reg2) != $crate::_reg_ty!($dst_reg) { panic!("`or` operation must use the same type of registers for all of its operands"); } else if $crate::_reg_block!($reg1) != RegBlockAFR::A @@ -819,7 +839,7 @@ macro_rules! instr { panic!("`or` operation requires integer arithmetic or generic registers"); } else { Instr::Bitwise(BitwiseOp::Or( - $crate::_reg_ty!(Reg, $reg1).into(), + $crate::_reg_ty!($reg1).into(), $crate::_reg_idx16!($idx1), $crate::_reg_idx16!($idx2), $crate::_reg_idx16!($dst_idx), @@ -832,8 +852,8 @@ macro_rules! instr { $reg2:ident[$idx2:literal], $dst_reg:ident[$dst_idx:literal] ) => { - if $crate::_reg_ty!(Reg, $reg1) != $crate::_reg_ty!(Reg, $reg2) - || $crate::_reg_ty!(Reg, $reg2) != $crate::_reg_ty!(Reg, $dst_reg) + if $crate::_reg_ty!($reg1) != $crate::_reg_ty!($reg2) + || $crate::_reg_ty!($reg2) != $crate::_reg_ty!($dst_reg) { panic!("`xor` operation must use the same type of registers for all of its operands"); } else if $crate::_reg_block!($reg1) != RegBlockAFR::A @@ -842,7 +862,7 @@ macro_rules! instr { panic!("`xor` operation requires integer arithmetic or generic registers"); } else { Instr::Bitwise(BitwiseOp::Xor( - $crate::_reg_ty!(Reg, $reg1).into(), + $crate::_reg_ty!($reg1).into(), $crate::_reg_idx16!($idx1), $crate::_reg_idx16!($idx2), $crate::_reg_idx16!($dst_idx), @@ -851,62 +871,62 @@ macro_rules! instr { }; (shl $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => { Instr::Bitwise(BitwiseOp::Shl( - $crate::_reg_tya2!(Reg, $reg1), + $crate::_reg_tya2!($reg1), $crate::_reg_idx!($idx1), - $crate::_reg_ty!(Reg, $reg2).into(), + $crate::_reg_ty!($reg2).into(), $crate::_reg_idx!($idx2), )) }; (shr.u $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => { Instr::Bitwise(BitwiseOp::ShrA( SignFlag::Unsigned, - $crate::_reg_tya2!(Reg, $reg1), + $crate::_reg_tya2!($reg1), $crate::_reg_idx16!($idx1), - $crate::_reg_ty!(Reg, $reg2), + $crate::_reg_ty!($reg2), $crate::_reg_idx!($idx2), )) }; (shr.s $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => { Instr::Bitwise(BitwiseOp::ShrA( SignFlag::Signed, - $crate::_reg_tya2!(Reg, $reg1), + $crate::_reg_tya2!($reg1), $crate::_reg_idx16!($idx1), - $crate::_reg_ty!(Reg, $reg2), + $crate::_reg_ty!($reg2), $crate::_reg_idx!($idx2), )) }; (shr $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => {{ Instr::Bitwise(BitwiseOp::ShrR( - $crate::_reg_tya2!(Reg, $reg1), + $crate::_reg_tya2!($reg1), $crate::_reg_idx!($idx1), - $crate::_reg_ty!(Reg, $reg2), + $crate::_reg_ty!($reg2), $crate::_reg_idx!($idx2), )) }}; (scl $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => { Instr::Bitwise(BitwiseOp::Scl( - $crate::_reg_tya2!(Reg, $reg1), + $crate::_reg_tya2!($reg1), $crate::_reg_idx!($idx1), - $crate::_reg_ty!(Reg, $reg2).into(), + $crate::_reg_ty!($reg2).into(), $crate::_reg_idx!($idx2), )) }; (scr $reg1:ident[$idx1:literal], $reg2:ident[$idx2:literal]) => { Instr::Bitwise(BitwiseOp::Scr( - $crate::_reg_tya2!(Reg, $reg1), + $crate::_reg_tya2!($reg1), $crate::_reg_idx!($idx1), - $crate::_reg_ty!(Reg, $reg2).into(), + $crate::_reg_ty!($reg2).into(), $crate::_reg_idx!($idx2), )) }; (rev $reg:ident[$idx:literal]) => { match $crate::_reg_block!($reg) { RegBlockAFR::A => Instr::Bitwise(BitwiseOp::RevA( - $crate::_reg_tya!(Reg, $reg), + $crate::_reg_tya!($reg), $crate::_reg_idx!($idx), )), RegBlockAFR::R => Instr::Bitwise(BitwiseOp::RevR( - $crate::_reg_tyr!(Reg, $reg), + $crate::_reg_tyr!($reg), $crate::_reg_idx!($idx), )), _ => panic!("Wrong registers for `rev` operation"), @@ -941,7 +961,7 @@ macro_rules! instr { $src_reg:ident[$src_idx:literal], $dst_reg:ident[$dst_idx:literal] ) => { - if $crate::_reg_ty!(Reg, $src_reg) != $crate::_reg_ty!(Reg, $dst_reg) { + if $crate::_reg_ty!($src_reg) != $crate::_reg_ty!($dst_reg) { panic!("ecmul instruction can be used only with registers of the same type"); } else { Instr::Secp256k1(Secp256k1Op::Mul( @@ -1111,200 +1131,200 @@ macro_rules! _reg_block { #[doc(hidden)] #[macro_export] macro_rules! _reg_sfx { - ($a:ident, $b:ident,a8) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a8) => { + $a }; - ($a:ident, $b:ident,a16) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a16) => { + $a }; - ($a:ident, $b:ident,a32) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a32) => { + $a }; - ($a:ident, $b:ident,a64) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a64) => { + $a }; - ($a:ident, $b:ident,a128) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a128) => { + $a }; - ($a:ident, $b:ident,a256) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a256) => { + $a }; - ($a:ident, $b:ident,a512) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a512) => { + $a }; - ($a:ident, $b:ident,a1024) => { - $crate::paste! { $a :: [<$b A>] } + ($a:expr, $f:expr, $r:expr,a1024) => { + $a }; - ($a:ident, $b:ident,f16b) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f16b) => { + $f }; - ($a:ident, $b:ident,f16) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f16) => { + $f }; - ($a:ident, $b:ident,f32) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f32) => { + $f }; - ($a:ident, $b:ident,f64) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f64) => { + $f }; - ($a:ident, $b:ident,f80) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f80) => { + $f }; - ($a:ident, $b:ident,f128) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f128) => { + $f }; - ($a:ident, $b:ident,f256) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f256) => { + $f }; - ($a:ident, $b:ident,f512) => { - $crate::paste! { $a :: [<$b F>] } + ($a:expr, $f:expr, $r:expr,f512) => { + $f }; - ($a:ident, $b:ident,r128) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r128) => { + $r }; - ($a:ident, $b:ident,r160) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r160) => { + $r }; - ($a:ident, $b:ident,r256) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r256) => { + $r }; - ($a:ident, $b:ident,r512) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r512) => { + $r }; - ($a:ident, $b:ident,r1024) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r1024) => { + $r }; - ($a:ident, $b:ident,r2048) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r2048) => { + $r }; - ($a:ident, $b:ident,r4096) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r4096) => { + $r }; - ($a:ident, $b:ident,r8192) => { - $crate::paste! { $a :: [<$b R>] } + ($a:expr, $f:expr, $r:expr,r8192) => { + $r }; } #[doc(hidden)] #[macro_export] macro_rules! _reg_ty { - ($ident:ident,a8) => { - $crate::paste! { [<$ident A>] :: A8 } + (a8) => { + RegA::A8 }; - ($ident:ident,a16) => { - $crate::paste! { [<$ident A>] :: A16 } + (a16) => { + RegA::A16 }; - ($ident:ident,a32) => { - $crate::paste! { [<$ident A>] :: A32 } + (a32) => { + RegA::A32 }; - ($ident:ident,a64) => { - $crate::paste! { [<$ident A>] :: A64 } + (a64) => { + RegA::A64 }; - ($ident:ident,a128) => { - $crate::paste! { [<$ident A>] :: A128 } + (a128) => { + RegA::A128 }; - ($ident:ident,a256) => { - $crate::paste! { [<$ident A>] :: A256 } + (a256) => { + RegA::A256 }; - ($ident:ident,a512) => { - $crate::paste! { [<$ident A>] :: A512 } + (a512) => { + RegA::A512 }; - ($ident:ident,a1024) => { - $crate::paste! { [<$ident A>] :: A1024 } + (a1024) => { + RegA::A1024 }; - ($ident:ident,f16b) => { - $crate::paste! { [<$ident F>] :: F16B } + (f16b) => { + RegF::F16B }; - ($ident:ident,f16) => { - $crate::paste! { [<$ident F>] :: F16 } + (f16) => { + RegF::F16 }; - ($ident:ident,f32) => { - $crate::paste! { [<$ident F>] :: F32 } + (f32) => { + RegF::F32 }; - ($ident:ident,f64) => { - $crate::paste! { [<$ident F>] :: F64 } + (f64) => { + RegF::F64 }; - ($ident:ident,f80) => { - $crate::paste! { [<$ident F>] :: F80 } + (f80) => { + RegF::F80 }; - ($ident:ident,f128) => { - $crate::paste! { [<$ident F>] :: F128 } + (f128) => { + RegF::F128 }; - ($ident:ident,f256) => { - $crate::paste! { [<$ident F>] :: F256 } + (f256) => { + RegF::F256 }; - ($ident:ident,f512) => { - $crate::paste! { [<$ident F>] :: F512 } + (f512) => { + RegF::F512 }; - ($ident:ident,r128) => { - $crate::paste! { [<$ident R>] :: R128 } + (r128) => { + RegR::R128 }; - ($ident:ident,r160) => { - $crate::paste! { [<$ident R>] :: R160 } + (r160) => { + RegR::R160 }; - ($ident:ident,r256) => { - $crate::paste! { [<$ident R>] :: R256 } + (r256) => { + RegR::R256 }; - ($ident:ident,r512) => { - $crate::paste! { [<$ident R>] :: R512 } + (r512) => { + RegR::R512 }; - ($ident:ident,r1024) => { - $crate::paste! { [<$ident R>] :: R1024 } + (r1024) => { + RegR::R1024 }; - ($ident:ident,r2048) => { - $crate::paste! { [<$ident R>] :: R2048 } + (r2048) => { + RegR::R2048 }; - ($ident:ident,r4096) => { - $crate::paste! { [<$ident R>] :: R4096 } + (r4096) => { + RegR::R4096 }; - ($ident:ident,r8192) => { - $crate::paste! { [<$ident R>] :: R8192 } + (r8192) => { + RegR::R8192 }; } #[doc(hidden)] #[macro_export] macro_rules! _reg_tya2 { - ($ident:ident,a8) => { - $crate::paste! { [<$ident A2>] :: A8 } + (a8) => { + RegA2::A8 }; - ($ident:ident,a16) => { - $crate::paste! { [<$ident A2>] :: A16 } + (a16) => { + RegA2::A16 }; } #[doc(hidden)] #[macro_export] macro_rules! _reg_tya { - ($ident:ident,a8) => { - $crate::paste! { [<$ident A>] :: A8 } + (a8) => { + RegA::A8 }; - ($ident:ident,a16) => { - $crate::paste! { [<$ident A>] :: A16 } + (a16) => { + RegA::A16 }; - ($ident:ident,a32) => { - $crate::paste! { [<$ident A>] :: A32 } + (a32) => { + RegA::A32 }; - ($ident:ident,a64) => { - $crate::paste! { [<$ident A>] :: A64 } + (a64) => { + RegA::A64 }; - ($ident:ident,a128) => { - $crate::paste! { [<$ident A>] :: A128 } + (a128) => { + RegA::A128 }; - ($ident:ident,a256) => { - $crate::paste! { [<$ident A>] :: A256 } + (a256) => { + RegA::A256 }; - ($ident:ident,a512) => { - $crate::paste! { [<$ident A>] :: A512 } + (a512) => { + RegA::A512 }; - ($ident:ident,a1024) => { - $crate::paste! { [<$ident A>] :: A1024 } + (a1024) => { + RegA::A1024 }; - ($ident:ident, $other:ident) => { + ($other:ident) => { panic!("operation requires `A` register") }; } @@ -1312,31 +1332,31 @@ macro_rules! _reg_tya { #[doc(hidden)] #[macro_export] macro_rules! _reg_tyf { - ($ident:ident,f16b) => { - $crate::paste! { [<$ident F>] :: F16B } + (f16b) => { + RegF::F16B }; - ($ident:ident,f16) => { - $crate::paste! { [<$ident F>] :: F16 } + (f16) => { + RegF::F16 }; - ($ident:ident,f32) => { - $crate::paste! { [<$ident F>] :: F32 } + (f32) => { + RegF::F32 }; - ($ident:ident,f64) => { - $crate::paste! { [<$ident F>] :: F64 } + (f64) => { + RegF::F64 }; - ($ident:ident,f80) => { - $crate::paste! { [<$ident F>] :: F80 } + (f80) => { + RegF::F80 }; - ($ident:ident,f128) => { - $crate::paste! { [<$ident F>] :: F128 } + (f128) => { + RegF::F128 }; - ($ident:ident,f256) => { - $crate::paste! { [<$ident F>] :: F256 } + (f256) => { + RegF::F256 }; - ($ident:ident,f512) => { - $crate::paste! { [<$ident F>] :: F512 } + (f512) => { + RegF::F512 }; - ($ident:ident, $other:ident) => { + ($other:ident) => { panic!("operation requires `F` register") }; } @@ -1344,31 +1364,31 @@ macro_rules! _reg_tyf { #[doc(hidden)] #[macro_export] macro_rules! _reg_tyr { - ($ident:ident,r128) => { - $crate::paste! { [<$ident R>] :: R128 } + (r128) => { + RegR::R128 }; - ($ident:ident,r160) => { - $crate::paste! { [<$ident R>] :: R160 } + (r160) => { + RegR::R160 }; - ($ident:ident,r256) => { - $crate::paste! { [<$ident R>] :: R256 } + (r256) => { + RegR::R256 }; - ($ident:ident,r512) => { - $crate::paste! { [<$ident R>] :: R512 } + (r512) => { + RegR::R512 }; - ($ident:ident,r1024) => { - $crate::paste! { [<$ident R>] :: R1024 } + (r1024) => { + RegR::R1024 }; - ($ident:ident,r2048) => { - $crate::paste! { [<$ident R>] :: R2048 } + (r2048) => { + RegR::R2048 }; - ($ident:ident,r4096) => { - $crate::paste! { [<$ident R>] :: R4096 } + (r4096) => { + RegR::R4096 }; - ($ident:ident,r8192) => { - $crate::paste! { [<$ident R>] :: R8192 } + (r8192) => { + RegR::R8192 }; - ($ident:ident, $other:ident) => { + ($other:ident) => { panic!("operation requires `R` register") }; } @@ -1430,25 +1450,31 @@ macro_rules! _reg_tyar { #[doc(hidden)] #[macro_export] macro_rules! _reg_idx { - ($idx:literal) => { - $crate::paste! { Reg32::[] } - }; + ($idx:literal) => {{ + // indexing a const array gives a compile-time error on out-of-range indexes + const IDX: Reg32 = Reg32::ALL[$idx]; + IDX + }}; } #[doc(hidden)] #[macro_export] macro_rules! _reg_idx8 { - ($idx:literal) => { - $crate::paste! { Reg8::[] } - }; + ($idx:literal) => {{ + // indexing a const array gives a compile-time error on out-of-range indexes + const IDX: Reg8 = Reg8::ALL[$idx]; + IDX + }}; } #[doc(hidden)] #[macro_export] macro_rules! _reg_idx16 { - ($idx:literal) => { - $crate::paste! { Reg16::[] } - }; + ($idx:literal) => {{ + // indexing a const array gives a compile-time error on out-of-range indexes + const IDX: Reg16 = Reg16::ALL[$idx]; + IDX + }}; } #[doc(hidden)] diff --git a/src/lib.rs b/src/lib.rs index 279b4eb..0d71e8f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -168,8 +168,6 @@ mod vm; pub use isa::Isa; #[cfg(feature = "ascii-armor")] pub use library::LibArmorError; -#[doc(hidden)] -pub use paste::paste; pub use vm::Vm; /// Struct types library name. diff --git a/src/library/lib.rs b/src/library/lib.rs index 3ebec1c..63e4a11 100644 --- a/src/library/lib.rs +++ b/src/library/lib.rs @@ -68,6 +68,7 @@ pub const LIB_ID_TAG: [u8; 32] = *b"urn:ubideco:aluvm:lib:v01#230304"; pub struct LibId( #[from] #[from([u8; 32])] + #[cfg_attr(feature = "serde", serde(with = "strict_encoding::serde_helpers::byte_array"))] Bytes32, ); impl DefaultBasedStrictDumb for LibId {} @@ -133,8 +134,10 @@ pub struct Lib { /// ISA segment pub isae: IsaSeg, /// Code segment + #[cfg_attr(feature = "serde", serde(with = "strict_encoding::serde_helpers::confined"))] pub code: SmallBlob, /// Data segment + #[cfg_attr(feature = "serde", serde(with = "strict_encoding::serde_helpers::confined"))] pub data: SmallBlob, /// Libs segment pub libs: LibSeg, diff --git a/src/library/segs.rs b/src/library/segs.rs index 8484946..7d8e1f5 100644 --- a/src/library/segs.rs +++ b/src/library/segs.rs @@ -104,7 +104,10 @@ impl_ident_subtype!(IsaName); derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct IsaSeg(Confined, 0, ISAE_SEGMENT_MAX_COUNT>); +pub struct IsaSeg( + #[cfg_attr(feature = "serde", serde(with = "strict_encoding::serde_helpers::confined"))] + Confined, 0, ISAE_SEGMENT_MAX_COUNT>, +); impl DefaultBasedStrictDumb for IsaSeg {} impl IsaSeg { @@ -199,7 +202,10 @@ impl FromStr for IsaSeg { derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct LibSeg(Confined, 0, LIBS_SEGMENT_MAX_COUNT>); +pub struct LibSeg( + #[cfg_attr(feature = "serde", serde(with = "strict_encoding::serde_helpers::confined"))] + Confined, 0, LIBS_SEGMENT_MAX_COUNT>, +); impl DefaultBasedStrictDumb for LibSeg {} impl LibSeg {