[llvm] [M68k] Fix register class of index operands (PR #156146)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 30 00:38:29 PDT 2025
s-barannikov wrote:
OK I've figured out what the real issue is, but it is over my head to fix it right now.
In case someone is interested, there are some instructions with duplicated encodings. The TableGen disassembler backend doesn't catch these bugs at the moment. For example:
```
________________0011___001111010 MOV16aq
________________0011___000111010 MOV16dq
________________0011___00_111010 MOV16rq
```
Here, `MOV16rq` can never be decoded. The unknown bit 6 is 1 in `aq` and 0 in `dq`, which leaves no possible values for `rq` version. Either `rq` or the two others should be marked as `isCodeGenOnly`.
Other conflicts are similar, some are more involved.
<details>
<summary>Full list of conflicts</summary>
```
Decoding Conflict:
0010...00.00....
0010___001001___ MOV32aa
0010___00100____ MOV32ar
0010___000000___ MOV32dd
0010___00_001___ MOV32ra
0010___00_00____ MOV32rr
Decoding Conflict:
0010...01000....
0010___010001___ MOV32ja
0010___010000___ MOV32jd
0010___01000____ MOV32jr
Decoding Conflict:
0010...01100....
0010___011001___ MOV32oa
0010___011000___ MOV32od
0010___01100____ MOV32or
Decoding Conflict:
0010...10000....
0010___100001___ MOV32ea
0010___100000___ MOV32ed
0010___10000____ MOV32er
Decoding Conflict:
................0010...10100....
________________0010___101001___ MOV32pa
________________0010___101000___ MOV32pd
________________0010___10100____ MOV32pr
Decoding Conflict:
....1000........0010...11000....
____1000________0010___110001___ MOV32fa
____1000________0010___110000___ MOV32fd
____1000________0010___11000____ MOV32fr
Decoding Conflict:
................................001000111100....
________________________________0010001111001___ MOV32ba
________________________________0010001111000___ MOV32bd
________________________________001000111100____ MOV32br
Decoding Conflict:
................001001011100....
________________0010010111001___ MOV32qa
________________0010010111000___ MOV32qd
________________001001011100____ MOV32qr
Decoding Conflict:
....1000........001001111100....
____1000________0010011111001___ MOV32ka
____1000________0010011111000___ MOV32kd
____1000________001001111100____ MOV32kr
Decoding Conflict:
0010...00.010...
0010___001010___ MOV32aj
0010___000010___ MOV32dj
0010___00_010___ MOV32rj
Decoding Conflict:
0010...00.011...
0010___001011___ MOV32ao
0010___000011___ MOV32do
0010___00_011___ MOV32ro
Decoding Conflict:
0010...00.100...
0010___001100___ MOV32ae
0010___000100___ MOV32de
0010___00_100___ MOV32re
Decoding Conflict:
................0010...00.101...
________________0010___001101___ MOV32ap
________________0010___000101___ MOV32dp
________________0010___00_101___ MOV32rp
Decoding Conflict:
....1000........0010...00.110...
____1000________0010___001110___ MOV32af
____1000________0010___000110___ MOV32df
____1000________0010___00_110___ MOV32rf
Decoding Conflict:
................................0010...00.111001
________________________________0010___001111001 MOV32ab
________________________________0010___000111001 MOV32db
________________________________0010___00_111001 MOV32rb
Decoding Conflict:
................0010...00.111010
________________0010___001111010 MOV32aq
________________0010___000111010 MOV32dq
________________0010___00_111010 MOV32rq
Decoding Conflict:
....1000........0010...00.111011
____1000________0010___001111011 MOV32ak
____1000________0010___000111011 MOV32dk
____1000________0010___00_111011 MOV32rk
Decoding Conflict:
................................0010...00.111100
________________________________0010___001111100 MOV32ai
________________________________0010___000111100 MOV32di
________________________________0010___00_111100 MOV32ri
Decoding Conflict:
0011...00.00....
0011___001001___ MOV16aa
0011___00100____ MOV16ar
0011___000000___ MOV16dd
0011___00_001___ MOV16ra
0011___00_00____ MOV16rr
Decoding Conflict:
0011...01000....
0011___010001___ MOV16ja
0011___010000___ MOV16jd
0011___01000____ MOV16jr
Decoding Conflict:
0011...01100....
0011___011001___ MOV16oa
0011___011000___ MOV16od
0011___01100____ MOV16or
Decoding Conflict:
0011...10000....
0011___100001___ MOV16ea
0011___100000___ MOV16ed
0011___10000____ MOV16er
Decoding Conflict:
................0011...10100....
________________0011___101001___ MOV16pa
________________0011___101000___ MOV16pd
________________0011___10100____ MOV16pr
Decoding Conflict:
....1000........0011...11000....
____1000________0011___110001___ MOV16fa
____1000________0011___110000___ MOV16fd
____1000________0011___11000____ MOV16fr
Decoding Conflict:
................................001100111100....
________________________________0011001111001___ MOV16ba
________________________________0011001111000___ MOV16bd
________________________________001100111100____ MOV16br
Decoding Conflict:
................001101011100....
________________0011010111001___ MOV16qa
________________0011010111000___ MOV16qd
________________001101011100____ MOV16qr
Decoding Conflict:
....1000........001101111100....
____1000________0011011111001___ MOV16ka
____1000________0011011111000___ MOV16kd
____1000________001101111100____ MOV16kr
Decoding Conflict:
0011...00.010...
0011___001010___ MOV16aj
0011___000010___ MOV16dj
0011___00_010___ MOV16rj
Decoding Conflict:
0011...00.011...
0011___001011___ MOV16ao
0011___000011___ MOV16do
0011___00_011___ MOV16ro
Decoding Conflict:
0011...00.100...
0011___001100___ MOV16ae
0011___000100___ MOV16de
0011___00_100___ MOV16re
Decoding Conflict:
................0011...00.101...
________________0011___001101___ MOV16ap
________________0011___000101___ MOV16dp
________________0011___00_101___ MOV16rp
Decoding Conflict:
....1000........0011...00.110...
____1000________0011___001110___ MOV16af
____1000________0011___000110___ MOV16df
____1000________0011___00_110___ MOV16rf
Decoding Conflict:
................................0011...00.111001
________________________________0011___001111001 MOV16ab
________________________________0011___000111001 MOV16db
________________________________0011___00_111001 MOV16rb
Decoding Conflict:
................0011...00.111010
________________0011___001111010 MOV16aq
________________0011___000111010 MOV16dq
________________0011___00_111010 MOV16rq
Decoding Conflict:
....1000........0011...00.111011
____1000________0011___001111011 MOV16ak
____1000________0011___000111011 MOV16dk
____1000________0011___00_111011 MOV16rk
Decoding Conflict:
................0011...00.111100
________________0011___001111100 MOV16ai
________________0011___000111100 MOV16di
________________0011___00_111100 MOV16ri
Decoding Conflict:
1000...00100....
1000___001000___ OR16dd
1000___00100____ OR16dr
Decoding Conflict:
1000...01000....
1000___010000___ OR32dd
1000___01000____ OR32dr
Decoding Conflict:
1001...00100....
1001___001000___ SUB16dd
1001___00100____ SUB16dr
Decoding Conflict:
1001...01000....
1001___010000___ SUB32dd
1001___01000____ SUB32dr
Decoding Conflict:
1100...00100....
1100___001000___ AND16dd
1100___00100____ AND16dr
Decoding Conflict:
1100...01000....
1100___010000___ AND32dd
1100___01000____ AND32dr
Decoding Conflict:
1101...00100....
1101___001000___ ADD16dd
1101___00100____ ADD16dr
Decoding Conflict:
1101...01000....
1101___010000___ ADD32dd
1101___01000____ ADD32dr
```
</details>
https://github.com/llvm/llvm-project/pull/156146
More information about the llvm-commits
mailing list