feat(disasm): name the CLDEMOTE encoding the decoder refuses
The hint NOP opcode 0F 1C /r with a memory operand is CLDEMOTE, a memory-only instruction the toolchain's own table carries; the decoder rejects the encoding instead of naming it. The rejected-encoding side of the supplementary table names it from the bytes, and the corpus row 0f1c03 pins the text in the unlisted fixture, round trip byte exact. Assisted-by: GLM 5.3 Flash
This commit is contained in:
1 parent
dd356b9e6a
commit
458d981f31
4 files changed
+36
-3
No files matched your search
@@ -318,3 +318,24 @@ func nameAMD64Endbr(p amd64Prefixes, tail []byte) (string, int, bool) {
|
||||
}
|
||||
return "", 0, false
|
||||
}
|
||||
|
||||
// nameAMD64Rejected names an amd64 encoding the decoder refuses outright,
|
||||
// one family at a time as the corpus rows land. CLDEMOTE, NP 0F 1C /r
|
||||
// with a memory operand, is the first: the toolchain's own table carries
|
||||
// it as a memory-only instruction, and the decoder rejects the encoding
|
||||
// instead of naming it. The register forms of the same opcode are the
|
||||
// hint NOPs the corpus does not spell, and they stay rejected.
|
||||
func nameAMD64Rejected(code []byte) (string, int, bool) {
|
||||
p, ok := scanAMD64Prefixes(code)
|
||||
if !ok || p.osz || p.rep || p.repne {
|
||||
return "", 0, false
|
||||
}
|
||||
if len(code) < p.n+3 || code[p.n] != 0x0f || code[p.n+1] != 0x1c {
|
||||
return "", 0, false
|
||||
}
|
||||
rm, ok := decodeAMD64RM(code[p.n+2:], p.rexR, p.rexX, p.rexB)
|
||||
if !ok || rm.regForm {
|
||||
return "", 0, false
|
||||
}
|
||||
return "CLDEMOTE " + rm.text(), p.n + 2 + rm.n, true
|
||||
}
|
||||
Reference in new issue
Block a user