@@ -1081,9 +1081,33 @@ bool X86InstructionSelector::selectUadde(MachineInstr &I,
10811081 Register CarryInReg = I.getOperand (4 ).getReg ();
10821082
10831083 const LLT DstTy = MRI.getType (DstReg);
1084+ assert (DstTy.isScalar () && " G_UADDE only supported for scalar types" );
10841085
1085- if (DstTy != LLT::scalar (32 ))
1086- return false ;
1086+ // TODO: Handle immediate argument variants?
1087+ unsigned OpADC, OpADD;
1088+ switch (DstTy.getSizeInBits ()) {
1089+ case 8 :
1090+ OpADC = X86::ADC8rr;
1091+ OpADD = X86::ADD8rr;
1092+ break ;
1093+ case 16 :
1094+ OpADC = X86::ADC16rr;
1095+ OpADD = X86::ADD16rr;
1096+ break ;
1097+ case 32 :
1098+ OpADC = X86::ADC32rr;
1099+ OpADD = X86::ADD32rr;
1100+ break ;
1101+ case 64 :
1102+ OpADC = X86::ADC64rr;
1103+ OpADD = X86::ADD64rr;
1104+ break ;
1105+ default :
1106+ llvm_unreachable (" Can't select G_UADDE, unsupported type." );
1107+ }
1108+
1109+ const RegisterBank &DstRB = *RBI.getRegBank (DstReg, MRI, TRI);
1110+ const TargetRegisterClass *DstRC = getRegClass (DstTy, DstRB);
10871111
10881112 // find CarryIn def instruction.
10891113 MachineInstr *Def = MRI.getVRegDef (CarryInReg);
@@ -1092,23 +1116,23 @@ bool X86InstructionSelector::selectUadde(MachineInstr &I,
10921116 Def = MRI.getVRegDef (CarryInReg);
10931117 }
10941118
1095- unsigned Opcode;
1119+ unsigned Opcode = 0 ;
10961120 if (Def->getOpcode () == TargetOpcode::G_UADDE) {
10971121 // carry set by prev ADD.
10981122
10991123 BuildMI (*I.getParent (), I, I.getDebugLoc (), TII.get (X86::COPY), X86::EFLAGS)
11001124 .addReg (CarryInReg);
11011125
1102- if (!RBI.constrainGenericRegister (CarryInReg, X86::GR32RegClass , MRI))
1126+ if (!RBI.constrainGenericRegister (CarryInReg, *DstRC , MRI))
11031127 return false ;
11041128
1105- Opcode = X86::ADC32rr ;
1129+ Opcode = OpADC ;
11061130 } else if (auto val = getIConstantVRegVal (CarryInReg, MRI)) {
11071131 // carry is constant, support only 0.
11081132 if (*val != 0 )
11091133 return false ;
11101134
1111- Opcode = X86::ADD32rr ;
1135+ Opcode = OpADD ;
11121136 } else
11131137 return false ;
11141138
@@ -1121,7 +1145,7 @@ bool X86InstructionSelector::selectUadde(MachineInstr &I,
11211145 .addReg (X86::EFLAGS);
11221146
11231147 if (!constrainSelectedInstRegOperands (AddInst, TII, TRI, RBI) ||
1124- !RBI.constrainGenericRegister (CarryOutReg, X86::GR32RegClass , MRI))
1148+ !RBI.constrainGenericRegister (CarryOutReg, *DstRC , MRI))
11251149 return false ;
11261150
11271151 I.eraseFromParent ();
0 commit comments