diff options
-rw-r--r-- | src/armv8/a64.rs | 45 | ||||
-rw-r--r-- | test/armv8/a64.rs | 8 |
2 files changed, 23 insertions, 30 deletions
diff --git a/src/armv8/a64.rs b/src/armv8/a64.rs index 5ea7f8e..0ca7bff 100644 --- a/src/armv8/a64.rs +++ b/src/armv8/a64.rs @@ -581,30 +581,17 @@ impl Display for Instruction { Opcode::HINT => { if let (Operand::ControlReg(CRn), Operand::Immediate(op2)) = (self.operands[0], self.operands[1]) { let hint_num = (CRn << 3) | op2 as u16; - return match hint_num { + return match hint_num & 0b111111 { 0 => { write!(fmt, "nop") }, 1 => { write!(fmt, "yield") }, 2 => { write!(fmt, "wfe") }, 3 => { write!(fmt, "wfi") }, 4 => { write!(fmt, "sev") }, - 5 => { write!(fmt, "sevl") }, - 7 => { write!(fmt, "xpaclri") }, - 8 => { write!(fmt, "pacia1716") }, - 10 => { write!(fmt, "pacib1716") }, - 12 => { write!(fmt, "autia1716") }, - 14 => { write!(fmt, "autib1716") }, - 16 => { write!(fmt, "esb") }, - 17 => { write!(fmt, "psb csync") }, - 18 => { write!(fmt, "tsb csync") }, - 20 => { write!(fmt, "csdb") }, - 24 => { write!(fmt, "paciaz") }, - 25 => { write!(fmt, "paciasp") }, - 26 => { write!(fmt, "pacibz") }, - 27 => { write!(fmt, "pacibsp") }, - 28 => { write!(fmt, "autiaz") }, - 29 => { write!(fmt, "autiasp") }, - 30 => { write!(fmt, "autibz") }, - 31 => { write!(fmt, "autibsp") }, + 0x10 => { write!(fmt, "esb") }, + 0x11 => { write!(fmt, "psb csync") }, + 0x12 => { write!(fmt, "tsb csync") }, + 0x14 => { write!(fmt, "csdb") }, + 0x15 => { write!(fmt, "sevl") }, _ => { write!(fmt, "hint #{:#x}", hint_num) } } } @@ -2931,9 +2918,11 @@ impl Display for Operand { } } Operand::RegRegOffset(reg, index_reg, index_size, extend, amount) => { - if ((extend == &ShiftStyle::UXTW && index_size == &SizeCode::W) || - (extend == &ShiftStyle::UXTX && index_size == &SizeCode::X)) && - *amount == 0 { + if extend == &ShiftStyle::LSL && *amount == 0 { + write!(fmt, "[{}, {}]", Operand::RegisterOrSP(SizeCode::X, *reg), Operand::Register(*index_size, *index_reg)) + } else if ((extend == &ShiftStyle::UXTW && index_size == &SizeCode::W) || + (extend == &ShiftStyle::UXTX && index_size == &SizeCode::X)) && + *amount == 0 { write!(fmt, "[{}, {}, {}]", Operand::RegisterOrSP(SizeCode::X, *reg), Operand::Register(*index_size, *index_reg), extend) } else { write!(fmt, "[{}, {}, {} #{}]", Operand::RegisterOrSP(SizeCode::X, *reg), Operand::Register(*index_size, *index_reg), extend, amount) @@ -10314,7 +10303,7 @@ impl Decoder<ARMv8> for InstDecoder { Operand::Nothing, Operand::Nothing ]; - } else if (word & 0x1fffff) == 0x1f081f { + } else if (word & 0x1ffc1f) == 0x1f081f { inst.opcode = Opcode::BRAAZ; inst.operands = [ Operand::Register(SizeCode::X, Rn as u16), @@ -10322,7 +10311,7 @@ impl Decoder<ARMv8> for InstDecoder { Operand::Nothing, Operand::Nothing, ]; - } else if (word & 0x1fffff) == 0x1f0c1f { + } else if (word & 0x1ffc1f) == 0x1f0c1f { inst.opcode = Opcode::BRABZ; inst.operands = [ Operand::Register(SizeCode::X, Rn as u16), @@ -10345,7 +10334,7 @@ impl Decoder<ARMv8> for InstDecoder { Operand::Nothing, Operand::Nothing ]; - } else if (word & 0x1fffff) == 0x1f081f { + } else if (word & 0x1ffc1f) == 0x1f081f { inst.opcode = Opcode::BLRAAZ; inst.operands = [ Operand::Register(SizeCode::X, Rn as u16), @@ -10353,7 +10342,7 @@ impl Decoder<ARMv8> for InstDecoder { Operand::Nothing, Operand::Nothing, ]; - } else if (word & 0x1fffff) == 0x1f0c1f { + } else if (word & 0x1ffc1f) == 0x1f0c1f { inst.opcode = Opcode::BLRABZ; inst.operands = [ Operand::Register(SizeCode::X, Rn as u16), @@ -10456,7 +10445,7 @@ impl Decoder<ARMv8> for InstDecoder { } } else if opc == 0b001 { // implied leading bit means opc = 0b1001 - if word & 0xff_ff_fc_00 == 0xd7_1f_0c_00 { + if word & 0xff_ff_fc_00 == 0xd7_3f_08_00 { // op3 = 000011 // register modifier variant inst.opcode = Opcode::BLRAA; @@ -10467,7 +10456,7 @@ impl Decoder<ARMv8> for InstDecoder { Operand::Nothing, Operand::Nothing, ]; - } else if word & 0xff_ff_fc_00 == 0xd7_1f_08_00 { + } else if word & 0xff_ff_fc_00 == 0xd7_3f_0c_00 { // op3 = 000011 inst.opcode = Opcode::BLRAB; diff --git a/test/armv8/a64.rs b/test/armv8/a64.rs index 8d34a04..1dea7e1 100644 --- a/test/armv8/a64.rs +++ b/test/armv8/a64.rs @@ -4183,8 +4183,8 @@ fn test_openblas_misc_ops() { ([0x54, 0xd0, 0x3b, 0xd5], "mrs x20, tpidr_el0"), ([0x41, 0xe0, 0x3b, 0xd5], "mrs x1, cntvct_el0"), ([0x55, 0xe0, 0x3b, 0xd5], "mrs x21, cntvct_el0"), - ([0xe2, 0x69, 0xb6, 0xf8], "prfm pldl2keep, [x15, x22, lsl #0]"), - ([0x00, 0x6a, 0xb7, 0xf8], "prfm pldl1keep, [x16, x23, lsl #0]"), + ([0xe2, 0x69, 0xb6, 0xf8], "prfm pldl2keep, [x15, x22]"), + ([0x00, 0x6a, 0xb7, 0xf8], "prfm pldl1keep, [x16, x23]"), ([0x80, 0x00, 0x80, 0xf9], "prfm pldl1keep, [x4]"), ([0x81, 0x00, 0x80, 0xf9], "prfm pldl1strm, [x4]"), ([0x00, 0x02, 0x80, 0xf9], "prfm pldl1keep, [x16]"), @@ -4772,7 +4772,9 @@ fn test_uq() { fn test_cfi() { const TESTS: &[([u8; 4], &'static str)] = &[ ([0x1f, 0x08, 0x1f, 0xd6], "braaz x0"), + ([0x3f, 0x08, 0x1f, 0xd6], "braaz x1"), ([0x00, 0x08, 0x1f, 0xd7], "braa x0, x0"), + ([0x00, 0x08, 0x3f, 0xd7], "blraa x0, x0"), ]; let errs = run_tests(TESTS); @@ -4864,6 +4866,8 @@ fn test_misc() { ([0x00, 0x30, 0xc0, 0x9a], "pacga x0, x0, x0"), ([0x00, 0x00, 0xae, 0x9e], "fmov x0, v0.d[1]"), ([0x00, 0x00, 0xe6, 0x9e], "fmov x0, h0"), + ([0x7f, 0x41, 0x00, 0xd5], "msr pstate.58, #0x1"), + ([0x00, 0x68, 0x20, 0x38], "strb w0, [x0, x0]"), ]; let errs = run_tests(TESTS); |