VirtualBox

Changeset 106772 in vbox


Ignore:
Timestamp:
Oct 29, 2024 2:07:47 PM (4 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165661
Message:

Disassembler: Compare and swap 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

    r106770 r106772  
    11161116
    11171117/**
    1118  * C4.1.94 - Loads and Stores
     1118 * C4.1.94 - Loads and Stores - Compare and swap
    11191119 *
    11201120 * Differentiate between Load register (literal) and the other classes based on op2<14> (bit 24).
     
    11241124    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0_Bit24_1),
    11251125DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0, 24);
     1126
     1127
     1128/* C4.1.94.14 - Loads and Stores - Compare and swap */
     1129DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdStCas)
     1130    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr32,       16,  5, 0 /*idxParam*/),
     1131    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr32,        0,  5, 1 /*idxParam*/),
     1132    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 2 /*idxParam*/),
     1133DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdStCas64)
     1134    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr64,       16,  5, 0 /*idxParam*/),
     1135    DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr64,        0,  5, 1 /*idxParam*/),
     1136    DIS_ARMV8_INSN_DECODE(kDisParmParseAddrGprSp,      5,  5, 2 /*idxParam*/),
     1137DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdStCas)
     1138    DIS_ARMV8_OP(           0x08a07c00, "casb",            OP_ARMV8_A64_CASB,      DISOPTYPE_HARMLESS),
     1139    DIS_ARMV8_OP(           0x08a0fc00, "caslb",           OP_ARMV8_A64_CASLB,     DISOPTYPE_HARMLESS),
     1140    DIS_ARMV8_OP(           0x08e07c00, "casab",           OP_ARMV8_A64_CASAB,     DISOPTYPE_HARMLESS),
     1141    DIS_ARMV8_OP(           0x08e0fc00, "casalb",          OP_ARMV8_A64_CASALB,    DISOPTYPE_HARMLESS),
     1142    DIS_ARMV8_OP(           0x48a07c00, "cash",            OP_ARMV8_A64_CASH,      DISOPTYPE_HARMLESS),
     1143    DIS_ARMV8_OP(           0x48a0fc00, "caslh",           OP_ARMV8_A64_CASLH,     DISOPTYPE_HARMLESS),
     1144    DIS_ARMV8_OP(           0x48e07c00, "casah",           OP_ARMV8_A64_CASAH,     DISOPTYPE_HARMLESS),
     1145    DIS_ARMV8_OP(           0x48e0fc00, "casalh",          OP_ARMV8_A64_CASALH,    DISOPTYPE_HARMLESS),
     1146    DIS_ARMV8_OP(           0x88a07c00, "cas",             OP_ARMV8_A64_CAS,       DISOPTYPE_HARMLESS),
     1147    DIS_ARMV8_OP(           0x88a0fc00, "casl",            OP_ARMV8_A64_CASL,      DISOPTYPE_HARMLESS),
     1148    DIS_ARMV8_OP(           0x88e07c00, "casa",            OP_ARMV8_A64_CASA,      DISOPTYPE_HARMLESS),
     1149    DIS_ARMV8_OP(           0x88e0fc00, "casal",           OP_ARMV8_A64_CASAL,     DISOPTYPE_HARMLESS),
     1150    DIS_ARMV8_OP_ALT_DECODE(0xc8a07c00, "cas",             OP_ARMV8_A64_CAS,       DISOPTYPE_HARMLESS, LdStCas64),
     1151    DIS_ARMV8_OP_ALT_DECODE(0xc8a0fc00, "casl",            OP_ARMV8_A64_CASL,      DISOPTYPE_HARMLESS, LdStCas64),
     1152    DIS_ARMV8_OP_ALT_DECODE(0xc8e07c00, "casa",            OP_ARMV8_A64_CASA,      DISOPTYPE_HARMLESS, LdStCas64),
     1153    DIS_ARMV8_OP_ALT_DECODE(0xc8e0fc00, "casal",           OP_ARMV8_A64_CASAL,     DISOPTYPE_HARMLESS, LdStCas64),
     1154DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdStCas, 0xffe0fc00 /*fFixedInsn*/,
     1155                                       kDisArmV8OpcDecodeCollate,
     1156                            /* o0 */     RT_BIT_32(15)
     1157                            /* L  */   | RT_BIT_32(22)
     1158                            /* size */ | RT_BIT_32(30) | RT_BIT_32(31), 15);
     1159
     1160
     1161/**
     1162 * C4.1.94 - Loads and Stores
     1163 *
     1164 * Differentiate between Load/Store ordered and Compare and swap instruction classes based on op2<11> (bit 21).
     1165 */
     1166DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStOrdered_Cas)
     1167    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo DIS_ARMV8_DECODE_MAP_ENTRY(LdStOrdered), */
     1168    DIS_ARMV8_DECODE_MAP_ENTRY(LdStCas),
     1169DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStOrdered_Cas, 21);
     1170
     1171
     1172/**
     1173 * C4.1.94 - Loads and Stores
     1174 *
     1175 * Differentiate between Advanced SIMD load/stores and the rest based on op2<13> (bit 23).
     1176 */
     1177DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0_Bit26_1)
     1178    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo  Load/store exclusive register */
     1179    DIS_ARMV8_DECODE_MAP_ENTRY(LdStOrdered_Cas),
     1180DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0_Bit26_1, 23);
     1181
     1182
     1183/**
     1184 * C4.1.94 - Loads and Stores
     1185 *
     1186 * Differentiate between Advanced SIMD load/stores and the rest based on op1 (bit 26).
     1187 */
     1188DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_0_Bit29_0)
     1189    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0_Bit26_1),
     1190    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo  Advanced SIMD load/store multiple structures (post-indexed) / Advanced SIMD load/store single structure / Advanced SIMD load/store single structure (post-indexed) */
     1191DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_0_Bit29_0, 26);
    11261192
    11271193
     
    11421208 */
    11431209DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStOp0Lo)
    1144     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,             /** @todo */
     1210    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_0_Bit29_0),
    11451211    DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0),
    11461212    DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegPair),
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r106770 r106772  
    2828.private_extern _TestProcA64
    2929_TestProcA64:
     30
     31        casb  w0,  w1, [x0]
    3032
    3133        ; Miscellaneous instructions without a parameter
     
    37073709
    37083710        ;
     3711        ; Compare and swap
     3712        ;
     3713
     3714        casb  w0,  w1, [x0]
     3715        casb wzr, wzr, [sp]
     3716
     3717        caslb  w0,  w1, [x0]
     3718        caslb wzr, wzr, [sp]
     3719
     3720        casab  w0,  w1, [x0]
     3721        casab wzr, wzr, [sp]
     3722
     3723        casalb  w0,  w1, [x0]
     3724        casalb wzr, wzr, [sp]
     3725
     3726        cash  w0,  w1, [x0]
     3727        cash wzr, wzr, [sp]
     3728
     3729        caslh  w0,  w1, [x0]
     3730        caslh wzr, wzr, [sp]
     3731
     3732        casah  w0,  w1, [x0]
     3733        casah wzr, wzr, [sp]
     3734
     3735        casalh  w0,  w1, [x0]
     3736        casalh wzr, wzr, [sp]
     3737
     3738        cas  w0,  w1, [x0]
     3739        cas wzr, wzr, [sp]
     3740
     3741        casl  w0,  w1, [x0]
     3742        casl wzr, wzr, [sp]
     3743
     3744        casa  w0,  w1, [x0]
     3745        casa wzr, wzr, [sp]
     3746
     3747        casal  w0,  w1, [x0]
     3748        casal wzr, wzr, [sp]
     3749
     3750        cas  x0,  x1, [x0]
     3751        cas xzr, xzr, [sp]
     3752
     3753        casl  x0,  x1, [x0]
     3754        casl xzr, xzr, [sp]
     3755
     3756        casa  x0,  x1, [x0]
     3757        casa xzr, xzr, [sp]
     3758
     3759        casal  x0,  x1, [x0]
     3760        casal xzr, xzr, [sp]
     3761
     3762        ;
    37093763        ; Keep last so the testcase can catch errors in
    37103764        ; the disassembly of the last instruction.
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