@@ -756,10 +756,11 @@ multiclass ArithBinOp_RF<bits<8> BaseOpc, bits<8> BaseOpc2, bits<8> BaseOpc4,
756756 def 32mr : BinOpMR_MF<BaseOpc, mnemonic, Xi32, opnode>, OpSize32;
757757 def 64mr : BinOpMR_MF<BaseOpc, mnemonic, Xi64, opnode>;
758758 let Predicates = [HasNDD, In64BitMode] in {
759- def 8mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi8 , opnode>;
760- def 16mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi16, opnode>, PD;
761- def 32mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi32, opnode>;
762- def 64mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi64, opnode>;
759+ defvar node = !if(!eq(CommutableRR, 0), opnode, null_frag);
760+ def 8mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi8 , node>;
761+ def 16mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi16, node>, PD;
762+ def 32mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi32, node>;
763+ def 64mr_ND : BinOpMR_RF<BaseOpc, mnemonic, Xi64, node>;
763764 def 8mr_NF_ND : BinOpMR_R<BaseOpc, mnemonic, Xi8>, EVEX_NF;
764765 def 16mr_NF_ND : BinOpMR_R<BaseOpc, mnemonic, Xi16>, EVEX_NF, PD;
765766 def 32mr_NF_ND : BinOpMR_R<BaseOpc, mnemonic, Xi32>, EVEX_NF;
@@ -944,10 +945,11 @@ multiclass ArithBinOp_RFF<bits<8> BaseOpc, bits<8> BaseOpc2, bits<8> BaseOpc4,
944945 def 32mr : BinOpMRF_MF<BaseOpc, mnemonic, Xi32, opnode>, OpSize32;
945946 def 64mr : BinOpMRF_MF<BaseOpc, mnemonic, Xi64, opnode>;
946947 let Predicates = [HasNDD, In64BitMode] in {
947- def 8mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi8 , opnode>;
948- def 16mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi16, opnode>, PD;
949- def 32mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi32, opnode>;
950- def 64mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi64, opnode>;
948+ defvar node = !if(!eq(CommutableRR, 0), opnode, null_frag);
949+ def 8mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi8 , node>;
950+ def 16mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi16, node>, PD;
951+ def 32mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi32, node>;
952+ def 64mr_ND : BinOpMRF_RF<BaseOpc, mnemonic, Xi64, node>;
951953 }
952954 let Predicates = [In64BitMode] in {
953955 def 8mr_EVEX : BinOpMRF_MF<BaseOpc, mnemonic, Xi8 , null_frag>, PL;
@@ -1108,14 +1110,26 @@ let isCompare = 1 in {
11081110
11091111// Patterns to recognize loads on the LHS of an ADC. We can't make X86adc_flag
11101112// commutable since it has EFLAGs as an input.
1111- def : Pat<(X86adc_flag (loadi8 addr:$src2), GR8:$src1, EFLAGS),
1112- (ADC8rm GR8:$src1, addr:$src2)>;
1113- def : Pat<(X86adc_flag (loadi16 addr:$src2), GR16:$src1, EFLAGS),
1114- (ADC16rm GR16:$src1, addr:$src2)>;
1115- def : Pat<(X86adc_flag (loadi32 addr:$src2), GR32:$src1, EFLAGS),
1116- (ADC32rm GR32:$src1, addr:$src2)>;
1117- def : Pat<(X86adc_flag (loadi64 addr:$src2), GR64:$src1, EFLAGS),
1118- (ADC64rm GR64:$src1, addr:$src2)>;
1113+ let Predicates = [NoNDD] in {
1114+ def : Pat<(X86adc_flag (loadi8 addr:$src2), GR8:$src1, EFLAGS),
1115+ (ADC8rm GR8:$src1, addr:$src2)>;
1116+ def : Pat<(X86adc_flag (loadi16 addr:$src2), GR16:$src1, EFLAGS),
1117+ (ADC16rm GR16:$src1, addr:$src2)>;
1118+ def : Pat<(X86adc_flag (loadi32 addr:$src2), GR32:$src1, EFLAGS),
1119+ (ADC32rm GR32:$src1, addr:$src2)>;
1120+ def : Pat<(X86adc_flag (loadi64 addr:$src2), GR64:$src1, EFLAGS),
1121+ (ADC64rm GR64:$src1, addr:$src2)>;
1122+ }
1123+ let Predicates = [HasNDD] in {
1124+ def : Pat<(X86adc_flag (loadi8 addr:$src2), GR8:$src1, EFLAGS),
1125+ (ADC8rm_ND GR8:$src1, addr:$src2)>;
1126+ def : Pat<(X86adc_flag (loadi16 addr:$src2), GR16:$src1, EFLAGS),
1127+ (ADC16rm_ND GR16:$src1, addr:$src2)>;
1128+ def : Pat<(X86adc_flag (loadi32 addr:$src2), GR32:$src1, EFLAGS),
1129+ (ADC32rm_ND GR32:$src1, addr:$src2)>;
1130+ def : Pat<(X86adc_flag (loadi64 addr:$src2), GR64:$src1, EFLAGS),
1131+ (ADC64rm_ND GR64:$src1, addr:$src2)>;
1132+ }
11191133
11201134// Patterns to recognize RMW ADC with loads in operand 1.
11211135def : Pat<(store (X86adc_flag GR8:$src, (loadi8 addr:$dst), EFLAGS),
0 commit comments