mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +03:00
[Bug] Fixed VPTERNLOG[D|Q] RW info when the predicate doesn't influence DST
This commit is contained in:
@@ -827,7 +827,7 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_*
|
||||
constexpr OpRWFlags RegPhys = OpRWFlags::kRegPhysId;
|
||||
constexpr OpRWFlags MibRead = OpRWFlags::kMemBaseRead | OpRWFlags::kMemIndexRead;
|
||||
|
||||
if (instRwInfo.category == InstDB::RWInfo::kCategoryGeneric) {
|
||||
if (instRwInfo.category <= uint32_t(InstDB::RWInfo::kCategoryGenericEx)) {
|
||||
uint32_t i;
|
||||
uint32_t rmOpsMask = 0;
|
||||
uint32_t rmMaxSize = 0;
|
||||
@@ -948,6 +948,25 @@ Error InstInternal::queryRWInfo(Arch arch, const BaseInst& inst, const Operand_*
|
||||
} while (it.hasNext());
|
||||
}
|
||||
|
||||
// Special cases per instruction.
|
||||
if (instRwInfo.category == InstDB::RWInfo::kCategoryGenericEx) {
|
||||
switch (inst.id()) {
|
||||
case Inst::kIdVpternlogd:
|
||||
case Inst::kIdVpternlogq: {
|
||||
if (opCount == 4 && operands[3].isImm()) {
|
||||
uint32_t predicate = operands[3].as<Imm>().valueAs<uint8_t>();
|
||||
if ((predicate >> 4) == (predicate & 0xF)) {
|
||||
out->_operands[0].clearOpFlags(OpRWFlags::kRead);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rwHandleAVX512(inst, commonInfo, out);
|
||||
}
|
||||
|
||||
|
||||
@@ -5434,14 +5434,14 @@ const uint8_t InstDB::rwInfoIndexB[Inst::_kIdCount] = {
|
||||
84, 84, 3, 3, 164, 164, 164, 164, 3, 0, 0, 0, 0, 164, 164, 164, 164, 164, 164,
|
||||
3, 3, 120, 120, 120, 3, 164, 164, 3, 3, 120, 120, 120, 3, 3, 103, 84, 84, 84,
|
||||
3, 3, 3, 165, 166, 165, 3, 3, 3, 167, 165, 168, 3, 3, 3, 167, 165, 166, 165,
|
||||
3, 3, 3, 167, 3, 3, 3, 3, 3, 3, 3, 3, 120, 120, 0, 103, 103, 103, 103, 103, 103,
|
||||
3, 3, 3, 167, 3, 3, 3, 3, 3, 3, 3, 3, 169, 169, 0, 103, 103, 103, 103, 103, 103,
|
||||
103, 103, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 139, 141, 0, 0, 139, 141,
|
||||
0, 0, 139, 141, 0, 0, 140, 141, 84, 84, 84, 139, 140, 141, 84, 84, 84, 139, 140,
|
||||
141, 84, 84, 139, 141, 0, 0, 139, 141, 0, 0, 139, 141, 0, 0, 140, 141, 3, 3,
|
||||
3, 99, 100, 101, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 3, 3, 3, 3, 3,
|
||||
3, 0, 0, 0, 139, 140, 141, 92, 3, 3, 3, 99, 100, 101, 0, 0, 0, 0, 0, 3, 3, 3,
|
||||
3, 3, 3, 0, 0, 0, 0, 56, 56, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0,
|
||||
170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, 169, 0, 0
|
||||
3, 3, 3, 0, 0, 0, 0, 56, 56, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0,
|
||||
171, 171, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 170, 0, 0
|
||||
};
|
||||
|
||||
const InstDB::RWInfo InstDB::rwInfoA[] = {
|
||||
@@ -5705,7 +5705,7 @@ const InstDB::RWInfo InstDB::rwInfoB[] = {
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 52, { 10, 80, 0 , 0 , 0 , 0 } }, // #117 [ref=2x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 52, { 10, 3 , 0 , 0 , 0 , 0 } }, // #118 [ref=4x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 53, { 79, 43, 0 , 0 , 0 , 0 } }, // #119 [ref=4x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #120 [ref=82x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #120 [ref=80x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 5 , 5 , 0 , 0 , 0 } }, // #121 [ref=4x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 40, { 4 , 61, 7 , 0 , 0 , 0 } }, // #122 [ref=1x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 42, { 4 , 81, 9 , 0 , 0 , 0 } }, // #123 [ref=1x]
|
||||
@@ -5754,9 +5754,10 @@ const InstDB::RWInfo InstDB::rwInfoB[] = {
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 68, { 11, 3 , 0 , 0 , 0 , 0 } }, // #166 [ref=2x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 69, { 11, 3 , 5 , 0 , 0 , 0 } }, // #167 [ref=3x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 22, { 11, 3 , 5 , 0 , 0 , 0 } }, // #168 [ref=1x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 0 , { 60, 17, 29, 0 , 0 , 0 } }, // #169 [ref=2x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 60, 17, 0 , 0 , 0 } }, // #170 [ref=4x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 60, 17, 0 , 0 , 0 } } // #171 [ref=8x]
|
||||
{ InstDB::RWInfo::kCategoryGenericEx , 6 , { 2 , 3 , 3 , 0 , 0 , 0 } }, // #169 [ref=2x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 0 , { 60, 17, 29, 0 , 0 , 0 } }, // #170 [ref=2x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 8 , { 3 , 60, 17, 0 , 0 , 0 } }, // #171 [ref=4x]
|
||||
{ InstDB::RWInfo::kCategoryGeneric , 8 , { 11, 60, 17, 0 , 0 , 0 } } // #172 [ref=8x]
|
||||
};
|
||||
|
||||
const InstDB::RWInfoOp InstDB::rwInfoOp[] = {
|
||||
|
||||
@@ -213,7 +213,8 @@ struct InstNameIndex {
|
||||
|
||||
struct RWInfo {
|
||||
enum Category : uint8_t {
|
||||
kCategoryGeneric,
|
||||
kCategoryGeneric = 0,
|
||||
kCategoryGenericEx,
|
||||
kCategoryMov,
|
||||
kCategoryMovabs,
|
||||
kCategoryImul,
|
||||
|
||||
@@ -2236,8 +2236,18 @@ class InstRWInfoTable extends core.Task {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const name = dbInsts.length ? dbInsts[0].name : "";
|
||||
|
||||
switch (name) {
|
||||
case "vpternlogd":
|
||||
case "vpternlogq":
|
||||
return { category: "GenericEx", rwOps };
|
||||
|
||||
default:
|
||||
return { category: "Generic", rwOps };
|
||||
}
|
||||
}
|
||||
|
||||
function queryRwByData(dbInsts, rwOpsArray) {
|
||||
for (var i = 0; i < dbInsts.length; i++) {
|
||||
|
||||
Reference in New Issue
Block a user