Using an input register that doesn't belong to the ABCD family (al, etc.) as the source of movsx/movzx requires a redundant REX prefix, that was not emitted.
3201 lines
88 KiB
Rust
3201 lines
88 KiB
Rust
//! Tests for the emitter
|
|
//!
|
|
//! See comments at the top of `fn x64_emit` for advice on how to create reliable test cases.
|
|
//!
|
|
//! to see stdout: cargo test -- --nocapture
|
|
//!
|
|
//! for this specific case:
|
|
//!
|
|
//! (cd cranelift/codegen && \
|
|
//! RUST_BACKTRACE=1 cargo test isa::x64::inst::test_x64_insn_encoding_and_printing -- --nocapture)
|
|
|
|
use alloc::vec::Vec;
|
|
|
|
use super::*;
|
|
use crate::isa::test_utils;
|
|
|
|
#[test]
|
|
fn test_x64_emit() {
|
|
let rax = regs::rax();
|
|
let rbx = regs::rbx();
|
|
let rcx = regs::rcx();
|
|
let rdx = regs::rdx();
|
|
let rsi = regs::rsi();
|
|
let rdi = regs::rdi();
|
|
let rsp = regs::rsp();
|
|
let rbp = regs::rbp();
|
|
let r8 = regs::r8();
|
|
let r9 = regs::r9();
|
|
let r10 = regs::r10();
|
|
let r11 = regs::r11();
|
|
let r12 = regs::r12();
|
|
let r13 = regs::r13();
|
|
let r14 = regs::r14();
|
|
let r15 = regs::r15();
|
|
|
|
let xmm0 = regs::xmm0();
|
|
let xmm1 = regs::xmm1();
|
|
let xmm2 = regs::xmm2();
|
|
let xmm3 = regs::xmm3();
|
|
let xmm4 = regs::xmm4();
|
|
let xmm5 = regs::xmm5();
|
|
let xmm6 = regs::xmm6();
|
|
let xmm7 = regs::xmm7();
|
|
let xmm8 = regs::xmm8();
|
|
let xmm9 = regs::xmm9();
|
|
let xmm10 = regs::xmm10();
|
|
let xmm11 = regs::xmm11();
|
|
let xmm12 = regs::xmm12();
|
|
let xmm13 = regs::xmm13();
|
|
let xmm14 = regs::xmm14();
|
|
let xmm15 = regs::xmm15();
|
|
|
|
// And Writable<> versions of the same:
|
|
let w_rax = Writable::<Reg>::from_reg(rax);
|
|
let w_rbx = Writable::<Reg>::from_reg(rbx);
|
|
let w_rcx = Writable::<Reg>::from_reg(rcx);
|
|
let w_rdx = Writable::<Reg>::from_reg(rdx);
|
|
let w_rsi = Writable::<Reg>::from_reg(rsi);
|
|
let w_rdi = Writable::<Reg>::from_reg(rdi);
|
|
let _w_rsp = Writable::<Reg>::from_reg(rsp);
|
|
let _w_rbp = Writable::<Reg>::from_reg(rbp);
|
|
let w_r8 = Writable::<Reg>::from_reg(r8);
|
|
let w_r9 = Writable::<Reg>::from_reg(r9);
|
|
let _w_r10 = Writable::<Reg>::from_reg(r10);
|
|
let w_r11 = Writable::<Reg>::from_reg(r11);
|
|
let w_r12 = Writable::<Reg>::from_reg(r12);
|
|
let w_r13 = Writable::<Reg>::from_reg(r13);
|
|
let w_r14 = Writable::<Reg>::from_reg(r14);
|
|
let w_r15 = Writable::<Reg>::from_reg(r15);
|
|
|
|
let w_xmm0 = Writable::<Reg>::from_reg(xmm0);
|
|
let w_xmm1 = Writable::<Reg>::from_reg(xmm1);
|
|
let w_xmm2 = Writable::<Reg>::from_reg(xmm2);
|
|
let w_xmm3 = Writable::<Reg>::from_reg(xmm3);
|
|
let w_xmm4 = Writable::<Reg>::from_reg(xmm4);
|
|
let _w_xmm5 = Writable::<Reg>::from_reg(xmm5);
|
|
let _w_xmm6 = Writable::<Reg>::from_reg(xmm6);
|
|
let w_xmm7 = Writable::<Reg>::from_reg(xmm7);
|
|
let w_xmm8 = Writable::<Reg>::from_reg(xmm8);
|
|
let w_xmm9 = Writable::<Reg>::from_reg(xmm9);
|
|
let w_xmm10 = Writable::<Reg>::from_reg(xmm10);
|
|
let w_xmm11 = Writable::<Reg>::from_reg(xmm11);
|
|
let w_xmm12 = Writable::<Reg>::from_reg(xmm12);
|
|
let w_xmm13 = Writable::<Reg>::from_reg(xmm13);
|
|
let w_xmm14 = Writable::<Reg>::from_reg(xmm14);
|
|
let w_xmm15 = Writable::<Reg>::from_reg(xmm15);
|
|
|
|
let mut insns = Vec::<(Inst, &str, &str)>::new();
|
|
|
|
// ========================================================
|
|
// Cases aimed at checking Addr-esses: IR (Imm + Reg)
|
|
//
|
|
// These are just a bunch of loads with all supported (by the emitter)
|
|
// permutations of address formats.
|
|
//
|
|
// Addr_IR, offset zero
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rax), w_rdi, None),
|
|
"488B38",
|
|
"movq 0(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rbx), w_rdi, None),
|
|
"488B3B",
|
|
"movq 0(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rcx), w_rdi, None),
|
|
"488B39",
|
|
"movq 0(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rdx), w_rdi, None),
|
|
"488B3A",
|
|
"movq 0(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rbp), w_rdi, None),
|
|
"488B7D00",
|
|
"movq 0(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rsp), w_rdi, None),
|
|
"488B3C24",
|
|
"movq 0(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rsi), w_rdi, None),
|
|
"488B3E",
|
|
"movq 0(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, rdi), w_rdi, None),
|
|
"488B3F",
|
|
"movq 0(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r8), w_rdi, None),
|
|
"498B38",
|
|
"movq 0(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r9), w_rdi, None),
|
|
"498B39",
|
|
"movq 0(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r10), w_rdi, None),
|
|
"498B3A",
|
|
"movq 0(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r11), w_rdi, None),
|
|
"498B3B",
|
|
"movq 0(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r12), w_rdi, None),
|
|
"498B3C24",
|
|
"movq 0(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r13), w_rdi, None),
|
|
"498B7D00",
|
|
"movq 0(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r14), w_rdi, None),
|
|
"498B3E",
|
|
"movq 0(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0, r15), w_rdi, None),
|
|
"498B3F",
|
|
"movq 0(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IR, offset max simm8
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rax), w_rdi, None),
|
|
"488B787F",
|
|
"movq 127(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rbx), w_rdi, None),
|
|
"488B7B7F",
|
|
"movq 127(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rcx), w_rdi, None),
|
|
"488B797F",
|
|
"movq 127(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rdx), w_rdi, None),
|
|
"488B7A7F",
|
|
"movq 127(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rbp), w_rdi, None),
|
|
"488B7D7F",
|
|
"movq 127(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rsp), w_rdi, None),
|
|
"488B7C247F",
|
|
"movq 127(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rsi), w_rdi, None),
|
|
"488B7E7F",
|
|
"movq 127(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, rdi), w_rdi, None),
|
|
"488B7F7F",
|
|
"movq 127(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r8), w_rdi, None),
|
|
"498B787F",
|
|
"movq 127(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r9), w_rdi, None),
|
|
"498B797F",
|
|
"movq 127(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r10), w_rdi, None),
|
|
"498B7A7F",
|
|
"movq 127(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r11), w_rdi, None),
|
|
"498B7B7F",
|
|
"movq 127(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r12), w_rdi, None),
|
|
"498B7C247F",
|
|
"movq 127(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r13), w_rdi, None),
|
|
"498B7D7F",
|
|
"movq 127(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r14), w_rdi, None),
|
|
"498B7E7F",
|
|
"movq 127(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(127, r15), w_rdi, None),
|
|
"498B7F7F",
|
|
"movq 127(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IR, offset min simm8
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rax), w_rdi, None),
|
|
"488B7880",
|
|
"movq -128(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rbx), w_rdi, None),
|
|
"488B7B80",
|
|
"movq -128(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rcx), w_rdi, None),
|
|
"488B7980",
|
|
"movq -128(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rdx), w_rdi, None),
|
|
"488B7A80",
|
|
"movq -128(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rbp), w_rdi, None),
|
|
"488B7D80",
|
|
"movq -128(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rsp), w_rdi, None),
|
|
"488B7C2480",
|
|
"movq -128(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rsi), w_rdi, None),
|
|
"488B7E80",
|
|
"movq -128(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, rdi), w_rdi, None),
|
|
"488B7F80",
|
|
"movq -128(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r8), w_rdi, None),
|
|
"498B7880",
|
|
"movq -128(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r9), w_rdi, None),
|
|
"498B7980",
|
|
"movq -128(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r10), w_rdi, None),
|
|
"498B7A80",
|
|
"movq -128(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r11), w_rdi, None),
|
|
"498B7B80",
|
|
"movq -128(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r12), w_rdi, None),
|
|
"498B7C2480",
|
|
"movq -128(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r13), w_rdi, None),
|
|
"498B7D80",
|
|
"movq -128(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r14), w_rdi, None),
|
|
"498B7E80",
|
|
"movq -128(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-128i32 as u32, r15), w_rdi, None),
|
|
"498B7F80",
|
|
"movq -128(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IR, offset smallest positive simm32
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rax), w_rdi, None),
|
|
"488BB880000000",
|
|
"movq 128(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rbx), w_rdi, None),
|
|
"488BBB80000000",
|
|
"movq 128(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rcx), w_rdi, None),
|
|
"488BB980000000",
|
|
"movq 128(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rdx), w_rdi, None),
|
|
"488BBA80000000",
|
|
"movq 128(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rbp), w_rdi, None),
|
|
"488BBD80000000",
|
|
"movq 128(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rsp), w_rdi, None),
|
|
"488BBC2480000000",
|
|
"movq 128(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rsi), w_rdi, None),
|
|
"488BBE80000000",
|
|
"movq 128(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, rdi), w_rdi, None),
|
|
"488BBF80000000",
|
|
"movq 128(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r8), w_rdi, None),
|
|
"498BB880000000",
|
|
"movq 128(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r9), w_rdi, None),
|
|
"498BB980000000",
|
|
"movq 128(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r10), w_rdi, None),
|
|
"498BBA80000000",
|
|
"movq 128(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r11), w_rdi, None),
|
|
"498BBB80000000",
|
|
"movq 128(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r12), w_rdi, None),
|
|
"498BBC2480000000",
|
|
"movq 128(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r13), w_rdi, None),
|
|
"498BBD80000000",
|
|
"movq 128(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r14), w_rdi, None),
|
|
"498BBE80000000",
|
|
"movq 128(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(128, r15), w_rdi, None),
|
|
"498BBF80000000",
|
|
"movq 128(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IR, offset smallest negative simm32
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rax), w_rdi, None),
|
|
"488BB87FFFFFFF",
|
|
"movq -129(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rbx), w_rdi, None),
|
|
"488BBB7FFFFFFF",
|
|
"movq -129(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rcx), w_rdi, None),
|
|
"488BB97FFFFFFF",
|
|
"movq -129(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rdx), w_rdi, None),
|
|
"488BBA7FFFFFFF",
|
|
"movq -129(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rbp), w_rdi, None),
|
|
"488BBD7FFFFFFF",
|
|
"movq -129(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rsp), w_rdi, None),
|
|
"488BBC247FFFFFFF",
|
|
"movq -129(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rsi), w_rdi, None),
|
|
"488BBE7FFFFFFF",
|
|
"movq -129(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, rdi), w_rdi, None),
|
|
"488BBF7FFFFFFF",
|
|
"movq -129(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r8), w_rdi, None),
|
|
"498BB87FFFFFFF",
|
|
"movq -129(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r9), w_rdi, None),
|
|
"498BB97FFFFFFF",
|
|
"movq -129(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r10), w_rdi, None),
|
|
"498BBA7FFFFFFF",
|
|
"movq -129(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r11), w_rdi, None),
|
|
"498BBB7FFFFFFF",
|
|
"movq -129(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r12), w_rdi, None),
|
|
"498BBC247FFFFFFF",
|
|
"movq -129(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r13), w_rdi, None),
|
|
"498BBD7FFFFFFF",
|
|
"movq -129(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r14), w_rdi, None),
|
|
"498BBE7FFFFFFF",
|
|
"movq -129(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-129i32 as u32, r15), w_rdi, None),
|
|
"498BBF7FFFFFFF",
|
|
"movq -129(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IR, offset large positive simm32
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rax), w_rdi, None),
|
|
"488BB877207317",
|
|
"movq 393420919(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rbx), w_rdi, None),
|
|
"488BBB77207317",
|
|
"movq 393420919(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rcx), w_rdi, None),
|
|
"488BB977207317",
|
|
"movq 393420919(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rdx), w_rdi, None),
|
|
"488BBA77207317",
|
|
"movq 393420919(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rbp), w_rdi, None),
|
|
"488BBD77207317",
|
|
"movq 393420919(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rsp), w_rdi, None),
|
|
"488BBC2477207317",
|
|
"movq 393420919(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rsi), w_rdi, None),
|
|
"488BBE77207317",
|
|
"movq 393420919(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, rdi), w_rdi, None),
|
|
"488BBF77207317",
|
|
"movq 393420919(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r8), w_rdi, None),
|
|
"498BB877207317",
|
|
"movq 393420919(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r9), w_rdi, None),
|
|
"498BB977207317",
|
|
"movq 393420919(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r10), w_rdi, None),
|
|
"498BBA77207317",
|
|
"movq 393420919(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r11), w_rdi, None),
|
|
"498BBB77207317",
|
|
"movq 393420919(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r12), w_rdi, None),
|
|
"498BBC2477207317",
|
|
"movq 393420919(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r13), w_rdi, None),
|
|
"498BBD77207317",
|
|
"movq 393420919(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r14), w_rdi, None),
|
|
"498BBE77207317",
|
|
"movq 393420919(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(0x17732077, r15), w_rdi, None),
|
|
"498BBF77207317",
|
|
"movq 393420919(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IR, offset large negative simm32
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rax), w_rdi, None),
|
|
"488BB8D9A6BECE",
|
|
"movq -826366247(%rax), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rbx), w_rdi, None),
|
|
"488BBBD9A6BECE",
|
|
"movq -826366247(%rbx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rcx), w_rdi, None),
|
|
"488BB9D9A6BECE",
|
|
"movq -826366247(%rcx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rdx), w_rdi, None),
|
|
"488BBAD9A6BECE",
|
|
"movq -826366247(%rdx), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rbp), w_rdi, None),
|
|
"488BBDD9A6BECE",
|
|
"movq -826366247(%rbp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rsp), w_rdi, None),
|
|
"488BBC24D9A6BECE",
|
|
"movq -826366247(%rsp), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rsi), w_rdi, None),
|
|
"488BBED9A6BECE",
|
|
"movq -826366247(%rsi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, rdi), w_rdi, None),
|
|
"488BBFD9A6BECE",
|
|
"movq -826366247(%rdi), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r8), w_rdi, None),
|
|
"498BB8D9A6BECE",
|
|
"movq -826366247(%r8), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r9), w_rdi, None),
|
|
"498BB9D9A6BECE",
|
|
"movq -826366247(%r9), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r10), w_rdi, None),
|
|
"498BBAD9A6BECE",
|
|
"movq -826366247(%r10), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r11), w_rdi, None),
|
|
"498BBBD9A6BECE",
|
|
"movq -826366247(%r11), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r12), w_rdi, None),
|
|
"498BBC24D9A6BECE",
|
|
"movq -826366247(%r12), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r13), w_rdi, None),
|
|
"498BBDD9A6BECE",
|
|
"movq -826366247(%r13), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r14), w_rdi, None),
|
|
"498BBED9A6BECE",
|
|
"movq -826366247(%r14), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg(-0x31415927i32 as u32, r15), w_rdi, None),
|
|
"498BBFD9A6BECE",
|
|
"movq -826366247(%r15), %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// Cases aimed at checking Addr-esses: IRRS (Imm + Reg + (Reg << Shift))
|
|
// Note these don't check the case where the index reg is RSP, since we
|
|
// don't encode any of those.
|
|
//
|
|
// Addr_IRRS, offset max simm8
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, rax, rax, 0), w_r11, None),
|
|
"4C8B5C007F",
|
|
"movq 127(%rax,%rax,1), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, rdi, rax, 1), w_r11, None),
|
|
"4C8B5C477F",
|
|
"movq 127(%rdi,%rax,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, r8, rax, 2), w_r11, None),
|
|
"4D8B5C807F",
|
|
"movq 127(%r8,%rax,4), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, r15, rax, 3), w_r11, None),
|
|
"4D8B5CC77F",
|
|
"movq 127(%r15,%rax,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, rax, rdi, 3), w_r11, None),
|
|
"4C8B5CF87F",
|
|
"movq 127(%rax,%rdi,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, rdi, rdi, 2), w_r11, None),
|
|
"4C8B5CBF7F",
|
|
"movq 127(%rdi,%rdi,4), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, r8, rdi, 1), w_r11, None),
|
|
"4D8B5C787F",
|
|
"movq 127(%r8,%rdi,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(127, r15, rdi, 0), w_r11, None),
|
|
"4D8B5C3F7F",
|
|
"movq 127(%r15,%rdi,1), %r11",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IRRS, offset min simm8
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, rax, r8, 2),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B5C8080",
|
|
"movq -128(%rax,%r8,4), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, rdi, r8, 3),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B5CC780",
|
|
"movq -128(%rdi,%r8,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, r8, r8, 0),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B5C0080",
|
|
"movq -128(%r8,%r8,1), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, r15, r8, 1),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B5C4780",
|
|
"movq -128(%r15,%r8,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, rax, r15, 1),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B5C7880",
|
|
"movq -128(%rax,%r15,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, rdi, r15, 0),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B5C3F80",
|
|
"movq -128(%rdi,%r15,1), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, r8, r15, 3),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B5CF880",
|
|
"movq -128(%r8,%r15,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-128i32 as u32, r15, r15, 2),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B5CBF80",
|
|
"movq -128(%r15,%r15,4), %r11",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IRRS, offset large positive simm32
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, rax, rax, 0),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4C8B9C00BE25664F",
|
|
"movq 1332094398(%rax,%rax,1), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, rdi, rax, 1),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4C8B9C47BE25664F",
|
|
"movq 1332094398(%rdi,%rax,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, r8, rax, 2),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4D8B9C80BE25664F",
|
|
"movq 1332094398(%r8,%rax,4), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, r15, rax, 3),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4D8B9CC7BE25664F",
|
|
"movq 1332094398(%r15,%rax,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, rax, rdi, 3),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4C8B9CF8BE25664F",
|
|
"movq 1332094398(%rax,%rdi,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, rdi, rdi, 2),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4C8B9CBFBE25664F",
|
|
"movq 1332094398(%rdi,%rdi,4), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, r8, rdi, 1),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4D8B9C78BE25664F",
|
|
"movq 1332094398(%r8,%rdi,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(0x4f6625be, r15, rdi, 0),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4D8B9C3FBE25664F",
|
|
"movq 1332094398(%r15,%rdi,1), %r11",
|
|
));
|
|
|
|
// ========================================================
|
|
// Addr_IRRS, offset large negative simm32
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, rax, r8, 2),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B9C8070E9B2D9",
|
|
"movq -642586256(%rax,%r8,4), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, rdi, r8, 3),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B9CC770E9B2D9",
|
|
"movq -642586256(%rdi,%r8,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, r8, r8, 0),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B9C0070E9B2D9",
|
|
"movq -642586256(%r8,%r8,1), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, r15, r8, 1),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B9C4770E9B2D9",
|
|
"movq -642586256(%r15,%r8,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, rax, r15, 1),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B9C7870E9B2D9",
|
|
"movq -642586256(%rax,%r15,2), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, rdi, r15, 0),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4E8B9C3F70E9B2D9",
|
|
"movq -642586256(%rdi,%r15,1), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, r8, r15, 3),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B9CF870E9B2D9",
|
|
"movq -642586256(%r8,%r15,8), %r11",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(
|
|
Amode::imm_reg_reg_shift(-0x264d1690i32 as u32, r15, r15, 2),
|
|
w_r11,
|
|
None,
|
|
),
|
|
"4F8B9CBF70E9B2D9",
|
|
"movq -642586256(%r15,%r15,4), %r11",
|
|
));
|
|
|
|
// End of test cases for Addr
|
|
// ========================================================
|
|
|
|
// ========================================================
|
|
// General tests for each insn. Don't forget to follow the
|
|
// guidelines commented just prior to `fn x64_emit`.
|
|
//
|
|
// Alu_RMI_R
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Add, RegMemImm::reg(r15), w_rdx),
|
|
"4C01FA",
|
|
"addq %r15, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(false, AluRmiROpcode::Add, RegMemImm::reg(rcx), w_r8),
|
|
"4101C8",
|
|
"addl %ecx, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(false, AluRmiROpcode::Add, RegMemImm::reg(rcx), w_rsi),
|
|
"01CE",
|
|
"addl %ecx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
true,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::mem(Amode::imm_reg(99, rdi)),
|
|
w_rdx,
|
|
),
|
|
"48035763",
|
|
"addq 99(%rdi), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::mem(Amode::imm_reg(99, rdi)),
|
|
w_r8,
|
|
),
|
|
"44034763",
|
|
"addl 99(%rdi), %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::mem(Amode::imm_reg(99, rdi)),
|
|
w_rsi,
|
|
),
|
|
"037763",
|
|
"addl 99(%rdi), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
true,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-127i32 as u32),
|
|
w_rdx,
|
|
),
|
|
"4883C281",
|
|
"addq $-127, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
true,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-129i32 as u32),
|
|
w_rdx,
|
|
),
|
|
"4881C27FFFFFFF",
|
|
"addq $-129, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Add, RegMemImm::imm(76543210), w_rdx),
|
|
"4881C2EAF48F04",
|
|
"addq $76543210, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-127i32 as u32),
|
|
w_r8,
|
|
),
|
|
"4183C081",
|
|
"addl $-127, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-129i32 as u32),
|
|
w_r8,
|
|
),
|
|
"4181C07FFFFFFF",
|
|
"addl $-129, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-76543210i32 as u32),
|
|
w_r8,
|
|
),
|
|
"4181C0160B70FB",
|
|
"addl $-76543210, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-127i32 as u32),
|
|
w_rsi,
|
|
),
|
|
"83C681",
|
|
"addl $-127, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Add,
|
|
RegMemImm::imm(-129i32 as u32),
|
|
w_rsi,
|
|
),
|
|
"81C67FFFFFFF",
|
|
"addl $-129, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(false, AluRmiROpcode::Add, RegMemImm::imm(76543210), w_rsi),
|
|
"81C6EAF48F04",
|
|
"addl $76543210, %esi",
|
|
));
|
|
// This is pretty feeble
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Sub, RegMemImm::reg(r15), w_rdx),
|
|
"4C29FA",
|
|
"subq %r15, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::And, RegMemImm::reg(r15), w_rdx),
|
|
"4C21FA",
|
|
"andq %r15, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Or, RegMemImm::reg(r15), w_rdx),
|
|
"4C09FA",
|
|
"orq %r15, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Xor, RegMemImm::reg(r15), w_rdx),
|
|
"4C31FA",
|
|
"xorq %r15, %rdx",
|
|
));
|
|
// Test all mul cases, though
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Mul, RegMemImm::reg(r15), w_rdx),
|
|
"490FAFD7",
|
|
"imulq %r15, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(false, AluRmiROpcode::Mul, RegMemImm::reg(rcx), w_r8),
|
|
"440FAFC1",
|
|
"imull %ecx, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(false, AluRmiROpcode::Mul, RegMemImm::reg(rcx), w_rsi),
|
|
"0FAFF1",
|
|
"imull %ecx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
true,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::mem(Amode::imm_reg(99, rdi)),
|
|
w_rdx,
|
|
),
|
|
"480FAF5763",
|
|
"imulq 99(%rdi), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::mem(Amode::imm_reg(99, rdi)),
|
|
w_r8,
|
|
),
|
|
"440FAF4763",
|
|
"imull 99(%rdi), %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::mem(Amode::imm_reg(99, rdi)),
|
|
w_rsi,
|
|
),
|
|
"0FAF7763",
|
|
"imull 99(%rdi), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
true,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-127i32 as u32),
|
|
w_rdx,
|
|
),
|
|
"486BD281",
|
|
"imulq $-127, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
true,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-129i32 as u32),
|
|
w_rdx,
|
|
),
|
|
"4869D27FFFFFFF",
|
|
"imulq $-129, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(true, AluRmiROpcode::Mul, RegMemImm::imm(76543210), w_rdx),
|
|
"4869D2EAF48F04",
|
|
"imulq $76543210, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-127i32 as u32),
|
|
w_r8,
|
|
),
|
|
"456BC081",
|
|
"imull $-127, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-129i32 as u32),
|
|
w_r8,
|
|
),
|
|
"4569C07FFFFFFF",
|
|
"imull $-129, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-76543210i32 as u32),
|
|
w_r8,
|
|
),
|
|
"4569C0160B70FB",
|
|
"imull $-76543210, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-127i32 as u32),
|
|
w_rsi,
|
|
),
|
|
"6BF681",
|
|
"imull $-127, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(
|
|
false,
|
|
AluRmiROpcode::Mul,
|
|
RegMemImm::imm(-129i32 as u32),
|
|
w_rsi,
|
|
),
|
|
"69F67FFFFFFF",
|
|
"imull $-129, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::alu_rmi_r(false, AluRmiROpcode::Mul, RegMemImm::imm(76543210), w_rsi),
|
|
"69F6EAF48F04",
|
|
"imull $76543210, %esi",
|
|
));
|
|
|
|
// ========================================================
|
|
// UnaryRmR
|
|
|
|
insns.push((
|
|
Inst::unary_rm_r(4, UnaryRmROpcode::Bsr, RegMem::reg(rsi), w_rdi),
|
|
"0FBDFE",
|
|
"bsrl %esi, %edi",
|
|
));
|
|
insns.push((
|
|
Inst::unary_rm_r(8, UnaryRmROpcode::Bsr, RegMem::reg(r15), w_rax),
|
|
"490FBDC7",
|
|
"bsrq %r15, %rax",
|
|
));
|
|
|
|
// ========================================================
|
|
// Div
|
|
insns.push((
|
|
Inst::div(
|
|
4,
|
|
true, /*signed*/
|
|
RegMem::reg(regs::rsi()),
|
|
SourceLoc::default(),
|
|
),
|
|
"F7FE",
|
|
"idiv %esi",
|
|
));
|
|
insns.push((
|
|
Inst::div(
|
|
8,
|
|
true, /*signed*/
|
|
RegMem::reg(regs::r15()),
|
|
SourceLoc::default(),
|
|
),
|
|
"49F7FF",
|
|
"idiv %r15",
|
|
));
|
|
insns.push((
|
|
Inst::div(
|
|
4,
|
|
false, /*signed*/
|
|
RegMem::reg(regs::r14()),
|
|
SourceLoc::default(),
|
|
),
|
|
"41F7F6",
|
|
"div %r14d",
|
|
));
|
|
insns.push((
|
|
Inst::div(
|
|
8,
|
|
false, /*signed*/
|
|
RegMem::reg(regs::rdi()),
|
|
SourceLoc::default(),
|
|
),
|
|
"48F7F7",
|
|
"div %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// MulHi
|
|
insns.push((
|
|
Inst::mul_hi(4, true /*signed*/, RegMem::reg(regs::rsi())),
|
|
"F7EE",
|
|
"imul %esi",
|
|
));
|
|
insns.push((
|
|
Inst::mul_hi(8, true /*signed*/, RegMem::reg(regs::r15())),
|
|
"49F7EF",
|
|
"imul %r15",
|
|
));
|
|
insns.push((
|
|
Inst::mul_hi(4, false /*signed*/, RegMem::reg(regs::r14())),
|
|
"41F7E6",
|
|
"mul %r14d",
|
|
));
|
|
insns.push((
|
|
Inst::mul_hi(8, false /*signed*/, RegMem::reg(regs::rdi())),
|
|
"48F7E7",
|
|
"mul %rdi",
|
|
));
|
|
|
|
// ========================================================
|
|
// cdq family: SignExtendRaxRdx
|
|
insns.push((Inst::sign_extend_rax_to_rdx(2), "6699", "cwd"));
|
|
insns.push((Inst::sign_extend_rax_to_rdx(4), "99", "cdq"));
|
|
insns.push((Inst::sign_extend_rax_to_rdx(8), "4899", "cqo"));
|
|
|
|
// ========================================================
|
|
// Imm_R
|
|
//
|
|
insns.push((
|
|
Inst::imm_r(false, 1234567, w_r14),
|
|
"41BE87D61200",
|
|
"movl $1234567, %r14d",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(false, -126i64 as u64, w_r14),
|
|
"41BE82FFFFFF",
|
|
"movl $-126, %r14d",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(true, 1234567898765, w_r14),
|
|
"49BE8D26FB711F010000",
|
|
"movabsq $1234567898765, %r14",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(true, -126i64 as u64, w_r14),
|
|
"49BE82FFFFFFFFFFFFFF",
|
|
"movabsq $-126, %r14",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(false, 1234567, w_rcx),
|
|
"B987D61200",
|
|
"movl $1234567, %ecx",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(false, -126i64 as u64, w_rcx),
|
|
"B982FFFFFF",
|
|
"movl $-126, %ecx",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(true, 1234567898765, w_rsi),
|
|
"48BE8D26FB711F010000",
|
|
"movabsq $1234567898765, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::imm_r(true, -126i64 as u64, w_rbx),
|
|
"48BB82FFFFFFFFFFFFFF",
|
|
"movabsq $-126, %rbx",
|
|
));
|
|
|
|
// ========================================================
|
|
// Mov_R_R
|
|
insns.push((
|
|
Inst::mov_r_r(false, rbx, w_rsi),
|
|
"89DE",
|
|
"movl %ebx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(false, rbx, w_r9),
|
|
"4189D9",
|
|
"movl %ebx, %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(false, r11, w_rsi),
|
|
"4489DE",
|
|
"movl %r11d, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(false, r12, w_r9),
|
|
"4589E1",
|
|
"movl %r12d, %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(true, rbx, w_rsi),
|
|
"4889DE",
|
|
"movq %rbx, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(true, rbx, w_r9),
|
|
"4989D9",
|
|
"movq %rbx, %r9",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(true, r11, w_rsi),
|
|
"4C89DE",
|
|
"movq %r11, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_r(true, r12, w_r9),
|
|
"4D89E1",
|
|
"movq %r12, %r9",
|
|
));
|
|
|
|
// ========================================================
|
|
// MovZX_RM_R
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::BL, RegMem::reg(rdi), w_rdi, None),
|
|
"400FB6FF",
|
|
"movzbl %dil, %edi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::BL, RegMem::reg(rax), w_rsi, None),
|
|
"0FB6F0",
|
|
"movzbl %al, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::BL, RegMem::reg(r15), w_rsi, None),
|
|
"410FB6F7",
|
|
"movzbl %r15b, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"0FB671F9",
|
|
"movzbl -7(%rcx), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"410FB658F9",
|
|
"movzbl -7(%r8), %ebx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"450FB64AF9",
|
|
"movzbl -7(%r10), %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"410FB653F9",
|
|
"movzbl -7(%r11), %edx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::BQ, RegMem::reg(rax), w_rsi, None),
|
|
"480FB6F0",
|
|
"movzbq %al, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::BQ, RegMem::reg(r10), w_rsi, None),
|
|
"490FB6F2",
|
|
"movzbq %r10b, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"480FB671F9",
|
|
"movzbq -7(%rcx), %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"490FB658F9",
|
|
"movzbq -7(%r8), %rbx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"4D0FB64AF9",
|
|
"movzbq -7(%r10), %r9",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"490FB653F9",
|
|
"movzbq -7(%r11), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::WL, RegMem::reg(rcx), w_rsi, None),
|
|
"0FB7F1",
|
|
"movzwl %cx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::WL, RegMem::reg(r10), w_rsi, None),
|
|
"410FB7F2",
|
|
"movzwl %r10w, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"0FB771F9",
|
|
"movzwl -7(%rcx), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"410FB758F9",
|
|
"movzwl -7(%r8), %ebx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"450FB74AF9",
|
|
"movzwl -7(%r10), %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"410FB753F9",
|
|
"movzwl -7(%r11), %edx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::WQ, RegMem::reg(rcx), w_rsi, None),
|
|
"480FB7F1",
|
|
"movzwq %cx, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::WQ, RegMem::reg(r11), w_rsi, None),
|
|
"490FB7F3",
|
|
"movzwq %r11w, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"480FB771F9",
|
|
"movzwq -7(%rcx), %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"490FB758F9",
|
|
"movzwq -7(%r8), %rbx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"4D0FB74AF9",
|
|
"movzwq -7(%r10), %r9",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"490FB753F9",
|
|
"movzwq -7(%r11), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(ExtMode::LQ, RegMem::reg(rcx), w_rsi, None),
|
|
"8BF1",
|
|
"movl %ecx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"8B71F9",
|
|
"movl -7(%rcx), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"418B58F9",
|
|
"movl -7(%r8), %ebx",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"458B4AF9",
|
|
"movl -7(%r10), %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::movzx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"418B53F9",
|
|
"movl -7(%r11), %edx",
|
|
));
|
|
|
|
// ========================================================
|
|
// Mov64_M_R
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, rax, rbx, 0), w_rcx, None),
|
|
"488B8C18B3000000",
|
|
"movq 179(%rax,%rbx,1), %rcx",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, rax, rbx, 0), w_r8, None),
|
|
"4C8B8418B3000000",
|
|
"movq 179(%rax,%rbx,1), %r8",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, rax, r9, 0), w_rcx, None),
|
|
"4A8B8C08B3000000",
|
|
"movq 179(%rax,%r9,1), %rcx",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, rax, r9, 0), w_r8, None),
|
|
"4E8B8408B3000000",
|
|
"movq 179(%rax,%r9,1), %r8",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, r10, rbx, 0), w_rcx, None),
|
|
"498B8C1AB3000000",
|
|
"movq 179(%r10,%rbx,1), %rcx",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, r10, rbx, 0), w_r8, None),
|
|
"4D8B841AB3000000",
|
|
"movq 179(%r10,%rbx,1), %r8",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, r10, r9, 0), w_rcx, None),
|
|
"4B8B8C0AB3000000",
|
|
"movq 179(%r10,%r9,1), %rcx",
|
|
));
|
|
insns.push((
|
|
Inst::mov64_m_r(Amode::imm_reg_reg_shift(179, r10, r9, 0), w_r8, None),
|
|
"4F8B840AB3000000",
|
|
"movq 179(%r10,%r9,1), %r8",
|
|
));
|
|
|
|
// ========================================================
|
|
// LoadEffectiveAddress
|
|
insns.push((
|
|
Inst::lea(Amode::imm_reg(42, r10), w_r8),
|
|
"4D8D422A",
|
|
"lea 42(%r10), %r8",
|
|
));
|
|
insns.push((
|
|
Inst::lea(Amode::imm_reg(42, r10), w_r15),
|
|
"4D8D7A2A",
|
|
"lea 42(%r10), %r15",
|
|
));
|
|
insns.push((
|
|
Inst::lea(Amode::imm_reg_reg_shift(179, r10, r9, 0), w_r8),
|
|
"4F8D840AB3000000",
|
|
"lea 179(%r10,%r9,1), %r8",
|
|
));
|
|
insns.push((
|
|
Inst::lea(Amode::rip_relative(BranchTarget::ResolvedOffset(0)), w_rdi),
|
|
"488D3D00000000",
|
|
"lea 0(%rip), %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::lea(
|
|
Amode::rip_relative(BranchTarget::ResolvedOffset(1337)),
|
|
w_r15,
|
|
),
|
|
"4C8D3D39050000",
|
|
"lea 1337(%rip), %r15",
|
|
));
|
|
|
|
// ========================================================
|
|
// MovSX_RM_R
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::BL, RegMem::reg(rdi), w_rdi, None),
|
|
"400FBEFF",
|
|
"movsbl %dil, %edi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::BL, RegMem::reg(rcx), w_rsi, None),
|
|
"0FBEF1",
|
|
"movsbl %cl, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::BL, RegMem::reg(r14), w_rsi, None),
|
|
"410FBEF6",
|
|
"movsbl %r14b, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"0FBE71F9",
|
|
"movsbl -7(%rcx), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"410FBE58F9",
|
|
"movsbl -7(%r8), %ebx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"450FBE4AF9",
|
|
"movsbl -7(%r10), %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"410FBE53F9",
|
|
"movsbl -7(%r11), %edx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::BQ, RegMem::reg(rcx), w_rsi, None),
|
|
"480FBEF1",
|
|
"movsbq %cl, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::BQ, RegMem::reg(r15), w_rsi, None),
|
|
"490FBEF7",
|
|
"movsbq %r15b, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"480FBE71F9",
|
|
"movsbq -7(%rcx), %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"490FBE58F9",
|
|
"movsbq -7(%r8), %rbx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"4D0FBE4AF9",
|
|
"movsbq -7(%r10), %r9",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::BQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"490FBE53F9",
|
|
"movsbq -7(%r11), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::WL, RegMem::reg(rcx), w_rsi, None),
|
|
"0FBFF1",
|
|
"movswl %cx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::WL, RegMem::reg(r14), w_rsi, None),
|
|
"410FBFF6",
|
|
"movswl %r14w, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"0FBF71F9",
|
|
"movswl -7(%rcx), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"410FBF58F9",
|
|
"movswl -7(%r8), %ebx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"450FBF4AF9",
|
|
"movswl -7(%r10), %r9d",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WL,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"410FBF53F9",
|
|
"movswl -7(%r11), %edx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::WQ, RegMem::reg(rcx), w_rsi, None),
|
|
"480FBFF1",
|
|
"movswq %cx, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::WQ, RegMem::reg(r13), w_rsi, None),
|
|
"490FBFF5",
|
|
"movswq %r13w, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"480FBF71F9",
|
|
"movswq -7(%rcx), %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"490FBF58F9",
|
|
"movswq -7(%r8), %rbx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"4D0FBF4AF9",
|
|
"movswq -7(%r10), %r9",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::WQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"490FBF53F9",
|
|
"movswq -7(%r11), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::LQ, RegMem::reg(rcx), w_rsi, None),
|
|
"4863F1",
|
|
"movslq %ecx, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(ExtMode::LQ, RegMem::reg(r15), w_rsi, None),
|
|
"4963F7",
|
|
"movslq %r15d, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, rcx)),
|
|
w_rsi,
|
|
None,
|
|
),
|
|
"486371F9",
|
|
"movslq -7(%rcx), %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r8)),
|
|
w_rbx,
|
|
None,
|
|
),
|
|
"496358F9",
|
|
"movslq -7(%r8), %rbx",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r10)),
|
|
w_r9,
|
|
None,
|
|
),
|
|
"4D634AF9",
|
|
"movslq -7(%r10), %r9",
|
|
));
|
|
insns.push((
|
|
Inst::movsx_rm_r(
|
|
ExtMode::LQ,
|
|
RegMem::mem(Amode::imm_reg(-7i32 as u32, r11)),
|
|
w_rdx,
|
|
None,
|
|
),
|
|
"496353F9",
|
|
"movslq -7(%r11), %rdx",
|
|
));
|
|
|
|
// ========================================================
|
|
// Mov_R_M. Byte stores are tricky. Check everything carefully.
|
|
insns.push((
|
|
Inst::mov_r_m(8, rax, Amode::imm_reg(99, rdi), None),
|
|
"48894763",
|
|
"movq %rax, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rbx, Amode::imm_reg(99, r8), None),
|
|
"49895863",
|
|
"movq %rbx, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rcx, Amode::imm_reg(99, rsi), None),
|
|
"48894E63",
|
|
"movq %rcx, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rdx, Amode::imm_reg(99, r9), None),
|
|
"49895163",
|
|
"movq %rdx, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rsi, Amode::imm_reg(99, rax), None),
|
|
"48897063",
|
|
"movq %rsi, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rdi, Amode::imm_reg(99, r15), None),
|
|
"49897F63",
|
|
"movq %rdi, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rsp, Amode::imm_reg(99, rcx), None),
|
|
"48896163",
|
|
"movq %rsp, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, rbp, Amode::imm_reg(99, r14), None),
|
|
"49896E63",
|
|
"movq %rbp, 99(%r14)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r8, Amode::imm_reg(99, rdi), None),
|
|
"4C894763",
|
|
"movq %r8, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r9, Amode::imm_reg(99, r8), None),
|
|
"4D894863",
|
|
"movq %r9, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r10, Amode::imm_reg(99, rsi), None),
|
|
"4C895663",
|
|
"movq %r10, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r11, Amode::imm_reg(99, r9), None),
|
|
"4D895963",
|
|
"movq %r11, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r12, Amode::imm_reg(99, rax), None),
|
|
"4C896063",
|
|
"movq %r12, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r13, Amode::imm_reg(99, r15), None),
|
|
"4D896F63",
|
|
"movq %r13, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r14, Amode::imm_reg(99, rcx), None),
|
|
"4C897163",
|
|
"movq %r14, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(8, r15, Amode::imm_reg(99, r14), None),
|
|
"4D897E63",
|
|
"movq %r15, 99(%r14)",
|
|
));
|
|
//
|
|
insns.push((
|
|
Inst::mov_r_m(4, rax, Amode::imm_reg(99, rdi), None),
|
|
"894763",
|
|
"movl %eax, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rbx, Amode::imm_reg(99, r8), None),
|
|
"41895863",
|
|
"movl %ebx, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rcx, Amode::imm_reg(99, rsi), None),
|
|
"894E63",
|
|
"movl %ecx, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rdx, Amode::imm_reg(99, r9), None),
|
|
"41895163",
|
|
"movl %edx, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rsi, Amode::imm_reg(99, rax), None),
|
|
"897063",
|
|
"movl %esi, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rdi, Amode::imm_reg(99, r15), None),
|
|
"41897F63",
|
|
"movl %edi, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rsp, Amode::imm_reg(99, rcx), None),
|
|
"896163",
|
|
"movl %esp, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, rbp, Amode::imm_reg(99, r14), None),
|
|
"41896E63",
|
|
"movl %ebp, 99(%r14)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r8, Amode::imm_reg(99, rdi), None),
|
|
"44894763",
|
|
"movl %r8d, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r9, Amode::imm_reg(99, r8), None),
|
|
"45894863",
|
|
"movl %r9d, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r10, Amode::imm_reg(99, rsi), None),
|
|
"44895663",
|
|
"movl %r10d, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r11, Amode::imm_reg(99, r9), None),
|
|
"45895963",
|
|
"movl %r11d, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r12, Amode::imm_reg(99, rax), None),
|
|
"44896063",
|
|
"movl %r12d, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r13, Amode::imm_reg(99, r15), None),
|
|
"45896F63",
|
|
"movl %r13d, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r14, Amode::imm_reg(99, rcx), None),
|
|
"44897163",
|
|
"movl %r14d, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(4, r15, Amode::imm_reg(99, r14), None),
|
|
"45897E63",
|
|
"movl %r15d, 99(%r14)",
|
|
));
|
|
//
|
|
insns.push((
|
|
Inst::mov_r_m(2, rax, Amode::imm_reg(99, rdi), None),
|
|
"66894763",
|
|
"movw %ax, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rbx, Amode::imm_reg(99, r8), None),
|
|
"6641895863",
|
|
"movw %bx, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rcx, Amode::imm_reg(99, rsi), None),
|
|
"66894E63",
|
|
"movw %cx, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rdx, Amode::imm_reg(99, r9), None),
|
|
"6641895163",
|
|
"movw %dx, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rsi, Amode::imm_reg(99, rax), None),
|
|
"66897063",
|
|
"movw %si, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rdi, Amode::imm_reg(99, r15), None),
|
|
"6641897F63",
|
|
"movw %di, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rsp, Amode::imm_reg(99, rcx), None),
|
|
"66896163",
|
|
"movw %sp, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, rbp, Amode::imm_reg(99, r14), None),
|
|
"6641896E63",
|
|
"movw %bp, 99(%r14)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r8, Amode::imm_reg(99, rdi), None),
|
|
"6644894763",
|
|
"movw %r8w, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r9, Amode::imm_reg(99, r8), None),
|
|
"6645894863",
|
|
"movw %r9w, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r10, Amode::imm_reg(99, rsi), None),
|
|
"6644895663",
|
|
"movw %r10w, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r11, Amode::imm_reg(99, r9), None),
|
|
"6645895963",
|
|
"movw %r11w, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r12, Amode::imm_reg(99, rax), None),
|
|
"6644896063",
|
|
"movw %r12w, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r13, Amode::imm_reg(99, r15), None),
|
|
"6645896F63",
|
|
"movw %r13w, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r14, Amode::imm_reg(99, rcx), None),
|
|
"6644897163",
|
|
"movw %r14w, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(2, r15, Amode::imm_reg(99, r14), None),
|
|
"6645897E63",
|
|
"movw %r15w, 99(%r14)",
|
|
));
|
|
//
|
|
insns.push((
|
|
Inst::mov_r_m(1, rax, Amode::imm_reg(99, rdi), None),
|
|
"884763",
|
|
"movb %al, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rbx, Amode::imm_reg(99, r8), None),
|
|
"41885863",
|
|
"movb %bl, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rcx, Amode::imm_reg(99, rsi), None),
|
|
"884E63",
|
|
"movb %cl, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rdx, Amode::imm_reg(99, r9), None),
|
|
"41885163",
|
|
"movb %dl, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rsi, Amode::imm_reg(99, rax), None),
|
|
"40887063",
|
|
"movb %sil, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rdi, Amode::imm_reg(99, r15), None),
|
|
"41887F63",
|
|
"movb %dil, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rsp, Amode::imm_reg(99, rcx), None),
|
|
"40886163",
|
|
"movb %spl, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, rbp, Amode::imm_reg(99, r14), None),
|
|
"41886E63",
|
|
"movb %bpl, 99(%r14)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r8, Amode::imm_reg(99, rdi), None),
|
|
"44884763",
|
|
"movb %r8b, 99(%rdi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r9, Amode::imm_reg(99, r8), None),
|
|
"45884863",
|
|
"movb %r9b, 99(%r8)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r10, Amode::imm_reg(99, rsi), None),
|
|
"44885663",
|
|
"movb %r10b, 99(%rsi)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r11, Amode::imm_reg(99, r9), None),
|
|
"45885963",
|
|
"movb %r11b, 99(%r9)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r12, Amode::imm_reg(99, rax), None),
|
|
"44886063",
|
|
"movb %r12b, 99(%rax)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r13, Amode::imm_reg(99, r15), None),
|
|
"45886F63",
|
|
"movb %r13b, 99(%r15)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r14, Amode::imm_reg(99, rcx), None),
|
|
"44887163",
|
|
"movb %r14b, 99(%rcx)",
|
|
));
|
|
insns.push((
|
|
Inst::mov_r_m(1, r15, Amode::imm_reg(99, r14), None),
|
|
"45887E63",
|
|
"movb %r15b, 99(%r14)",
|
|
));
|
|
|
|
// ========================================================
|
|
// Shift_R
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftLeft, None, w_rdi),
|
|
"D3E7",
|
|
"shll %cl, %edi",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftLeft, None, w_r12),
|
|
"41D3E4",
|
|
"shll %cl, %r12d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftLeft, Some(2), w_r8),
|
|
"41C1E002",
|
|
"shll $2, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftLeft, Some(31), w_r13),
|
|
"41C1E51F",
|
|
"shll $31, %r13d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftLeft, None, w_r13),
|
|
"49D3E5",
|
|
"shlq %cl, %r13",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftLeft, None, w_rdi),
|
|
"48D3E7",
|
|
"shlq %cl, %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftLeft, Some(2), w_r8),
|
|
"49C1E002",
|
|
"shlq $2, %r8",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftLeft, Some(3), w_rbx),
|
|
"48C1E303",
|
|
"shlq $3, %rbx",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftLeft, Some(63), w_r13),
|
|
"49C1E53F",
|
|
"shlq $63, %r13",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftRightLogical, None, w_rdi),
|
|
"D3EF",
|
|
"shrl %cl, %edi",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftRightLogical, Some(2), w_r8),
|
|
"41C1E802",
|
|
"shrl $2, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftRightLogical, Some(31), w_r13),
|
|
"41C1ED1F",
|
|
"shrl $31, %r13d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftRightLogical, None, w_rdi),
|
|
"48D3EF",
|
|
"shrq %cl, %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftRightLogical, Some(2), w_r8),
|
|
"49C1E802",
|
|
"shrq $2, %r8",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftRightLogical, Some(63), w_r13),
|
|
"49C1ED3F",
|
|
"shrq $63, %r13",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftRightArithmetic, None, w_rdi),
|
|
"D3FF",
|
|
"sarl %cl, %edi",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftRightArithmetic, Some(2), w_r8),
|
|
"41C1F802",
|
|
"sarl $2, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(false, ShiftKind::ShiftRightArithmetic, Some(31), w_r13),
|
|
"41C1FD1F",
|
|
"sarl $31, %r13d",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftRightArithmetic, None, w_rdi),
|
|
"48D3FF",
|
|
"sarq %cl, %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftRightArithmetic, Some(2), w_r8),
|
|
"49C1F802",
|
|
"sarq $2, %r8",
|
|
));
|
|
insns.push((
|
|
Inst::shift_r(true, ShiftKind::ShiftRightArithmetic, Some(63), w_r13),
|
|
"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
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::reg(r15), rdx),
|
|
"4C39FA",
|
|
"cmpq %r15, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::reg(rcx), r8),
|
|
"4939C8",
|
|
"cmpq %rcx, %r8",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::reg(rcx), rsi),
|
|
"4839CE",
|
|
"cmpq %rcx, %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::mem(Amode::imm_reg(99, rdi)), rdx),
|
|
"483B5763",
|
|
"cmpq 99(%rdi), %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::mem(Amode::imm_reg(99, rdi)), r8),
|
|
"4C3B4763",
|
|
"cmpq 99(%rdi), %r8",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::mem(Amode::imm_reg(99, rdi)), rsi),
|
|
"483B7763",
|
|
"cmpq 99(%rdi), %rsi",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::imm(76543210), rdx),
|
|
"4881FAEAF48F04",
|
|
"cmpq $76543210, %rdx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::imm(-76543210i32 as u32), r8),
|
|
"4981F8160B70FB",
|
|
"cmpq $-76543210, %r8",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(8, RegMemImm::imm(76543210), rsi),
|
|
"4881FEEAF48F04",
|
|
"cmpq $76543210, %rsi",
|
|
));
|
|
//
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::reg(r15), rdx),
|
|
"4439FA",
|
|
"cmpl %r15d, %edx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::reg(rcx), r8),
|
|
"4139C8",
|
|
"cmpl %ecx, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::reg(rcx), rsi),
|
|
"39CE",
|
|
"cmpl %ecx, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::mem(Amode::imm_reg(99, rdi)), rdx),
|
|
"3B5763",
|
|
"cmpl 99(%rdi), %edx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::mem(Amode::imm_reg(99, rdi)), r8),
|
|
"443B4763",
|
|
"cmpl 99(%rdi), %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::mem(Amode::imm_reg(99, rdi)), rsi),
|
|
"3B7763",
|
|
"cmpl 99(%rdi), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::imm(76543210), rdx),
|
|
"81FAEAF48F04",
|
|
"cmpl $76543210, %edx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::imm(-76543210i32 as u32), r8),
|
|
"4181F8160B70FB",
|
|
"cmpl $-76543210, %r8d",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(4, RegMemImm::imm(76543210), rsi),
|
|
"81FEEAF48F04",
|
|
"cmpl $76543210, %esi",
|
|
));
|
|
//
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::reg(r15), rdx),
|
|
"664439FA",
|
|
"cmpw %r15w, %dx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::reg(rcx), r8),
|
|
"664139C8",
|
|
"cmpw %cx, %r8w",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::reg(rcx), rsi),
|
|
"6639CE",
|
|
"cmpw %cx, %si",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::mem(Amode::imm_reg(99, rdi)), rdx),
|
|
"663B5763",
|
|
"cmpw 99(%rdi), %dx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::mem(Amode::imm_reg(99, rdi)), r8),
|
|
"66443B4763",
|
|
"cmpw 99(%rdi), %r8w",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::mem(Amode::imm_reg(99, rdi)), rsi),
|
|
"663B7763",
|
|
"cmpw 99(%rdi), %si",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::imm(23210), rdx),
|
|
"6681FAAA5A",
|
|
"cmpw $23210, %dx",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::imm(-7654i32 as u32), r8),
|
|
"664181F81AE2",
|
|
"cmpw $-7654, %r8w",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(2, RegMemImm::imm(7654), rsi),
|
|
"6681FEE61D",
|
|
"cmpw $7654, %si",
|
|
));
|
|
//
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r15), rdx),
|
|
"4438FA",
|
|
"cmpb %r15b, %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rcx), r8),
|
|
"4138C8",
|
|
"cmpb %cl, %r8b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rcx), rsi),
|
|
"4038CE",
|
|
"cmpb %cl, %sil",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::mem(Amode::imm_reg(99, rdi)), rdx),
|
|
"3A5763",
|
|
"cmpb 99(%rdi), %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::mem(Amode::imm_reg(99, rdi)), r8),
|
|
"443A4763",
|
|
"cmpb 99(%rdi), %r8b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::mem(Amode::imm_reg(99, rdi)), rsi),
|
|
"403A7763",
|
|
"cmpb 99(%rdi), %sil",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::imm(70), rdx),
|
|
"80FA46",
|
|
"cmpb $70, %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::imm(-76i32 as u32), r8),
|
|
"4180F8B4",
|
|
"cmpb $-76, %r8b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::imm(76), rsi),
|
|
"4080FE4C",
|
|
"cmpb $76, %sil",
|
|
));
|
|
// Extra byte-cases (paranoia!) for cmp_rmi_r for first operand = R
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rax), rbx),
|
|
"38C3",
|
|
"cmpb %al, %bl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rbx), rax),
|
|
"38D8",
|
|
"cmpb %bl, %al",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rcx), rdx),
|
|
"38CA",
|
|
"cmpb %cl, %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rcx), rsi),
|
|
"4038CE",
|
|
"cmpb %cl, %sil",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rcx), r10),
|
|
"4138CA",
|
|
"cmpb %cl, %r10b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rcx), r14),
|
|
"4138CE",
|
|
"cmpb %cl, %r14b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rbp), rdx),
|
|
"4038EA",
|
|
"cmpb %bpl, %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rbp), rsi),
|
|
"4038EE",
|
|
"cmpb %bpl, %sil",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rbp), r10),
|
|
"4138EA",
|
|
"cmpb %bpl, %r10b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(rbp), r14),
|
|
"4138EE",
|
|
"cmpb %bpl, %r14b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r9), rdx),
|
|
"4438CA",
|
|
"cmpb %r9b, %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r9), rsi),
|
|
"4438CE",
|
|
"cmpb %r9b, %sil",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r9), r10),
|
|
"4538CA",
|
|
"cmpb %r9b, %r10b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r9), r14),
|
|
"4538CE",
|
|
"cmpb %r9b, %r14b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r13), rdx),
|
|
"4438EA",
|
|
"cmpb %r13b, %dl",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r13), rsi),
|
|
"4438EE",
|
|
"cmpb %r13b, %sil",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r13), r10),
|
|
"4538EA",
|
|
"cmpb %r13b, %r10b",
|
|
));
|
|
insns.push((
|
|
Inst::cmp_rmi_r(1, RegMemImm::reg(r13), r14),
|
|
"4538EE",
|
|
"cmpb %r13b, %r14b",
|
|
));
|
|
|
|
// ========================================================
|
|
// SetCC
|
|
insns.push((Inst::setcc(CC::O, w_rsi), "400F90C6", "seto %sil"));
|
|
insns.push((Inst::setcc(CC::NLE, w_rsi), "400F9FC6", "setnle %sil"));
|
|
insns.push((Inst::setcc(CC::Z, w_r14), "410F94C6", "setz %r14b"));
|
|
insns.push((Inst::setcc(CC::LE, w_r14), "410F9EC6", "setle %r14b"));
|
|
insns.push((Inst::setcc(CC::P, w_r9), "410F9AC1", "setp %r9b"));
|
|
insns.push((Inst::setcc(CC::NP, w_r8), "410F9BC0", "setnp %r8b"));
|
|
// ========================================================
|
|
// Cmove
|
|
insns.push((
|
|
Inst::cmove(2, CC::O, RegMem::reg(rdi), w_rsi),
|
|
"660F40F7",
|
|
"cmovow %di, %si",
|
|
));
|
|
insns.push((
|
|
Inst::cmove(
|
|
2,
|
|
CC::NO,
|
|
RegMem::mem(Amode::imm_reg_reg_shift(37, rdi, rsi, 2)),
|
|
w_r15,
|
|
),
|
|
"66440F417CB725",
|
|
"cmovnow 37(%rdi,%rsi,4), %r15w",
|
|
));
|
|
insns.push((
|
|
Inst::cmove(4, CC::LE, RegMem::reg(rdi), w_rsi),
|
|
"0F4EF7",
|
|
"cmovlel %edi, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::cmove(4, CC::NLE, RegMem::mem(Amode::imm_reg(0, r15)), w_rsi),
|
|
"410F4F37",
|
|
"cmovnlel 0(%r15), %esi",
|
|
));
|
|
insns.push((
|
|
Inst::cmove(8, CC::Z, RegMem::reg(rdi), w_r14),
|
|
"4C0F44F7",
|
|
"cmovzq %rdi, %r14",
|
|
));
|
|
insns.push((
|
|
Inst::cmove(8, CC::NZ, RegMem::mem(Amode::imm_reg(13, rdi)), w_r14),
|
|
"4C0F45770D",
|
|
"cmovnzq 13(%rdi), %r14",
|
|
));
|
|
|
|
// ========================================================
|
|
// Push64
|
|
insns.push((Inst::push64(RegMemImm::reg(rdi)), "57", "pushq %rdi"));
|
|
insns.push((Inst::push64(RegMemImm::reg(r8)), "4150", "pushq %r8"));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::mem(Amode::imm_reg_reg_shift(321, rsi, rcx, 3))),
|
|
"FFB4CE41010000",
|
|
"pushq 321(%rsi,%rcx,8)",
|
|
));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::mem(Amode::imm_reg_reg_shift(321, r9, rbx, 2))),
|
|
"41FFB49941010000",
|
|
"pushq 321(%r9,%rbx,4)",
|
|
));
|
|
insns.push((Inst::push64(RegMemImm::imm(0)), "6A00", "pushq $0"));
|
|
insns.push((Inst::push64(RegMemImm::imm(127)), "6A7F", "pushq $127"));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::imm(128)),
|
|
"6880000000",
|
|
"pushq $128",
|
|
));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::imm(0x31415927)),
|
|
"6827594131",
|
|
"pushq $826366247",
|
|
));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::imm(-128i32 as u32)),
|
|
"6A80",
|
|
"pushq $-128",
|
|
));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::imm(-129i32 as u32)),
|
|
"687FFFFFFF",
|
|
"pushq $-129",
|
|
));
|
|
insns.push((
|
|
Inst::push64(RegMemImm::imm(-0x75c4e8a1i32 as u32)),
|
|
"685F173B8A",
|
|
"pushq $-1975838881",
|
|
));
|
|
|
|
// ========================================================
|
|
// Pop64
|
|
insns.push((Inst::pop64(w_rax), "58", "popq %rax"));
|
|
insns.push((Inst::pop64(w_rdi), "5F", "popq %rdi"));
|
|
insns.push((Inst::pop64(w_r8), "4158", "popq %r8"));
|
|
insns.push((Inst::pop64(w_r15), "415F", "popq %r15"));
|
|
|
|
// ========================================================
|
|
// CallKnown
|
|
insns.push((
|
|
Inst::call_known(
|
|
ExternalName::User {
|
|
namespace: 0,
|
|
index: 0,
|
|
},
|
|
Vec::new(),
|
|
Vec::new(),
|
|
SourceLoc::default(),
|
|
Opcode::Call,
|
|
),
|
|
"E800000000",
|
|
"call User { namespace: 0, index: 0 }",
|
|
));
|
|
|
|
// ========================================================
|
|
// CallUnknown
|
|
fn call_unknown(rm: RegMem) -> Inst {
|
|
Inst::call_unknown(
|
|
rm,
|
|
Vec::new(),
|
|
Vec::new(),
|
|
SourceLoc::default(),
|
|
Opcode::CallIndirect,
|
|
)
|
|
}
|
|
|
|
insns.push((call_unknown(RegMem::reg(rbp)), "FFD5", "call *%rbp"));
|
|
insns.push((call_unknown(RegMem::reg(r11)), "41FFD3", "call *%r11"));
|
|
insns.push((
|
|
call_unknown(RegMem::mem(Amode::imm_reg_reg_shift(321, rsi, rcx, 3))),
|
|
"FF94CE41010000",
|
|
"call *321(%rsi,%rcx,8)",
|
|
));
|
|
insns.push((
|
|
call_unknown(RegMem::mem(Amode::imm_reg_reg_shift(321, r10, rdx, 2))),
|
|
"41FF949241010000",
|
|
"call *321(%r10,%rdx,4)",
|
|
));
|
|
|
|
// ========================================================
|
|
// Ret
|
|
insns.push((Inst::ret(), "C3", "ret"));
|
|
|
|
// ========================================================
|
|
// JmpKnown skipped for now
|
|
|
|
// ========================================================
|
|
// JmpCondSymm isn't a real instruction
|
|
|
|
// ========================================================
|
|
// JmpCond skipped for now
|
|
|
|
// ========================================================
|
|
// JmpCondCompound isn't a real instruction
|
|
|
|
// ========================================================
|
|
// JmpUnknown
|
|
insns.push((Inst::jmp_unknown(RegMem::reg(rbp)), "FFE5", "jmp *%rbp"));
|
|
insns.push((
|
|
Inst::jmp_unknown(RegMem::reg(r11)),
|
|
"41FFE3",
|
|
"jmp *%r11",
|
|
));
|
|
insns.push((
|
|
Inst::jmp_unknown(RegMem::mem(Amode::imm_reg_reg_shift(321, rsi, rcx, 3))),
|
|
"FFA4CE41010000",
|
|
"jmp *321(%rsi,%rcx,8)",
|
|
));
|
|
insns.push((
|
|
Inst::jmp_unknown(RegMem::mem(Amode::imm_reg_reg_shift(321, r10, rdx, 2))),
|
|
"41FFA49241010000",
|
|
"jmp *321(%r10,%rdx,4)",
|
|
));
|
|
|
|
// ========================================================
|
|
// XMM_CMP_RM_R
|
|
|
|
insns.push((
|
|
Inst::xmm_cmp_rm_r(SseOpcode::Ucomiss, RegMem::reg(xmm1), xmm2),
|
|
"0F2ED1",
|
|
"ucomiss %xmm1, %xmm2",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_cmp_rm_r(SseOpcode::Ucomiss, RegMem::reg(xmm0), xmm9),
|
|
"440F2EC8",
|
|
"ucomiss %xmm0, %xmm9",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_cmp_rm_r(SseOpcode::Ucomisd, RegMem::reg(xmm13), xmm4),
|
|
"66410F2EE5",
|
|
"ucomisd %xmm13, %xmm4",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_cmp_rm_r(SseOpcode::Ucomisd, RegMem::reg(xmm11), xmm12),
|
|
"66450F2EE3",
|
|
"ucomisd %xmm11, %xmm12",
|
|
));
|
|
|
|
// ========================================================
|
|
// XMM_RM_R: float binary ops
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Addss, RegMem::reg(xmm1), w_xmm0),
|
|
"F30F58C1",
|
|
"addss %xmm1, %xmm0",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Addss, RegMem::reg(xmm11), w_xmm13),
|
|
"F3450F58EB",
|
|
"addss %xmm11, %xmm13",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(
|
|
SseOpcode::Addss,
|
|
RegMem::mem(Amode::imm_reg_reg_shift(123, r10, rdx, 2)),
|
|
w_xmm0,
|
|
),
|
|
"F3410F5844927B",
|
|
"addss 123(%r10,%rdx,4), %xmm0",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Addsd, RegMem::reg(xmm15), w_xmm4),
|
|
"F2410F58E7",
|
|
"addsd %xmm15, %xmm4",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Subss, RegMem::reg(xmm0), w_xmm1),
|
|
"F30F5CC8",
|
|
"subss %xmm0, %xmm1",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Subss, RegMem::reg(xmm12), w_xmm1),
|
|
"F3410F5CCC",
|
|
"subss %xmm12, %xmm1",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(
|
|
SseOpcode::Subss,
|
|
RegMem::mem(Amode::imm_reg_reg_shift(321, r10, rax, 3)),
|
|
w_xmm10,
|
|
),
|
|
"F3450F5C94C241010000",
|
|
"subss 321(%r10,%rax,8), %xmm10",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Subsd, RegMem::reg(xmm5), w_xmm14),
|
|
"F2440F5CF5",
|
|
"subsd %xmm5, %xmm14",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Mulss, RegMem::reg(xmm5), w_xmm4),
|
|
"F30F59E5",
|
|
"mulss %xmm5, %xmm4",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Mulsd, RegMem::reg(xmm5), w_xmm4),
|
|
"F20F59E5",
|
|
"mulsd %xmm5, %xmm4",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Divss, RegMem::reg(xmm8), w_xmm7),
|
|
"F3410F5EF8",
|
|
"divss %xmm8, %xmm7",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Divsd, RegMem::reg(xmm5), w_xmm4),
|
|
"F20F5EE5",
|
|
"divsd %xmm5, %xmm4",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Andps, RegMem::reg(xmm3), w_xmm12),
|
|
"440F54E3",
|
|
"andps %xmm3, %xmm12",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Andnps, RegMem::reg(xmm4), w_xmm11),
|
|
"440F55DC",
|
|
"andnps %xmm4, %xmm11",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Orps, RegMem::reg(xmm1), w_xmm15),
|
|
"440F56F9",
|
|
"orps %xmm1, %xmm15",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_rm_r(SseOpcode::Orps, RegMem::reg(xmm5), w_xmm4),
|
|
"0F56E5",
|
|
"orps %xmm5, %xmm4",
|
|
));
|
|
|
|
// XMM_Mov_R_M: float stores
|
|
insns.push((
|
|
Inst::xmm_mov_r_m(SseOpcode::Movss, xmm15, Amode::imm_reg(128, r12), None),
|
|
"F3450F11BC2480000000",
|
|
"movss %xmm15, 128(%r12)",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_mov_r_m(SseOpcode::Movsd, xmm1, Amode::imm_reg(0, rsi), None),
|
|
"F20F110E",
|
|
"movsd %xmm1, 0(%rsi)",
|
|
));
|
|
|
|
// XmmUnary: moves and unary float ops
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Movss, RegMem::reg(xmm13), w_xmm2),
|
|
"F3410F10D5",
|
|
"movss %xmm13, %xmm2",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Movsd, RegMem::reg(xmm0), w_xmm1),
|
|
"F20F10C8",
|
|
"movsd %xmm0, %xmm1",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(
|
|
SseOpcode::Movsd,
|
|
RegMem::mem(Amode::imm_reg(0, rsi)),
|
|
w_xmm2,
|
|
),
|
|
"F20F1016",
|
|
"movsd 0(%rsi), %xmm2",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Movsd, RegMem::reg(xmm14), w_xmm3),
|
|
"F2410F10DE",
|
|
"movsd %xmm14, %xmm3",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Movaps, RegMem::reg(xmm5), w_xmm14),
|
|
"440F28F5",
|
|
"movaps %xmm5, %xmm14",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Sqrtss, RegMem::reg(xmm7), w_xmm8),
|
|
"F3440F51C7",
|
|
"sqrtss %xmm7, %xmm8",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Sqrtsd, RegMem::reg(xmm1), w_xmm2),
|
|
"F20F51D1",
|
|
"sqrtsd %xmm1, %xmm2",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Cvtss2sd, RegMem::reg(xmm0), w_xmm1),
|
|
"F30F5AC8",
|
|
"cvtss2sd %xmm0, %xmm1",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_unary_rm_r(SseOpcode::Cvtsd2ss, RegMem::reg(xmm1), w_xmm0),
|
|
"F20F5AC1",
|
|
"cvtsd2ss %xmm1, %xmm0",
|
|
));
|
|
|
|
// Xmm to int conversions, and conversely.
|
|
|
|
insns.push((
|
|
Inst::xmm_to_gpr(SseOpcode::Movd, xmm0, w_rsi, OperandSize::Size32),
|
|
"660F7EC6",
|
|
"movd %xmm0, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_to_gpr(SseOpcode::Movq, xmm2, w_rdi, OperandSize::Size64),
|
|
"66480F7ED7",
|
|
"movq %xmm2, %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_to_gpr(SseOpcode::Cvttss2si, xmm0, w_rsi, OperandSize::Size32),
|
|
"F30F2CF0",
|
|
"cvttss2si %xmm0, %esi",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_to_gpr(SseOpcode::Cvttss2si, xmm0, w_rdi, OperandSize::Size64),
|
|
"F3480F2CF8",
|
|
"cvttss2si %xmm0, %rdi",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_to_gpr(SseOpcode::Cvttsd2si, xmm0, w_rax, OperandSize::Size32),
|
|
"F20F2CC0",
|
|
"cvttsd2si %xmm0, %eax",
|
|
));
|
|
insns.push((
|
|
Inst::xmm_to_gpr(SseOpcode::Cvttsd2si, xmm0, w_r15, OperandSize::Size64),
|
|
"F24C0F2CF8",
|
|
"cvttsd2si %xmm0, %r15",
|
|
));
|
|
|
|
insns.push((
|
|
Inst::gpr_to_xmm(
|
|
SseOpcode::Movd,
|
|
RegMem::reg(rax),
|
|
OperandSize::Size32,
|
|
w_xmm15,
|
|
),
|
|
"66440F6EF8",
|
|
"movd %eax, %xmm15",
|
|
));
|
|
insns.push((
|
|
Inst::gpr_to_xmm(
|
|
SseOpcode::Movd,
|
|
RegMem::mem(Amode::imm_reg(2, r10)),
|
|
OperandSize::Size32,
|
|
w_xmm9,
|
|
),
|
|
"66450F6E4A02",
|
|
"movd 2(%r10), %xmm9",
|
|
));
|
|
insns.push((
|
|
Inst::gpr_to_xmm(
|
|
SseOpcode::Movd,
|
|
RegMem::reg(rsi),
|
|
OperandSize::Size32,
|
|
w_xmm1,
|
|
),
|
|
"660F6ECE",
|
|
"movd %esi, %xmm1",
|
|
));
|
|
insns.push((
|
|
Inst::gpr_to_xmm(
|
|
SseOpcode::Movq,
|
|
RegMem::reg(rdi),
|
|
OperandSize::Size64,
|
|
w_xmm15,
|
|
),
|
|
"664C0F6EFF",
|
|
"movq %rdi, %xmm15",
|
|
));
|
|
insns.push((
|
|
Inst::gpr_to_xmm(
|
|
SseOpcode::Cvtsi2ss,
|
|
RegMem::reg(rdi),
|
|
OperandSize::Size32,
|
|
w_xmm15,
|
|
),
|
|
"F3440F2AFF",
|
|
"cvtsi2ss %edi, %xmm15",
|
|
));
|
|
insns.push((
|
|
Inst::gpr_to_xmm(
|
|
SseOpcode::Cvtsi2sd,
|
|
RegMem::reg(rsi),
|
|
OperandSize::Size64,
|
|
w_xmm1,
|
|
),
|
|
"F2480F2ACE",
|
|
"cvtsi2sd %rsi, %xmm1",
|
|
));
|
|
|
|
// ========================================================
|
|
// Misc instructions.
|
|
|
|
insns.push((Inst::Hlt, "CC", "hlt"));
|
|
|
|
let trap_info = (SourceLoc::default(), TrapCode::UnreachableCodeReached);
|
|
insns.push((Inst::Ud2 { trap_info }, "0F0B", "ud2 unreachable"));
|
|
|
|
// ========================================================
|
|
// Actually run the tests!
|
|
let flags = settings::Flags::new(settings::builder());
|
|
let rru = regs::create_reg_universe_systemv(&flags);
|
|
for (insn, expected_encoding, expected_printing) in insns {
|
|
// Check the printed text is as expected.
|
|
let actual_printing = insn.show_rru(Some(&rru));
|
|
assert_eq!(expected_printing, actual_printing);
|
|
let mut sink = test_utils::TestCodeSink::new();
|
|
let mut buffer = MachBuffer::new();
|
|
insn.emit(&mut buffer, &flags, &mut Default::default());
|
|
let buffer = buffer.finish();
|
|
buffer.emit(&mut sink);
|
|
let actual_encoding = &sink.stringify();
|
|
assert_eq!(expected_encoding, actual_encoding, "{}", expected_printing);
|
|
}
|
|
}
|