@@ -105,12 +105,28 @@ bool X86FrameLowering::hasFP(const MachineFunction &MF) const {
105105          (isWin64Prologue (MF) && MFI.hasCopyImplyingStackAdjustment ()));
106106}
107107
108- static  unsigned  getSUBriOpcode (bool  IsLP64) {
109-   return  IsLP64 ? X86::SUB64ri32 : X86::SUB32ri;
108+ static  unsigned  getSUBriOpcode (bool  IsLP64, int64_t  Imm) {
109+   if  (IsLP64) {
110+     if  (isInt<8 >(Imm))
111+       return  X86::SUB64ri8;
112+     return  X86::SUB64ri32;
113+   } else  {
114+     if  (isInt<8 >(Imm))
115+       return  X86::SUB32ri8;
116+     return  X86::SUB32ri;
117+   }
110118}
111119
112- static  unsigned  getADDriOpcode (bool  IsLP64) {
113-   return  IsLP64 ? X86::ADD64ri32 : X86::ADD32ri;
120+ static  unsigned  getADDriOpcode (bool  IsLP64, int64_t  Imm) {
121+   if  (IsLP64) {
122+     if  (isInt<8 >(Imm))
123+       return  X86::ADD64ri8;
124+     return  X86::ADD64ri32;
125+   } else  {
126+     if  (isInt<8 >(Imm))
127+       return  X86::ADD32ri8;
128+     return  X86::ADD32ri;
129+   }
114130}
115131
116132static  unsigned  getSUBrrOpcode (bool  IsLP64) {
@@ -122,7 +138,14 @@ static unsigned getADDrrOpcode(bool IsLP64) {
122138}
123139
124140static  unsigned  getANDriOpcode (bool  IsLP64, int64_t  Imm) {
125-   return  IsLP64 ? X86::AND64ri32 : X86::AND32ri;
141+   if  (IsLP64) {
142+     if  (isInt<8 >(Imm))
143+       return  X86::AND64ri8;
144+     return  X86::AND64ri32;
145+   }
146+   if  (isInt<8 >(Imm))
147+     return  X86::AND32ri8;
148+   return  X86::AND32ri;
126149}
127150
128151static  unsigned  getLEArOpcode (bool  IsLP64) {
@@ -340,8 +363,8 @@ MachineInstrBuilder X86FrameLowering::BuildStackAdjustment(
340363  } else  {
341364    bool  IsSub = Offset < 0 ;
342365    uint64_t  AbsOffset = IsSub ? -Offset : Offset;
343-     const  unsigned  Opc = IsSub ? getSUBriOpcode (Uses64BitFramePtr)
344-                                : getADDriOpcode (Uses64BitFramePtr);
366+     const  unsigned  Opc = IsSub ? getSUBriOpcode (Uses64BitFramePtr, AbsOffset )
367+                                : getADDriOpcode (Uses64BitFramePtr, AbsOffset );
345368    MI = BuildMI (MBB, MBBI, DL, TII.get (Opc), StackPtr)
346369             .addReg (StackPtr)
347370             .addImm (AbsOffset);
@@ -377,8 +400,9 @@ int X86FrameLowering::mergeSPUpdates(MachineBasicBlock &MBB,
377400  unsigned  Opc = PI->getOpcode ();
378401  int  Offset = 0 ;
379402
380-   if  ((Opc == X86::ADD64ri32 || Opc == X86::ADD32ri) &&
381-       PI->getOperand (0 ).getReg () == StackPtr) {
403+   if  ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
404+        Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
405+       PI->getOperand (0 ).getReg () == StackPtr){
382406    assert (PI->getOperand (1 ).getReg () == StackPtr);
383407    Offset = PI->getOperand (2 ).getImm ();
384408  } else  if  ((Opc == X86::LEA32r || Opc == X86::LEA64_32r) &&
@@ -389,7 +413,8 @@ int X86FrameLowering::mergeSPUpdates(MachineBasicBlock &MBB,
389413             PI->getOperand (5 ).getReg () == X86::NoRegister) {
390414    //  For LEAs we have: def = lea SP, FI, noreg, Offset, noreg.
391415    Offset = PI->getOperand (4 ).getImm ();
392-   } else  if  ((Opc == X86::SUB64ri32 || Opc == X86::SUB32ri) &&
416+   } else  if  ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
417+               Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
393418             PI->getOperand (0 ).getReg () == StackPtr) {
394419    assert (PI->getOperand (1 ).getReg () == StackPtr);
395420    Offset = -PI->getOperand (2 ).getImm ();
@@ -808,7 +833,7 @@ void X86FrameLowering::emitStackProbeInlineGenericLoop(
808833  //  save loop bound
809834  {
810835    const  unsigned  BoundOffset = alignDown (Offset, StackProbeSize);
811-     const  unsigned  SUBOpc = getSUBriOpcode (Uses64BitFramePtr);
836+     const  unsigned  SUBOpc = getSUBriOpcode (Uses64BitFramePtr, BoundOffset );
812837    BuildMI (MBB, MBBI, DL, TII.get (SUBOpc), FinalStackProbed)
813838        .addReg (FinalStackProbed)
814839        .addImm (BoundOffset)
@@ -1311,7 +1336,7 @@ void X86FrameLowering::BuildStackAlignAND(MachineBasicBlock &MBB,
13111336
13121337      {
13131338        const  unsigned  SUBOpc =
1314-             getSUBriOpcode (Uses64BitFramePtr);
1339+             getSUBriOpcode (Uses64BitFramePtr, StackProbeSize );
13151340        BuildMI (headMBB, DL, TII.get (SUBOpc), StackPtr)
13161341            .addReg (StackPtr)
13171342            .addImm (StackProbeSize)
@@ -1342,7 +1367,7 @@ void X86FrameLowering::BuildStackAlignAND(MachineBasicBlock &MBB,
13421367            .setMIFlag (MachineInstr::FrameSetup);
13431368
13441369        const  unsigned  SUBOpc =
1345-             getSUBriOpcode (Uses64BitFramePtr);
1370+             getSUBriOpcode (Uses64BitFramePtr, StackProbeSize );
13461371        BuildMI (bodyMBB, DL, TII.get (SUBOpc), StackPtr)
13471372            .addReg (StackPtr)
13481373            .addImm (StackProbeSize)
@@ -1775,7 +1800,7 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
17751800            .addImm (8 )
17761801            .addUse (X86::NoRegister)
17771802            .setMIFlag (MachineInstr::FrameSetup);
1778-         BuildMI (MBB, MBBI, DL, TII.get (X86::SUB64ri32 ), X86::RSP)
1803+         BuildMI (MBB, MBBI, DL, TII.get (X86::SUB64ri8 ), X86::RSP)
17791804            .addUse (X86::RSP)
17801805            .addImm (8 )
17811806            .setMIFlag (MachineInstr::FrameSetup);
@@ -2394,7 +2419,7 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
23942419      if  ((Opc != X86::POP32r || !PI->getFlag (MachineInstr::FrameDestroy)) &&
23952420          (Opc != X86::POP64r || !PI->getFlag (MachineInstr::FrameDestroy)) &&
23962421          (Opc != X86::BTR64ri8 || !PI->getFlag (MachineInstr::FrameDestroy)) &&
2397-           (Opc != X86::ADD64ri32  || !PI->getFlag (MachineInstr::FrameDestroy)))
2422+           (Opc != X86::ADD64ri8  || !PI->getFlag (MachineInstr::FrameDestroy)))
23982423        break ;
23992424      FirstCSPop = PI;
24002425    }
@@ -3768,7 +3793,7 @@ MachineBasicBlock::iterator X86FrameLowering::restoreWin32EHStackPointers(
37683793
37693794  if  (UsedReg == FramePtr) {
37703795    //  ADD $offset, %ebp
3771-     unsigned  ADDri = getADDriOpcode (false );
3796+     unsigned  ADDri = getADDriOpcode (false , EndOffset );
37723797    BuildMI (MBB, MBBI, DL, TII.get (ADDri), FramePtr)
37733798        .addReg (FramePtr)
37743799        .addImm (EndOffset)
0 commit comments