implement decoding extswsli[.]

This commit is contained in:
Jacob Lifshay 2026-01-26 19:18:44 -08:00
parent faa8dde774
commit 167bc4b6a6
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ
3 changed files with 1250 additions and 104 deletions

View file

@ -2044,6 +2044,37 @@ impl DecodeState<'_> {
);
}
}
/// for `extswsli[.]`
#[hdl]
fn decode_extswsli(&mut self) {
self.decode_scope(
|this, (FieldRA(ra), FieldRS(rs), FieldSh(sh), FieldRc(rc))| {
connect(
ArrayVec::len(this.output),
1usize.cast_to_static::<Length<_>>(),
);
connect(
this.output[0],
ShiftRotateMOp::shift_rotate(
MOpDestReg::new([gpr(ra)], [(MOpRegNum::POWER_ISA_CR_0_REG_NUM, rc)]),
[
gpr(rs).value,
MOpRegNum::const_zero().value,
MOpRegNum::const_zero().value,
],
#[hdl]
ShiftRotateMOpImm {
shift_rotate_amount: HdlSome(sh.rotate_right(1)),
shift_rotate_right: false,
dest_logic_op: HdlNone(),
},
OutputIntegerMode.Full64(),
ShiftRotateMode.SignExt32To64BitThenShift(),
),
);
},
);
}
/// for `mcrxrx`
#[hdl]
fn decode_mcrxrx(&mut self) {
@ -2279,8 +2310,8 @@ const DECODE_FNS: &[(&[&str], DecodeFn)] = &[
],
|state| DecodeState::decode_shift(state),
),
(&["extswsli", "extswsli."], |_state| {
// TODO
(&["extswsli", "extswsli."], |state| {
DecodeState::decode_extswsli(state)
}),
(&["cdtbcd", "cbcdtd", "addg6s"], |_state| {
// TODO

File diff suppressed because it is too large Load diff

View file

@ -360,5 +360,86 @@ pub fn test_cases_book_i_3_3_14_fixed_point_rotate_and_shift(retval: &mut Vec<Te
0x7c832e34;
ShiftSigned64;
}
// TODO: extswsli
macro_rules! extswsli {
(
$mnemonic:literal $dest:literal, $src:literal, $amount:literal;
$encoding:literal;
) => {{
retval.push(insn_single(
concat!(
$mnemonic,
" ",
stringify!($dest),
", ",
stringify!($src),
", ",
stringify!($amount)
),
$encoding,
None,
ShiftRotateMOp::shift_rotate(
MOpDestReg::new_sim(&[MOpRegNum::power_isa_gpr_reg_num($dest)], &[]),
[
MOpRegNum::power_isa_gpr_reg_imm($src).value,
MOpRegNum::const_zero().value,
MOpRegNum::const_zero().value,
],
shift_imm(Some($amount), false),
OutputIntegerMode.Full64(),
ShiftRotateMode.SignExt32To64BitThenShift(),
),
));
retval.push(insn_single(
concat!(
$mnemonic,
". ",
stringify!($dest),
", ",
stringify!($src),
", ",
stringify!($amount)
),
$encoding | 1,
None,
ShiftRotateMOp::shift_rotate(
MOpDestReg::new_sim(
&[MOpRegNum::power_isa_gpr_reg_num($dest)],
&[MOpRegNum::POWER_ISA_CR_0_REG_NUM],
),
[
MOpRegNum::power_isa_gpr_reg_imm($src).value,
MOpRegNum::const_zero().value,
MOpRegNum::const_zero().value,
],
shift_imm(Some($amount), false),
OutputIntegerMode.Full64(),
ShiftRotateMode.SignExt32To64BitThenShift(),
),
));
}};
}
extswsli! {
"extswsli" 3, 4, 0;
0x7c8306f4;
}
extswsli! {
"extswsli" 3, 4, 5;
0x7c832ef4;
}
extswsli! {
"extswsli" 3, 4, 16;
0x7c8386f4;
}
extswsli! {
"extswsli" 3, 4, 31;
0x7c83fef4;
}
extswsli! {
"extswsli" 3, 4, 32;
0x7c8306f6;
}
extswsli! {
"extswsli" 3, 4, 63;
0x7c83fef6;
}
}