VirtualBox

Changeset 106757 in vbox for trunk/src/VBox/Disassembler


Ignore:
Timestamp:
Oct 28, 2024 2:59:05 PM (3 months ago)
Author:
vboxsync
Message:

Disassembler: Decode SIMD ldr/str (immediate pre index) instructions, bugref:10394

Location:
trunk/src/VBox/Disassembler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h

    r106756 r106757  
    292292
    293293
     294/* SIMD STR/LDR */
     295DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdStRegImmPreIndexSimd)
     296    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize,        30,  2, DIS_ARMV8_INSN_PARAM_UNSET),
     297    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar,       0,  5, 0 /*idxParam*/),
     298    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,           5,  5, 1 /*idxParam*/),
     299    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmMemOffUnscaled, 12,  9, 1 /*idxParam*/),
     300    DIS_ARMV8_INSN_DECODE(kDisParmParseSetPreIndexed,       0,  0, 1 /*idxParam*/),
     301DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStRegImmPreIndexSimd128)
     302    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize128,      0,  0, DIS_ARMV8_INSN_PARAM_UNSET),
     303    DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar,       0,  5, 0 /*idxParam*/),
     304    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,           5,  5, 1 /*idxParam*/),
     305    DIS_ARMV8_INSN_DECODE(kDisParmParseSImmMemOffUnscaled, 12,  9, 1 /*idxParam*/),
     306    DIS_ARMV8_INSN_DECODE(kDisParmParseSetPreIndexed,       0,  0, 1 /*idxParam*/),
     307DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdStRegImmPreIndexSimd)
     308    DIS_ARMV8_OP(           0x3c000c00, "str",             OP_ARMV8_A64_STR,       DISOPTYPE_HARMLESS),
     309    DIS_ARMV8_OP(           0x3c400c00, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS),
     310    DIS_ARMV8_OP_ALT_DECODE(0x3c800c00, "str",             OP_ARMV8_A64_STR,       DISOPTYPE_HARMLESS, LdStRegImmPreIndexSimd128), /** @todo size == 0. */
     311    DIS_ARMV8_OP_ALT_DECODE(0x3cc00c00, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS, LdStRegImmPreIndexSimd128), /** @todo size == 0. */
     312DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdStRegImmPreIndexSimd, 0x3fe00c00 /*fFixedInsn*/,
     313                                       kDisArmV8OpcDecodeNop,
     314                                       RT_BIT_32(22) | RT_BIT_32(23), 22);
     315
     316
    294317/*
    295318 * C4.1.94.28 - Loads and Stores - Load/Store register (immediate pre-indexed) variants
     
    304327DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStRegImmPreIndex)
    305328    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegImmPreIndexGpr),
    306     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo */
     329    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegImmPreIndexSimd),
    307330DIS_ARMV8_DECODE_MAP_DEFINE_END(LdStRegImmPreIndex, RT_BIT_32(26), 26);
    308331
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106756 r106757  
    16031603
    16041604
     1605        ldr b0, [x28, #0]!
     1606        ldr b0, [x28, #-256]!
     1607        ldr b0, [x28, #255]!
     1608
     1609        ldr b31, [sp, #0]!
     1610        ldr b31, [sp, #-256]!
     1611        ldr b31, [sp, #255]!
     1612
     1613        ldr h0, [x28, #0]!
     1614        ldr h0, [x28, #-256]!
     1615        ldr h0, [x28, #255]!
     1616
     1617        ldr h31, [sp, #0]!
     1618        ldr h31, [sp, #-256]!
     1619        ldr h31, [sp, #255]!
     1620
     1621        ldr s0, [x28, #0]!
     1622        ldr s0, [x28, #-256]!
     1623        ldr s0, [x28, #255]!
     1624
     1625        ldr s31, [sp, #0]!
     1626        ldr s31, [sp, #-256]!
     1627        ldr s31, [sp, #255]!
     1628
     1629        ldr d0, [x28, #0]!
     1630        ldr d0, [x28, #-256]!
     1631        ldr d0, [x28, #255]!
     1632
     1633        ldr d31, [sp, #0]!
     1634        ldr d31, [sp, #-256]!
     1635        ldr d31, [sp, #255]!
     1636
     1637        ldr q0, [x28, #0]!
     1638        ldr q0, [x28, #-256]!
     1639        ldr q0, [x28, #255]!
     1640
     1641        ldr q31, [sp, #0]!
     1642        ldr q31, [sp, #-256]!
     1643        ldr q31, [sp, #255]!
     1644
     1645
    16051646        ; SIMD memory stores
    16061647        str b0, [x0]
     
    18331874        str q31, [sp], #-256
    18341875        str q31, [sp], #255
     1876
     1877
     1878        str b0, [x28, #0]!
     1879        str b0, [x28, #-256]!
     1880        str b0, [x28, #255]!
     1881
     1882        str b31, [sp, #0]!
     1883        str b31, [sp, #-256]!
     1884        str b31, [sp, #255]!
     1885
     1886        str h0, [x28, #0]!
     1887        str h0, [x28, #-256]!
     1888        str h0, [x28, #255]!
     1889
     1890        str h31, [sp, #0]!
     1891        str h31, [sp, #-256]!
     1892        str h31, [sp, #255]!
     1893
     1894        str s0, [x28, #0]!
     1895        str s0, [x28, #-256]!
     1896        str s0, [x28, #255]!
     1897
     1898        str s31, [sp, #0]!
     1899        str s31, [sp, #-256]!
     1900        str s31, [sp, #255]!
     1901
     1902        str d0, [x28, #0]!
     1903        str d0, [x28, #-256]!
     1904        str d0, [x28, #255]!
     1905
     1906        str d31, [sp, #0]!
     1907        str d31, [sp, #-256]!
     1908        str d31, [sp, #255]!
     1909
     1910        str q0, [x28, #0]!
     1911        str q0, [x28, #-256]!
     1912        str q0, [x28, #255]!
     1913
     1914        str q31, [sp, #0]!
     1915        str q31, [sp, #-256]!
     1916        str q31, [sp, #255]!
    18351917
    18361918
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette