@@ -226,9 +226,8 @@ namespace {
226226 bool selectLEAAddr (SDValue N, SDValue &Base,
227227 SDValue &Scale, SDValue &Index, SDValue &Disp,
228228 SDValue &Segment);
229- bool selectLEA64_32Addr (SDValue N, SDValue &Base,
230- SDValue &Scale, SDValue &Index, SDValue &Disp,
231- SDValue &Segment);
229+ bool selectLEA64_Addr (SDValue N, SDValue &Base, SDValue &Scale,
230+ SDValue &Index, SDValue &Disp, SDValue &Segment);
232231 bool selectTLSADDRAddr (SDValue N, SDValue &Base,
233232 SDValue &Scale, SDValue &Index, SDValue &Disp,
234233 SDValue &Segment);
@@ -3058,36 +3057,46 @@ bool X86DAGToDAGISel::selectMOV64Imm32(SDValue N, SDValue &Imm) {
30583057 return !TM.isLargeGlobalValue (GV);
30593058}
30603059
3061- bool X86DAGToDAGISel::selectLEA64_32Addr (SDValue N, SDValue &Base,
3062- SDValue &Scale , SDValue &Index ,
3063- SDValue &Disp, SDValue &Segment) {
3060+ bool X86DAGToDAGISel::selectLEA64_Addr (SDValue N, SDValue &Base, SDValue &Scale ,
3061+ SDValue &Index , SDValue &Disp ,
3062+ SDValue &Segment) {
30643063 // Save the debug loc before calling selectLEAAddr, in case it invalidates N.
30653064 SDLoc DL (N);
30663065
30673066 if (!selectLEAAddr (N, Base, Scale, Index, Disp, Segment))
30683067 return false ;
30693068
3069+ EVT BaseType = Base.getValueType ();
3070+ unsigned SubReg;
3071+ if (BaseType == MVT::i8 )
3072+ SubReg = X86::sub_8bit;
3073+ else if (BaseType == MVT::i16 )
3074+ SubReg = X86::sub_16bit;
3075+ else
3076+ SubReg = X86::sub_32bit;
3077+
30703078 auto *RN = dyn_cast<RegisterSDNode>(Base);
30713079 if (RN && RN->getReg () == 0 )
30723080 Base = CurDAG->getRegister (0 , MVT::i64 );
3073- else if (Base.getValueType () == MVT::i32 && !isa<FrameIndexSDNode>(Base)) {
3081+ else if ((BaseType == MVT::i8 || BaseType == MVT::i16 ||
3082+ BaseType == MVT::i32 ) &&
3083+ !isa<FrameIndexSDNode>(Base)) {
30743084 // Base could already be %rip, particularly in the x32 ABI.
30753085 SDValue ImplDef = SDValue (CurDAG->getMachineNode (X86::IMPLICIT_DEF, DL,
30763086 MVT::i64 ), 0 );
3077- Base = CurDAG->getTargetInsertSubreg (X86::sub_32bit, DL, MVT::i64 , ImplDef,
3078- Base);
3087+ Base = CurDAG->getTargetInsertSubreg (SubReg, DL, MVT::i64 , ImplDef, Base);
30793088 }
30803089
3090+ EVT IndexType = Index.getValueType ();
30813091 RN = dyn_cast<RegisterSDNode>(Index);
30823092 if (RN && RN->getReg () == 0 )
30833093 Index = CurDAG->getRegister (0 , MVT::i64 );
30843094 else {
3085- assert (Index. getValueType () == MVT:: i32 &&
3086- " Expect to be extending 32-bit registers for use in LEA" );
3095+ assert ((IndexType == BaseType) &&
3096+ " Expect to be extending 8/16/ 32-bit registers for use in LEA" );
30873097 SDValue ImplDef = SDValue (CurDAG->getMachineNode (X86::IMPLICIT_DEF, DL,
30883098 MVT::i64 ), 0 );
3089- Index = CurDAG->getTargetInsertSubreg (X86::sub_32bit, DL, MVT::i64 , ImplDef,
3090- Index);
3099+ Index = CurDAG->getTargetInsertSubreg (SubReg, DL, MVT::i64 , ImplDef, Index);
30913100 }
30923101
30933102 return true ;
0 commit comments