x86asm: disassemble CMP instruction's arguments in the opposite order

That way it matches what the compiler's -S flag generates, and what we write
in assembly.

  CMP AX, $16
  JLE foo

should get to foo if AX <= 16. Without this CL, the disassembly looks like

  CMP $16, AX
  JLE foo

which reads like we should get to foo if 16 <= AX, which is not what these
two instructions actually do.

It was originally this way because the CMP instruction parallels the SUB
instruction, except it throws away the non-flags result. We write that
subtraction as

  SUB $16, AX  // AX <- AX-16

but we don't need to match the SUB's disassembly order, as CMP is not
writing to a register output.

Update golang/go#60920
(This fixes the underlying issue, but the actual "fixes" comment needs to go
on the CL that vendors x/arch containing this CL into the main branch.)

Change-Id: Ifa8d3878453d6e33ae144bfdb01b34171c2106a1
Reviewed-on: https://go-review.googlesource.com/c/arch/+/505375
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
Keith Randall 2023-06-22 15:18:25 -07:00 коммит произвёл Keith Randall
Родитель 40c19ba4a7
Коммит 060bf14d30
2 изменённых файлов: 39 добавлений и 33 удалений

Просмотреть файл

@ -83,6 +83,12 @@ func GoSyntax(inst Inst, pc uint64, symname SymLookup) string {
}
}
if inst.Op == CMP {
// Use reads-left-to-right ordering for comparisons.
// See issue 60920.
args[0], args[1] = args[1], args[0]
}
if args != nil {
op += " " + strings.Join(args, ", ")
}

66
x86/x86asm/testdata/decode.txt поставляемый
Просмотреть файл

@ -2125,35 +2125,35 @@
37|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction
37|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction
3811|223344556677885f5f5f5f5f5f5f 32 intel cmp byte ptr [ecx], dl
3811|223344556677885f5f5f5f5f5f5f 32 plan9 CMPB DL, 0(CX)
3811|223344556677885f5f5f5f5f5f5f 32 plan9 CMPB 0(CX), DL
3811|223344556677885f5f5f5f5f5f5f 64 gnu cmp %dl,(%rcx)
3811|223344556677885f5f5f5f5f5f5f 64 intel cmp byte ptr [rcx], dl
3811|223344556677885f5f5f5f5f5f5f 64 plan9 CMPB DL, 0(CX)
3811|223344556677885f5f5f5f5f5f5f 64 plan9 CMPB 0(CX), DL
3911|223344556677885f5f5f5f5f5f5f 32 intel cmp dword ptr [ecx], edx
3911|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL DX, 0(CX)
3911|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL 0(CX), DX
3911|223344556677885f5f5f5f5f5f5f 64 gnu cmp %edx,(%rcx)
3911|223344556677885f5f5f5f5f5f5f 64 intel cmp dword ptr [rcx], edx
3911|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL DX, 0(CX)
3911|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL 0(CX), DX
3a11|223344556677885f5f5f5f5f5f5f 32 intel cmp dl, byte ptr [ecx]
3a11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPB 0(CX), DL
3a11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPB DL, 0(CX)
3a11|223344556677885f5f5f5f5f5f5f 64 gnu cmp (%rcx),%dl
3a11|223344556677885f5f5f5f5f5f5f 64 intel cmp dl, byte ptr [rcx]
3a11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPB 0(CX), DL
3a11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPB DL, 0(CX)
3b11|223344556677885f5f5f5f5f5f5f 32 intel cmp edx, dword ptr [ecx]
3b11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL 0(CX), DX
3b11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL DX, 0(CX)
3b11|223344556677885f5f5f5f5f5f5f 64 gnu cmp (%rcx),%edx
3b11|223344556677885f5f5f5f5f5f5f 64 intel cmp edx, dword ptr [rcx]
3b11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL 0(CX), DX
3b11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL DX, 0(CX)
3c11|223344556677885f5f5f5f5f5f5f 32 intel cmp al, 0x11
3c11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL $0x11, AL
3c11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL AL, $0x11
3c11|223344556677885f5f5f5f5f5f5f 64 gnu cmp $0x11,%al
3c11|223344556677885f5f5f5f5f5f5f 64 intel cmp al, 0x11
3c11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL $0x11, AL
3c11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL AL, $0x11
3d11223344|556677885f5f5f5f5f5f5f 32 intel cmp eax, 0x44332211
3d11223344|556677885f5f5f5f5f5f5f 32 plan9 CMPL $0x44332211, AX
3d11223344|556677885f5f5f5f5f5f5f 32 plan9 CMPL AX, $0x44332211
3d11223344|556677885f5f5f5f5f5f5f 64 gnu cmp $0x44332211,%eax
3d11223344|556677885f5f5f5f5f5f5f 64 intel cmp eax, 0x44332211
3d11223344|556677885f5f5f5f5f5f5f 64 plan9 CMPL $0x44332211, AX
3d11223344|556677885f5f5f5f5f5f5f 64 plan9 CMPL AX, $0x44332211
3e67e011|223344556677885f5f5f5f5f 32 intel addr16 loopne .+0x11
3e67e011|223344556677885f5f5f5f5f 32 plan9 LOOPNE .+17
3e67e011|223344556677885f5f5f5f5f 64 gnu loopne,pt .+0x11
@ -2482,13 +2482,13 @@
483511223344|556677885f5f5f5f5f5f 64 plan9 XORQ $0x44332211, AX
483911|223344556677885f5f5f5f5f5f 64 gnu cmp %rdx,(%rcx)
483911|223344556677885f5f5f5f5f5f 64 intel cmp qword ptr [rcx], rdx
483911|223344556677885f5f5f5f5f5f 64 plan9 CMPQ DX, 0(CX)
483911|223344556677885f5f5f5f5f5f 64 plan9 CMPQ 0(CX), DX
483b11|223344556677885f5f5f5f5f5f 64 gnu cmp (%rcx),%rdx
483b11|223344556677885f5f5f5f5f5f 64 intel cmp rdx, qword ptr [rcx]
483b11|223344556677885f5f5f5f5f5f 64 plan9 CMPQ 0(CX), DX
483b11|223344556677885f5f5f5f5f5f 64 plan9 CMPQ DX, 0(CX)
483d11223344|556677885f5f5f5f5f5f 64 gnu cmp $0x44332211,%rax
483d11223344|556677885f5f5f5f5f5f 64 intel cmp rax, 0x44332211
483d11223344|556677885f5f5f5f5f5f 64 plan9 CMPQ $0x44332211, AX
483d11223344|556677885f5f5f5f5f5f 64 plan9 CMPQ AX, $0x44332211
4850|11223344556677885f5f5f5f5f5f 64 gnu push %rax
4850|11223344556677885f5f5f5f5f5f 64 intel push rax
4850|11223344556677885f5f5f5f5f5f 64 plan9 PUSHQ AX
@ -2536,7 +2536,7 @@
48813011223344|556677885f5f5f5f5f 64 plan9 XORQ $0x44332211, 0(AX)
48813811223344|556677885f5f5f5f5f 64 gnu cmpq $0x44332211,(%rax)
48813811223344|556677885f5f5f5f5f 64 intel cmp qword ptr [rax], 0x44332211
48813811223344|556677885f5f5f5f5f 64 plan9 CMPQ $0x44332211, 0(AX)
48813811223344|556677885f5f5f5f5f 64 plan9 CMPQ 0(AX), $0x44332211
48830011|223344556677885f5f5f5f5f 64 gnu addq $0x11,(%rax)
48830011|223344556677885f5f5f5f5f 64 intel add qword ptr [rax], 0x11
48830011|223344556677885f5f5f5f5f 64 plan9 ADDQ $0x11, 0(AX)
@ -2560,7 +2560,7 @@
48833011|223344556677885f5f5f5f5f 64 plan9 XORQ $0x11, 0(AX)
48833811|223344556677885f5f5f5f5f 64 gnu cmpq $0x11,(%rax)
48833811|223344556677885f5f5f5f5f 64 intel cmp qword ptr [rax], 0x11
48833811|223344556677885f5f5f5f5f 64 plan9 CMPQ $0x11, 0(AX)
48833811|223344556677885f5f5f5f5f 64 plan9 CMPQ 0(AX), $0x11
488511|223344556677885f5f5f5f5f5f 64 gnu test %rdx,(%rcx)
488511|223344556677885f5f5f5f5f5f 64 intel test qword ptr [rcx], rdx
488511|223344556677885f5f5f5f5f5f 64 plan9 TESTQ DX, 0(CX)
@ -4233,20 +4233,20 @@
66351122|3344556677885f5f5f5f5f5f 64 intel xor ax, 0x2211
66351122|3344556677885f5f5f5f5f5f 64 plan9 XORW $0x2211, AX
663911|223344556677885f5f5f5f5f5f 32 intel cmp word ptr [ecx], dx
663911|223344556677885f5f5f5f5f5f 32 plan9 CMPW DX, 0(CX)
663911|223344556677885f5f5f5f5f5f 32 plan9 CMPW 0(CX), DX
663911|223344556677885f5f5f5f5f5f 64 gnu cmp %dx,(%rcx)
663911|223344556677885f5f5f5f5f5f 64 intel cmp word ptr [rcx], dx
663911|223344556677885f5f5f5f5f5f 64 plan9 CMPW DX, 0(CX)
663911|223344556677885f5f5f5f5f5f 64 plan9 CMPW 0(CX), DX
663b11|223344556677885f5f5f5f5f5f 32 intel cmp dx, word ptr [ecx]
663b11|223344556677885f5f5f5f5f5f 32 plan9 CMPW 0(CX), DX
663b11|223344556677885f5f5f5f5f5f 32 plan9 CMPW DX, 0(CX)
663b11|223344556677885f5f5f5f5f5f 64 gnu cmp (%rcx),%dx
663b11|223344556677885f5f5f5f5f5f 64 intel cmp dx, word ptr [rcx]
663b11|223344556677885f5f5f5f5f5f 64 plan9 CMPW 0(CX), DX
663b11|223344556677885f5f5f5f5f5f 64 plan9 CMPW DX, 0(CX)
663d1122|3344556677885f5f5f5f5f5f 32 intel cmp ax, 0x2211
663d1122|3344556677885f5f5f5f5f5f 32 plan9 CMPW $0x2211, AX
663d1122|3344556677885f5f5f5f5f5f 32 plan9 CMPW AX, $0x2211
663d1122|3344556677885f5f5f5f5f5f 64 gnu cmp $0x2211,%ax
663d1122|3344556677885f5f5f5f5f5f 64 intel cmp ax, 0x2211
663d1122|3344556677885f5f5f5f5f5f 64 plan9 CMPW $0x2211, AX
663d1122|3344556677885f5f5f5f5f5f 64 plan9 CMPW AX, $0x2211
6640|11223344556677885f5f5f5f5f5f 32 intel inc ax
6640|11223344556677885f5f5f5f5f5f 32 plan9 INCW AX
66480f3a161122|3344556677885f5f5f 64 gnu pextrq $0x22,%xmm2,(%rcx)
@ -4343,10 +4343,10 @@
6681301122|3344556677885f5f5f5f5f 64 intel xor word ptr [rax], 0x2211
6681301122|3344556677885f5f5f5f5f 64 plan9 XORW $0x2211, 0(AX)
6681381122|3344556677885f5f5f5f5f 32 intel cmp word ptr [eax], 0x2211
6681381122|3344556677885f5f5f5f5f 32 plan9 CMPW $0x2211, 0(AX)
6681381122|3344556677885f5f5f5f5f 32 plan9 CMPW 0(AX), $0x2211
6681381122|3344556677885f5f5f5f5f 64 gnu cmpw $0x2211,(%rax)
6681381122|3344556677885f5f5f5f5f 64 intel cmp word ptr [rax], 0x2211
6681381122|3344556677885f5f5f5f5f 64 plan9 CMPW $0x2211, 0(AX)
6681381122|3344556677885f5f5f5f5f 64 plan9 CMPW 0(AX), $0x2211
66830011|223344556677885f5f5f5f5f 32 intel add word ptr [eax], 0x11
66830011|223344556677885f5f5f5f5f 32 plan9 ADDW $0x11, 0(AX)
66830011|223344556677885f5f5f5f5f 64 gnu addw $0x11,(%rax)
@ -4383,10 +4383,10 @@
66833011|223344556677885f5f5f5f5f 64 intel xor word ptr [rax], 0x11
66833011|223344556677885f5f5f5f5f 64 plan9 XORW $0x11, 0(AX)
66833811|223344556677885f5f5f5f5f 32 intel cmp word ptr [eax], 0x11
66833811|223344556677885f5f5f5f5f 32 plan9 CMPW $0x11, 0(AX)
66833811|223344556677885f5f5f5f5f 32 plan9 CMPW 0(AX), $0x11
66833811|223344556677885f5f5f5f5f 64 gnu cmpw $0x11,(%rax)
66833811|223344556677885f5f5f5f5f 64 intel cmp word ptr [rax], 0x11
66833811|223344556677885f5f5f5f5f 64 plan9 CMPW $0x11, 0(AX)
66833811|223344556677885f5f5f5f5f 64 plan9 CMPW 0(AX), $0x11
668511|223344556677885f5f5f5f5f5f 32 intel test word ptr [ecx], dx
668511|223344556677885f5f5f5f5f5f 32 plan9 TESTW DX, 0(CX)
668511|223344556677885f5f5f5f5f5f 64 gnu test %dx,(%rcx)
@ -4959,10 +4959,10 @@
803011|223344556677885f5f5f5f5f5f 64 intel xor byte ptr [rax], 0x11
803011|223344556677885f5f5f5f5f5f 64 plan9 XORB $0x11, 0(AX)
803811|223344556677885f5f5f5f5f5f 32 intel cmp byte ptr [eax], 0x11
803811|223344556677885f5f5f5f5f5f 32 plan9 CMPB $0x11, 0(AX)
803811|223344556677885f5f5f5f5f5f 32 plan9 CMPB 0(AX), $0x11
803811|223344556677885f5f5f5f5f5f 64 gnu cmpb $0x11,(%rax)
803811|223344556677885f5f5f5f5f5f 64 intel cmp byte ptr [rax], 0x11
803811|223344556677885f5f5f5f5f5f 64 plan9 CMPB $0x11, 0(AX)
803811|223344556677885f5f5f5f5f5f 64 plan9 CMPB 0(AX), $0x11
810011223344|556677885f5f5f5f5f5f 32 intel add dword ptr [eax], 0x44332211
810011223344|556677885f5f5f5f5f5f 32 plan9 ADDL $0x44332211, 0(AX)
810011223344|556677885f5f5f5f5f5f 64 gnu addl $0x44332211,(%rax)
@ -4999,10 +4999,10 @@
813011223344|556677885f5f5f5f5f5f 64 intel xor dword ptr [rax], 0x44332211
813011223344|556677885f5f5f5f5f5f 64 plan9 XORL $0x44332211, 0(AX)
813811223344|556677885f5f5f5f5f5f 32 intel cmp dword ptr [eax], 0x44332211
813811223344|556677885f5f5f5f5f5f 32 plan9 CMPL $0x44332211, 0(AX)
813811223344|556677885f5f5f5f5f5f 32 plan9 CMPL 0(AX), $0x44332211
813811223344|556677885f5f5f5f5f5f 64 gnu cmpl $0x44332211,(%rax)
813811223344|556677885f5f5f5f5f5f 64 intel cmp dword ptr [rax], 0x44332211
813811223344|556677885f5f5f5f5f5f 64 plan9 CMPL $0x44332211, 0(AX)
813811223344|556677885f5f5f5f5f5f 64 plan9 CMPL 0(AX), $0x44332211
830011|223344556677885f5f5f5f5f5f 32 intel add dword ptr [eax], 0x11
830011|223344556677885f5f5f5f5f5f 32 plan9 ADDL $0x11, 0(AX)
830011|223344556677885f5f5f5f5f5f 64 gnu addl $0x11,(%rax)
@ -5039,10 +5039,10 @@
833011|223344556677885f5f5f5f5f5f 64 intel xor dword ptr [rax], 0x11
833011|223344556677885f5f5f5f5f5f 64 plan9 XORL $0x11, 0(AX)
833811|223344556677885f5f5f5f5f5f 32 intel cmp dword ptr [eax], 0x11
833811|223344556677885f5f5f5f5f5f 32 plan9 CMPL $0x11, 0(AX)
833811|223344556677885f5f5f5f5f5f 32 plan9 CMPL 0(AX), $0x11
833811|223344556677885f5f5f5f5f5f 64 gnu cmpl $0x11,(%rax)
833811|223344556677885f5f5f5f5f5f 64 intel cmp dword ptr [rax], 0x11
833811|223344556677885f5f5f5f5f5f 64 plan9 CMPL $0x11, 0(AX)
833811|223344556677885f5f5f5f5f5f 64 plan9 CMPL 0(AX), $0x11
8411|223344556677885f5f5f5f5f5f5f 32 intel test byte ptr [ecx], dl
8411|223344556677885f5f5f5f5f5f5f 32 plan9 TESTB DL, 0(CX)
8411|223344556677885f5f5f5f5f5f5f 64 gnu test %dl,(%rcx)