fix(asm): encode the CMOV condition the renderer prints
The renderer spells a conditional move CMOV plus the condition alone (CMOVLE, CMOVG), the width carried by the operand registers, so CMOVLE parsed as the size L and the condition E and encoded CMOVE. A suffix that is itself a condition name now reads as that condition with the width from the destination register, and the Plan 9 size-prefixed spellings keep their parse. Assisted-by: GLM 5.3 Flash
This commit is contained in:
1 parent
11cac26508
commit
abc2d32b83
3 files changed
+64
-30
No files matched your search
+14
-3
@@ -411,6 +411,16 @@ func TestScalarGroundTruth(t *testing.T) {
|
||||
{"CMOVLEQ CX,AX", "CMOVLEQ", []Operand{CX, AX}, "0f44c1", "CMOVE"},
|
||||
{"CMOVQGT R9,R8", "CMOVQGT", []Operand{r9, r8}, "4d0f4fc1", "CMOVG"},
|
||||
{"CMOVWLS R9W,R8W", "CMOVWLS", []Operand{r9w, r8w}, "66450f46c1", "CMOVBE"},
|
||||
// The renderer's condition spellings carry no size letter; the width
|
||||
// rides the operand registers and the bytes match the toolchain's own
|
||||
// size-prefixed spellings (CMOVQLE/CMOVLLE/CMOVWLE pinned from go tool
|
||||
// asm). CMOVLE with the 16-bit registers reproduces the disasm
|
||||
// fixture's 660f4e13 row byte for byte.
|
||||
{"CMOVLE (BX),DX", "CMOVLE", []Operand{Ptr(BX, 0, 2), DX}, "660f4e13", "CMOVLE"},
|
||||
{"CMOVQLE AX,BX", "CMOVQLE", []Operand{Reg{idx: 0, size: 8}, Reg{idx: 3, size: 8}}, "480f4ed8", "CMOVLE"},
|
||||
{"CMOVLLE AX,BX", "CMOVLLE", []Operand{Reg{idx: 0, size: 4}, Reg{idx: 3, size: 4}}, "0f4ed8", "CMOVLE"},
|
||||
{"CMOVWLE AX,BX", "CMOVWLE", []Operand{AX, BX}, "660f4ed8", "CMOVLE"},
|
||||
{"CMOVB AL,CL", "CMOVB", []Operand{AL, CL}, "0f42c8", "CMOVB"},
|
||||
{"SETNE AL", "SETNE", []Operand{AL}, "0f95c0", "SETNE"},
|
||||
{"SETNE (AX)", "SETNE", []Operand{Ptr(AX, 0, 1)}, "0f9500", "SETNE"},
|
||||
{"MOVBLZX AL,CX", "MOVBLZX", []Operand{AL, CX}, "0fb6c8", "MOVZX"},
|
||||
@@ -595,14 +605,15 @@ func TestImmediateTruncation(t *testing.T) {
|
||||
|
||||
// TestEncodableCmovSize pins the linter contract for CMOVcc: Encodable must
|
||||
// reject the spellings Encode rejects, so a mnemonic like CMOVBGT (no size
|
||||
// letter) is not reported as encodable.
|
||||
// letter) is not reported as encodable. The condition-name spellings the
|
||||
// renderer prints (CMOVB, CMOVLE) encode with the width from the operands.
|
||||
func TestEncodableCmovSize(t *testing.T) {
|
||||
for _, m := range []string{"CMOVBGT", "CMOVXEQ", "CMOVB", "CMOV", "CMOVWXX"} {
|
||||
for _, m := range []string{"CMOVBGT", "CMOVXEQ", "CMOV", "CMOVWXX"} {
|
||||
if Encodable(m) {
|
||||
t.Errorf("Encodable(%q) = true, want false", m)
|
||||
}
|
||||
}
|
||||
for _, m := range []string{"CMOVLGT", "CMOVQGT", "CMOVWLS", "CMOVLEQ"} {
|
||||
for _, m := range []string{"CMOVLGT", "CMOVQGT", "CMOVWLS", "CMOVLEQ", "CMOVB", "CMOVLE"} {
|
||||
if !Encodable(m) {
|
||||
t.Errorf("Encodable(%q) = false, want true", m)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user