@@ -226,11 +226,8 @@ namespace {
226226 bool selectLEAAddr (SDValue N, SDValue &Base,
227227 SDValue &Scale, SDValue &Index, SDValue &Disp,
228228 SDValue &Segment);
229- bool selectLEA64_16Addr (SDValue N, SDValue &Base, SDValue &Scale,
230- SDValue &Index, SDValue &Disp, SDValue &Segment);
231- bool selectLEA64_32Addr (SDValue N, SDValue &Base,
232- SDValue &Scale, SDValue &Index, SDValue &Disp,
233- SDValue &Segment);
229+ bool selectLEA64_Addr (SDValue N, SDValue &Base, SDValue &Scale,
230+ SDValue &Index, SDValue &Disp, SDValue &Segment);
234231 bool selectTLSADDRAddr (SDValue N, SDValue &Base,
235232 SDValue &Scale, SDValue &Index, SDValue &Disp,
236233 SDValue &Segment);
@@ -3056,71 +3053,38 @@ bool X86DAGToDAGISel::selectMOV64Imm32(SDValue N, SDValue &Imm) {
30563053 return !TM.isLargeGlobalValue (GV);
30573054}
30583055
3059- bool X86DAGToDAGISel::selectLEA64_16Addr (SDValue N, SDValue &Base,
3060- SDValue &Scale, SDValue &Index,
3061- SDValue &Disp, SDValue &Segment) {
3062- // Save the debug loc before calling selectLEAAddr, in case it invalidates N.
3063- SDLoc DL (N);
3064-
3065- if (!selectLEAAddr (N, Base, Scale, Index, Disp, Segment))
3066- return false ;
3067-
3068- auto *RN = dyn_cast<RegisterSDNode>(Base);
3069- if (RN && RN->getReg () == 0 )
3070- Base = CurDAG->getRegister (0 , MVT::i64 );
3071- else if (Base.getValueType () == MVT::i16 && !isa<FrameIndexSDNode>(Base)) {
3072- // Base could already be %rip, particularly in the x32 ABI.
3073- SDValue ImplDef =
3074- SDValue (CurDAG->getMachineNode (X86::IMPLICIT_DEF, DL, MVT::i64 ), 0 );
3075- Base = CurDAG->getTargetInsertSubreg (X86::sub_16bit, DL, MVT::i64 , ImplDef,
3076- Base);
3077- }
3078-
3079- RN = dyn_cast<RegisterSDNode>(Index);
3080- if (RN && RN->getReg () == 0 )
3081- Index = CurDAG->getRegister (0 , MVT::i64 );
3082- else {
3083- assert (Index.getValueType () == MVT::i16 &&
3084- " Expect to be extending 16-bit registers for use in LEA" );
3085- SDValue ImplDef =
3086- SDValue (CurDAG->getMachineNode (X86::IMPLICIT_DEF, DL, MVT::i64 ), 0 );
3087- Index = CurDAG->getTargetInsertSubreg (X86::sub_16bit, DL, MVT::i64 , ImplDef,
3088- Index);
3089- }
3090-
3091- return true ;
3092- }
3093-
3094- bool X86DAGToDAGISel::selectLEA64_32Addr (SDValue N, SDValue &Base,
3095- SDValue &Scale, SDValue &Index,
3096- SDValue &Disp, SDValue &Segment) {
3056+ bool X86DAGToDAGISel::selectLEA64_Addr (SDValue N, SDValue &Base, SDValue &Scale,
3057+ SDValue &Index, SDValue &Disp,
3058+ SDValue &Segment) {
30973059 // Save the debug loc before calling selectLEAAddr, in case it invalidates N.
30983060 SDLoc DL (N);
30993061
31003062 if (!selectLEAAddr (N, Base, Scale, Index, Disp, Segment))
31013063 return false ;
31023064
3065+ EVT BaseType = Base.getValueType ();
3066+ unsigned SubReg = (BaseType == MVT::i16 ) ? X86::sub_16bit : X86::sub_32bit;
31033067 auto *RN = dyn_cast<RegisterSDNode>(Base);
31043068 if (RN && RN->getReg () == 0 )
31053069 Base = CurDAG->getRegister (0 , MVT::i64 );
3106- else if (Base.getValueType () == MVT::i32 && !isa<FrameIndexSDNode>(Base)) {
3070+ else if ((BaseType == MVT::i16 || BaseType == MVT::i32 ) &&
3071+ !isa<FrameIndexSDNode>(Base)) {
31073072 // Base could already be %rip, particularly in the x32 ABI.
31083073 SDValue ImplDef = SDValue (CurDAG->getMachineNode (X86::IMPLICIT_DEF, DL,
31093074 MVT::i64 ), 0 );
3110- Base = CurDAG->getTargetInsertSubreg (X86::sub_32bit, DL, MVT::i64 , ImplDef,
3111- Base);
3075+ Base = CurDAG->getTargetInsertSubreg (SubReg, DL, MVT::i64 , ImplDef, Base);
31123076 }
31133077
3078+ EVT IndexType = Index.getValueType ();
31143079 RN = dyn_cast<RegisterSDNode>(Index);
31153080 if (RN && RN->getReg () == 0 )
31163081 Index = CurDAG->getRegister (0 , MVT::i64 );
31173082 else {
3118- assert (Index. getValueType () == MVT:: i32 &&
3119- " Expect to be extending 32-bit registers for use in LEA" );
3083+ assert ((IndexType == BaseType) &&
3084+ " Expect to be extending 16/ 32-bit registers for use in LEA" );
31203085 SDValue ImplDef = SDValue (CurDAG->getMachineNode (X86::IMPLICIT_DEF, DL,
31213086 MVT::i64 ), 0 );
3122- Index = CurDAG->getTargetInsertSubreg (X86::sub_32bit, DL, MVT::i64 , ImplDef,
3123- Index);
3087+ Index = CurDAG->getTargetInsertSubreg (SubReg, DL, MVT::i64 , ImplDef, Index);
31243088 }
31253089
31263090 return true ;
0 commit comments