Skip to content

Commit 373228f

Browse files
committed
bytes-extr on aluasm!
1 parent 3d01120 commit 373228f

4 files changed

Lines changed: 31 additions & 46 deletions

File tree

src/isa/asm.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,14 @@ macro_rules! instr {
166166
))
167167
};
168168

169+
(extr s16[$idx:literal], $regr:ident[$regr_idx:literal],a16[$offset_idx:literal]) => {
170+
Instr::Bytes(BytesOp::Extr(
171+
RegS::from($idx),
172+
$crate::_reg_ty!(Reg, $regr),
173+
$crate::_reg_idx16!($regr_idx),
174+
$crate::_reg_idx16!($offset_idx),
175+
))
176+
};
169177
(put s16[$idx:literal], $val:literal) => {{
170178
Instr::Bytes(BytesOp::Put(RegS::from($idx), Box::new(ByteStr::with($val)), false))
171179
}};

src/isa/exec.rs

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,55 +1052,10 @@ impl InstructionSet for ReservedOp {
10521052
#[cfg(test)]
10531053
mod tests {
10541054
use super::*;
1055-
use crate::data::Layout;
10561055
use crate::reg::Reg16;
10571056
#[cfg(feature = "secp256k1")]
10581057
use crate::reg::{Reg8, RegBlockAR};
10591058

1060-
#[test]
1061-
fn bytes_extr_test() {
1062-
let mut register = CoreRegs::default();
1063-
let lib_site = LibSite::default();
1064-
let mut bytes = [0; u16::MAX as usize];
1065-
let offset = 5;
1066-
let s = "hello";
1067-
for (i, e) in s.as_bytes().iter().enumerate() {
1068-
bytes[offset + i] = *e;
1069-
}
1070-
BytesOp::Put(1.into(), Box::new(ByteStr::with(bytes)), false).exec(
1071-
&mut register,
1072-
lib_site,
1073-
&(),
1074-
);
1075-
PutOp::PutA(RegA::A16, Reg32::Reg0, MaybeNumber::from(offset as u16).into()).exec(
1076-
&mut register,
1077-
lib_site,
1078-
&(),
1079-
);
1080-
BytesOp::Extr(1.into(), RegR::R128, Reg16::Reg0, Reg16::Reg0).exec(
1081-
&mut register,
1082-
lib_site,
1083-
&(),
1084-
);
1085-
let mut num = register.get(RegR::R128, Reg32::Reg0).unwrap();
1086-
num.reshape(Layout::unsigned(s.len() as u16));
1087-
assert_eq!(num, Number::from_slice(s.as_bytes()));
1088-
PutOp::PutA(RegA::A16, Reg32::Reg1, MaybeNumber::from(offset as u16 + 1).into()).exec(
1089-
&mut register,
1090-
lib_site,
1091-
&(),
1092-
);
1093-
BytesOp::Extr(1.into(), RegR::R128, Reg16::Reg1, Reg16::Reg1).exec(
1094-
&mut register,
1095-
lib_site,
1096-
&(),
1097-
);
1098-
let mut num = register.get(RegR::R128, Reg32::Reg1).unwrap();
1099-
num.reshape(Layout::unsigned(s.len() as u16 - 1));
1100-
assert_eq!(num, Number::from_slice("ello".as_bytes()));
1101-
assert!(register.st0);
1102-
}
1103-
11041059
#[test]
11051060
fn bytes_extr_offset_overflow_test() {
11061061
let mut register = CoreRegs::default();

src/isa/instr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ pub enum BytesOp {
696696
///
697697
/// If the source string register - or offset register is uninitialized, sets destination to
698698
/// uninitialized state and `st0` to `false`.
699-
#[display("extr {0},{1}{2},{1}{3}")]
699+
#[display("extr {0},{1}{2},a16[{3}]")]
700700
Extr(/** `s` register index */ RegS, RegR, Reg16, /** `a16` register with offset */ Reg16),
701701

702702
/// Inject general `R` register value at a given position to string register, replacing value

tests/asm.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,28 @@ fn bytes_put() {
212212
run(code, false);
213213
}
214214

215+
#[test]
216+
fn bytes_extr() {
217+
let code = aluasm! {
218+
put s16[0],"################@@@@@@";
219+
put 0,a16[0];
220+
extr s16[0],r128[0],a16[0];
221+
put 0x23232323232323232323232323232323,r128[1];
222+
eq.n r128[0],r128[1];
223+
ret;
224+
};
225+
run(code, true);
226+
let code = aluasm! {
227+
put s16[0],"################@@@@@@";
228+
put 3,a16[0];
229+
extr s16[0],r128[0],a16[0];
230+
put 0x40404023232323232323232323232323,r128[1];
231+
eq.n r128[0],r128[1];
232+
ret;
233+
};
234+
run(code, true);
235+
}
236+
215237
fn run(code: Vec<Instr>, expect_success: bool) {
216238
let mut runtime = Vm::<Instr>::new();
217239

0 commit comments

Comments
 (0)