Here’s a sampling.
These entries from X86InstrFoldTables.cpp have a different version in the generated table
{ X86::MMX_MOVD64from64rr, X86::MMX_MOVD64from64rm, TB_FOLDED_STORE | TB_NO_REVERSE },
{ X86::MMX_MOVD64grr, X86::MMX_MOVD64mr, TB_FOLDED_STORE | TB_NO_REVERSE }
{ X86::MOVPQIto64rr, X86::MOVPQI2QImr, TB_FOLDED_STORE | TB_NO_REVERSE }
{ X86::VMOVPQIto64Zrr, X86::VMOVPQI2QIZmr, TB_FOLDED_STORE | TB_NO_REVERSE },
{ X86::VMOVPQIto64rr, X86::VMOVPQI2QImr, TB_FOLDED_STORE | TB_NO_REVERSE },
{ X86::MMX_MOVD64to64rr, X86::MMX_MOVQ64rm, 0 },
{ X86::MOV64toPQIrr, X86::MOVQI2PQIrm, TB_NO_REVERSE }
These entries are missing from the generated table
{ X86::MOV64toSDrr, X86::MOV64mr, TB_FOLDED_STORE | TB_NO_REVERSE | 0 }
{ X86::MOVDI2SSrr, X86::MOV32mr, TB_FOLDED_STORE | TB_NO_REVERSE | 0 }
{ X86::MOVSDto64rr, X86::MOVSDmr, TB_FOLDED_STORE | TB_NO_REVERSE | 0 },
{ X86::MOVSS2DIrr, X86::MOVSSmr, TB_FOLDED_STORE | 0},
{ X86::TCRETURNri, X86::TCRETURNmi, TB_FOLDED_LOAD | TB_NO_FORWARD },
{ X86::TCRETURNri64, X86::TCRETURNmi64, TB_FOLDED_LOAD | TB_NO_FORWARD },
{ X86::VMOV64toSDZrr, X86::MOV64mr, TB_FOLDED_STORE | TB_NO_REVERSE },
{ X86::VMOV64toSDrr, X86::MOV64mr, TB_FOLDED_STORE | TB_NO_REVERSE }
{ X86::VMOVDI2SSZrr, X86::MOV32mr, TB_FOLDED_STORE | TB_NO_REVERSE },
{ X86::VMOVDI2SSrr, X86::MOV32mr, TB_FOLDED_STORE | TB_NO_REVERSE },
{ X86::MOV64toSDrr, X86::MOVSDrm_alt, TB_NO_REVERSE },
{ X86::MOVDI2SSrr, X86::MOVSSrm_alt, 0 },
{ X86::MOVSDrr, X86::MOVLPDrm, TB_NO_REVERSE },
This entry in the generated table is clearly wrong
{ X86::SENDUIPI, X86::VMXON, TB_FOLDED_LOAD | 0 },
I think these entries in the generated table might be wrong or at least the B case because the register spill size in 16-bits but the load is only 8-bits.
{ X86::KMOVBkk, X86::KMOVBkm, 0 },
{ X86::KMOVDkk, X86::KMOVDkm, 0 },
{ X86::KMOVQkk, X86::KMOVQkm, 0 },
{ X86::KMOVWkk, X86::KMOVWkm, 0 },
The VPEXPAND entries don’t have TB_NO_REVERSE in the generated table
{ X86::VPEXPANDBZ128rr, X86::VPEXPANDBZ128rm, TB_NO_REVERSE },
{ X86::VPEXPANDBZ256rr, X86::VPEXPANDBZ256rm, TB_NO_REVERSE },
{ X86::VPEXPANDBZrr, X86::VPEXPANDBZrm, TB_NO_REVERSE },
{ X86::VPEXPANDDZ128rr, X86::VPEXPANDDZ128rm, TB_NO_REVERSE },
{ X86::VPEXPANDDZ256rr, X86::VPEXPANDDZ256rm, TB_NO_REVERSE },
{ X86::VPEXPANDDZrr, X86::VPEXPANDDZrm, TB_NO_REVERSE },
{ X86::VPEXPANDQZ128rr, X86::VPEXPANDQZ128rm, TB_NO_REVERSE },
{ X86::VPEXPANDQZ256rr, X86::VPEXPANDQZ256rm, TB_NO_REVERSE },
{ X86::VPEXPANDQZrr, X86::VPEXPANDQZrm, TB_NO_REVERSE },
{ X86::VPEXPANDWZ128rr, X86::VPEXPANDWZ128rm, TB_NO_REVERSE },
{ X86::VPEXPANDWZ256rr, X86::VPEXPANDWZ256rm, TB_NO_REVERSE },
{ X86::VPEXPANDWZrr, X86::VPEXPANDWZrm, TB_NO_REVERSE },
INSERTPS is in the generated table, but not in X86InstrFoldTables.cpp and I think that’s intentional because the memory form doesn’t have the Count_S field.
{ X86::INSERTPSrr, X86::INSERTPSrm, TB_NO_REVERSE },
Masked instructions are generated without TB_NO_REVERSE. You can’t unfold a load from a masked instruction because the unfold will produce an unmasked load. The TB_NO_REVERSE prevents that.
I should also point out that autogenerating the table without also autogenerating the tests increases the test coverage hole we already have on theses tables.
~Craig