aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-08-02sufficiently advanced SIMD is indistinguishable from coprocessorsiximeow
2026-08-02thumb2 preload improvementsiximeow
2026-08-02thumb SIMD encoding should have returned Incompleteiximeow
2026-08-02pkhbt/pkhtb bitmask confusioniximeow
2026-08-02Test Target, fix bogus MRS destinationsiximeow
2026-08-02ldrexd changelogiximeow
2026-08-02thumb mrs/msr first operand was wildly wrongiximeow
2026-07-28temp, armv8-thumbiximeow
2026-07-28thumb2: fix parallel addition/subtraction, (un)signediximeow
2026-07-28thumb: when nonconforming, allow it/cond=1111 like capstoneiximeow
2026-07-28thumb differential: segment out a few categories of diffiximeow
2026-07-28capstone prints thumb add/sub sp+immediate as two operandsiximeow
2026-07-28differential test should tolerate a few more differencesiximeow
2026-07-28untangle some nonconforming ld/st formsiximeow
2026-07-28lsl/mov aliasingiximeow
2026-07-28differential testing wipiximeow
2026-07-28fix thumb2 TBH decode: wrong opcode and register-shift operandBrandon Ros
the T1 TBH arm set Opcode::TBB instead of Opcode::TBH, and built the index operand with bit 4 set in the RegShift raw value. bit 4 is the RegReg selector in RegShift::into_shift, so the mandatory 'lsl #1' index scaling decoded as a register shift 'lsl r0' instead. clear bit 4 so it reads back as the RegImm 'lsl #1' the encoding specifies. verified against binutils objdump: df e8 13 f0 is tbh [pc, r3, lsl #1].
2026-07-28fix more thumb2 register data-processing decode bugsBrandon Ros
- register-controlled shifts (lsl/lsr/asr/ror by register) all decoded as lsl: the shift type was read from hw1[6:5] (always 0 for this form) instead of hw0[6:5] - 32-bit uxt*/sxt* extends read the ror amount from the wrong field (hw1[2:1] scaled by 4 instead of hw1[5:4] scaled by 8), so a no-rotation extend came back as ror #4; rotation of 0 is now omitted - sxtab was decoded as sxtah (wrong opcode table entry) all cases verified against binutils objdump
2026-07-28some armv7/thumb arms are basically duplicateiximeow
2026-07-28fix several thumb2 decode bugsBrandon Ros
- 32-bit store encodings with the imm12 bit (bit 23) set were decoded as the register-offset form when imm12 < 64, or as strbt/strht/strt when imm12 was 0xExx. bit 23 set always means the imm12 form. - movw/movt packed imm4 at bit 16 instead of bit 12, producing 20-bit immediates (e.g. 0xf0005 instead of 0xf005) - mvn (immediate) was decoded as mov, dropping the bitwise not - ror (immediate) was decoded as asr all cases verified against binutils objdump
2026-07-28Do not add an 's' when outputing opcodes that always set flagsGrond
2026-07-28Decode the correct number of operands for TST/TEQ (immediate/register)Grond
2026-07-28Simplify decoding of register-shifted-register data-processing instructionsGrond
Previously, immediate-shifted-register and register-shifted-register data-processing instructions were decoded using separate decoding paths, which caused extra complexity. These two forms differ only in the interpretation of their shifting constructs, which is already handled through the `RegShift` type. This change also fixes instructions like `cmp r0, r1, lsl r2` from being decoded with an extra operand.
2026-07-28probably should decide where imm-shifted reg normalization happensiximeow
2026-07-28Decode the correct number of operands for CMP/CMN (immediate/register)Grond
This also incidentally fixes an issue where MOV/MVN instructions with a shifted operand could be decoded as if they had 3 operands.
2026-07-28Fix the handling of reserved bits in uncommon loads/storesGrond
There's a pattern of load/store instructions that look something like * `ldr<variant> <target registers>, [<base register>, +/- <offset register>]` * `str<variant> <target registers>, [<base register>, +/- <offset register>]` These instructions share a common encoding format, which includes the presence of 4 reserved bits starting at bit 8 in the instruction word. These bits should always be zero, according to `DDI0406C_d_armv7ar_arm.pdf`. However, while this crate did attempt to validate these bits sometimes, the validation was inverted. Instead of checking that the bits were zero, the validation would raise an error if all of the bits were zero! Additionally, some instructions were missing the check and some instructions that did not use the aforementioned encoding scheme incorrectly had the check applied to them. This commit fixes all of the issues I've found along these lines so far.
2026-07-28Check all of the appropriate bits when parsing op1 for CDP2/MCR2/MRC2Grond
2026-07-28Implement the RRX immediate shift typeGrond
2026-07-28Fix the handling of arithmetic register shifts with zero immediatesGrond
2026-06-19Add armv7::InstDecoder::in_thumb_mode() methodSamuel Arnold
2026-02-22support A1 encoding of several coprocessor instructions + SVCrva3
initially was "implement MCR/MRC decoding", but expanded to include the whole coprocessor space for completeness, and then SVC is right there too. Neon instructions in this space are still rejected, as neon support is not really there yet. Co-authored-by: iximeow <me@iximeow.net>
2026-02-22properly display coprocessor higher than 9rva3
2026-02-22rename MCR2/MRC2 to MCR/MRCrva3
they share exactly the same encoding, except the high bits for condition the bool indicates if it's A2 encondings which is unconditional
2026-02-22derive Clone and Copy for armv7 instructionrva3
2025-10-19run differential test0.4.0iximeow
2025-10-19adjust goodfile to exercise feature matrix moreiximeow
2025-10-19alloc needs yaxpeax-arch alloc tooiximeow
2025-10-19Remove empty format precision specifierMarijn Schouten
A format precision specifier consisting of a dot and no number actually does nothing and has no specified meaning. Currently this is silently ignored, but it may turn into a warning or error. See rust-lang/rust#131159 and rust-lang/rust#136638
2025-10-19update changelog, no 0.3.2 after alliximeow
2025-10-19Opcode and Operand should be non-exhaustiveiximeow
but exhaustiveness checking is very valuable here, so allow it to be disabled. caveats apply. read the docs in Cargo.toml.
2025-10-19avoid subtle changes to A64 Opcode enum discriminant choicesiximeow
2025-10-19tag instruction decode fixes, differential test precisioniximeow
2025-10-19fix opcode display for ldgMartin Fink
2025-10-19visitor-oriented fmtiximeow
this makes a decode+format benchmark drop from 75s to 14s... (decode is 5s)
2025-06-20changelog + another inlineiximeow
2025-06-02some armv7 decode helpers are trivial functions but didn't inlineiximeow
both from_u8 and the build function here compiled to truly trivial code: four instructions (mov rdi, rax; cmp 0xlim, rax; jae panic; ret) in the hot path, and constrained register choice on the caller side. inlining these makes for a *smaller* armv7 decoder, on the order of 5kb down from 5.5kb. in the process it also gets about 45% faster (400mb/s to 560mb/s) inlining decode_into, then, really just helps the standalone decoder benchmark case. this moves decode throughput from 560mb/s to 724mb/s.
2025-05-25support the rest of PAC instructions. compare to a more recent capstoneiximeow
capstone-rs currently binds an old capstone (4.0), where capstone 5.0 is where much of the armv8.2+ implementation was ported over from LLVM. so, differential testing is now pointed to a capstone-rs fork pending the merge of https://github.com/capstone-rust/capstone-rs/pull/172
2025-02-060.3.10.3.1iximeow
2025-02-06actually check no-std configuration does not transitively depend on stdiximeow
2025-02-04Disable bitvec features to fix no_stdLuke Street