[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