forked from libre-chip/cpu
implement decoding extswsli[.]
This commit is contained in:
parent
faa8dde774
commit
167bc4b6a6
3 changed files with 1250 additions and 104 deletions
|
|
@ -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`
|
/// for `mcrxrx`
|
||||||
#[hdl]
|
#[hdl]
|
||||||
fn decode_mcrxrx(&mut self) {
|
fn decode_mcrxrx(&mut self) {
|
||||||
|
|
@ -2279,8 +2310,8 @@ const DECODE_FNS: &[(&[&str], DecodeFn)] = &[
|
||||||
],
|
],
|
||||||
|state| DecodeState::decode_shift(state),
|
|state| DecodeState::decode_shift(state),
|
||||||
),
|
),
|
||||||
(&["extswsli", "extswsli."], |_state| {
|
(&["extswsli", "extswsli."], |state| {
|
||||||
// TODO
|
DecodeState::decode_extswsli(state)
|
||||||
}),
|
}),
|
||||||
(&["cdtbcd", "cbcdtd", "addg6s"], |_state| {
|
(&["cdtbcd", "cbcdtd", "addg6s"], |_state| {
|
||||||
// TODO
|
// TODO
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -360,5 +360,86 @@ pub fn test_cases_book_i_3_3_14_fixed_point_rotate_and_shift(retval: &mut Vec<Te
|
||||||
0x7c832e34;
|
0x7c832e34;
|
||||||
ShiftSigned64;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue