machinst x64: add support for rotations;

This commit is contained in:
Benjamin Bouvier
2020-07-03 15:47:57 +02:00
parent 22892466e7
commit 571061fe4c
4 changed files with 49 additions and 8 deletions

View File

@@ -509,6 +509,8 @@ pub enum ShiftKind {
Left,
RightZ,
RightS,
RotateLeft,
RotateRight,
}
impl fmt::Debug for ShiftKind {
@@ -517,6 +519,8 @@ impl fmt::Debug for ShiftKind {
ShiftKind::Left => "shl",
ShiftKind::RightZ => "shr",
ShiftKind::RightS => "sar",
ShiftKind::RotateLeft => "rol",
ShiftKind::RotateRight => "ror",
};
write!(fmt, "{}", name)
}

View File

@@ -925,6 +925,8 @@ pub(crate) fn emit(
} => {
let enc_dst = int_reg_enc(dst.to_reg());
let subopcode = match kind {
ShiftKind::RotateLeft => 0,
ShiftKind::RotateRight => 1,
ShiftKind::Left => 4,
ShiftKind::RightZ => 5,
ShiftKind::RightS => 7,

View File

@@ -2258,6 +2258,26 @@ fn test_x64_emit() {
"49C1FD3F",
"sarq $63, %r13",
));
insns.push((
Inst::shift_r(true, ShiftKind::RotateLeft, None, w_r8),
"49D3C0",
"rolq %cl, %r8",
));
insns.push((
Inst::shift_r(false, ShiftKind::RotateLeft, Some(3), w_r9),
"41C1C103",
"roll $3, %r9d",
));
insns.push((
Inst::shift_r(false, ShiftKind::RotateRight, None, w_rsi),
"D3CE",
"rorl %cl, %esi",
));
insns.push((
Inst::shift_r(true, ShiftKind::RotateRight, Some(5), w_r15),
"49C1CF05",
"rorq $5, %r15",
));
// ========================================================
// CmpRMIR