On Tue, Nov 21, 2023 at 1:45 PM Hongyu Wang <wwwhhhyyy...@gmail.com> wrote:
>
> > I think you just need to add an extra (unspec [(const_int 0)]
> > UNSPEC_PPX) to origin push_di pattern, then no need for particular
> > handling of dwarf and cfa stuffs.
> > Ditto for popp and push2p and pop2p.
>
> Yes, such change also worked and no cfa adjustment required then,
> thanks for the suggestion.
> Updated patch with just 1 new UNSPEC and removed cfa handling.
LGTM.
>
> Hongtao Liu <crazy...@gmail.com> 于2023年11月20日周一 14:46写道:
> >
> > On Fri, Nov 17, 2023 at 3:26 PM Hongyu Wang <hongyu.w...@intel.com> wrote:
> > >
> > > Intel APX PPX feature has been released in [1].
> > >
> > > PPX stands for Push-Pop Acceleration. PUSH/PUSH2 and its corresponding POP
> > > can be marked with a 1-bit hint to indicate that the POP reads the
> > > value written by the PUSH from the stack. The processor tracks these 
> > > marked
> > > instructions internally and fast-forwards register data between
> > > matching PUSH and POP instructions, without going through memory or
> > > through the training loop of the Fast Store Forwarding Predictor (FSFP).
> > > This feature can also be adopted to PUSH2/POP2.
> > >
> > > For GCC, we emit explicit suffix 'p' (paired) to indicate the push/pop
> > > pair are marked with PPX hint. To separate form original push/pop, we
> > > use UNSPEC to restrict the PPX related patterns. So for pushp/popp, the
> > > cfi is manually adjusted for the UNSPEC PPX insns.
> > >
> > > In the first implementation we only emit them under prologue/epilogue
> > > when saving/restoring callee-saved registers to make sure push/pop are
> > > paired. So an extra flag was added to check if PPX insns can be emitted
> > > for those register save/restore interfaces.
> > >
> > > The PPX hint is purely a performance hint. If the 'p' suffix is not
> > > emitted for paired push/pop, the PPX optimization will be disabled,
> > > while program sematic will not be affected at all.
> > >
> > > Bootstrapped/regtest on x86-64-pc-linux-gnu{-m32,}.
> > >
> > > Ok for master?
> > >
> > > [1].https://www.intel.com/content/www/us/en/developer/articles/technical/advanced-performance-extensions-apx.ht
> > >
> > > gcc/ChangeLog:
> > >
> > >         * config/i386/i386-opts.h (enum apx_features): Add apx_ppx, add
> > >         it to apx_all.
> > >         * config/i386/i386.cc (ix86_emit_restore_reg_using_pop): Add
> > >         ppx_p parameter for function declaration.
> > >         (gen_push2): Add ppx_p parameter, emit push2p if ppx_p is true.
> > >         (ix86_emit_restore_reg_using_pop2): Likewise for pop2p.
> > >         (gen_pushp): New function to emit pushp and adjust cfi.
> > >         (ix86_emit_save_regs): Emit pushp/push2p under TARGET_APX_PPX.
> > >         (ix86_emit_restore_reg_using_pop): Add ppx_p, emit popp insn
> > >         and adjust cfi when ppx_p is ture.
> > >         (ix86_emit_restore_reg_using_pop2): Add ppx_p and parse to its
> > >         callee.
> > >         (ix86_emit_restore_regs_using_pop2): Likewise.
> > >         (ix86_expand_epilogue): Parse TARGET_APX_PPX to
> > >         ix86_emit_restore_reg_using_pop.
> > >         * config/i386/i386.h (TARGET_APX_PPX): New.
> > >         * config/i386/i386.md (UNSPEC_APXPUSHP): New unspec.
> > >         (UNSPEC_APXPOPP): Likewise.
> > >         (UNSPEC_APXPUSH2P): Likewise.
> > >         (UNSPEC_APXPOP2P_LOW): Likewise.
> > >         (UNSPEC_APXPOP2P_HIGH): Likewise.
> > >         (pushp_di): New define_insn.
> > >         (popp_di): Likewise.
> > >         (push2p_di): Likewise.
> > >         (pop2p_di): Likewise.
> > >         * config/i386/i386.opt: Add apx_ppx enum.
> > >
> > > gcc/testsuite/ChangeLog:
> > >
> > >         * gcc.target/i386/apx-interrupt-1.c: Adjust option to restrict 
> > > them
> > >         under certain subfeatures.
> > >         * gcc.target/i386/apx-push2pop2-1.c: Likewise.
> > >         * gcc.target/i386/apx-push2pop2_force_drap-1.c: Likewise.
> > >         * gcc.target/i386/apx-push2pop2_interrupt-1.c: Likewise.
> > >         * gcc.target/i386/apx-ppx-1.c: New test.
> > > ---
> > >  gcc/config/i386/i386-opts.h                   |   3 +-
> > >  gcc/config/i386/i386.cc                       | 113 ++++++++++++++----
> > >  gcc/config/i386/i386.h                        |   1 +
> > >  gcc/config/i386/i386.md                       |  47 +++++++-
> > >  gcc/config/i386/i386.opt                      |   3 +
> > >  .../gcc.target/i386/apx-interrupt-1.c         |   2 +-
> > >  gcc/testsuite/gcc.target/i386/apx-ppx-1.c     |   9 ++
> > >  .../gcc.target/i386/apx-push2pop2-1.c         |   2 +-
> > >  .../i386/apx-push2pop2_force_drap-1.c         |   2 +-
> > >  .../i386/apx-push2pop2_interrupt-1.c          |   2 +-
> > >  10 files changed, 158 insertions(+), 26 deletions(-)
> > >  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ppx-1.c
> > >
> > > diff --git a/gcc/config/i386/i386-opts.h b/gcc/config/i386/i386-opts.h
> > > index 2ec76a16bce..4d293edb399 100644
> > > --- a/gcc/config/i386/i386-opts.h
> > > +++ b/gcc/config/i386/i386-opts.h
> > > @@ -139,7 +139,8 @@ enum apx_features {
> > >    apx_egpr = 1 << 0,
> > >    apx_push2pop2 = 1 << 1,
> > >    apx_ndd = 1 << 2,
> > > -  apx_all = apx_egpr | apx_push2pop2 | apx_ndd,
> > > +  apx_ppx = 1 << 3,
> > > +  apx_all = apx_egpr | apx_push2pop2 | apx_ndd | apx_ppx,
> > >  };
> > >
> > >  #endif
> > > diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> > > index 683ac643bc8..df2fc236c0a 100644
> > > --- a/gcc/config/i386/i386.cc
> > > +++ b/gcc/config/i386/i386.cc
> > > @@ -105,7 +105,7 @@ along with GCC; see the file COPYING3.  If not see
> > >  static rtx legitimize_dllimport_symbol (rtx, bool);
> > >  static rtx legitimize_pe_coff_extern_decl (rtx, bool);
> > >  static void ix86_print_operand_address_as (FILE *, rtx, addr_space_t, 
> > > bool);
> > > -static void ix86_emit_restore_reg_using_pop (rtx);
> > > +static void ix86_emit_restore_reg_using_pop (rtx, bool = false);
> > >
> > >
> > >  #ifndef CHECK_STACK_LIMIT
> > > @@ -6512,7 +6512,7 @@ gen_popfl (void)
> > >
> > >  /* Generate a "push2" pattern for input ARG.  */
> > >  rtx
> > > -gen_push2 (rtx mem, rtx reg1, rtx reg2)
> > > +gen_push2 (rtx mem, rtx reg1, rtx reg2, bool ppx_p = false)
> > >  {
> > >    struct machine_function *m = cfun->machine;
> > >    const int offset = UNITS_PER_WORD * 2;
> > > @@ -6527,9 +6527,49 @@ gen_push2 (rtx mem, rtx reg1, rtx reg2)
> > >    if (REG_P (reg2) && GET_MODE (reg2) != word_mode)
> > >      reg2 = gen_rtx_REG (word_mode, REGNO (reg2));
> > >
> > > -  return gen_push2_di (mem, reg1, reg2);
> > > +  return ppx_p ? gen_push2p_di (mem, reg1, reg2):
> > > +                gen_push2_di (mem, reg1, reg2);
> > >  }
> > >
> > > +/* Generate a "pushp" insn for input ARG, and set reg notes.  */
> > > +rtx_insn *
> > > +gen_pushp (rtx arg)
> > > +{
> > Can we just overload gen_push with an new arg bool ppx just like we
> > did for push2/pop2.
> > > +  struct machine_function *m = cfun->machine;
> > > +
> > > +  if (m->fs.cfa_reg == stack_pointer_rtx)
> > > +    m->fs.cfa_offset += UNITS_PER_WORD;
> > > +  m->fs.sp_offset += UNITS_PER_WORD;
> > > +
> > > +  if (REG_P (arg) && GET_MODE (arg) != word_mode)
> > > +    arg = gen_rtx_REG (word_mode, REGNO (arg));
> > > +
> > > +  rtx pat = gen_rtx_MEM (word_mode,
> > > +                                  gen_rtx_PRE_DEC (Pmode,
> > > +                                                   stack_pointer_rtx));
> > > +  rtx_insn *insn = emit_insn (gen_pushp_di (pat, arg));
> > > +
> > Why do we need ..
> > > +  rtx dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2));
> > > +
> > > +  rtx dwarf_reg = gen_rtx_REG (word_mode,
> > > +                              REGNO (arg));
> > > +  rtx tmp = gen_rtx_SET (gen_frame_mem (DImode,
> > > +                                       stack_pointer_rtx),
> > > +                        dwarf_reg);
> > > +  RTX_FRAME_RELATED_P (tmp) = 1;
> > > +  XVECEXP (dwarf, 0, 1) = tmp;
> > > +  rtx sp_tmp = gen_rtx_SET (stack_pointer_rtx,
> > > +                           plus_constant (Pmode,
> > > +                                          stack_pointer_rtx,
> > > +                                          -UNITS_PER_WORD));
> > > +  RTX_FRAME_RELATED_P (sp_tmp) = 1;
> > > +  XVECEXP (dwarf, 0, 0) = sp_tmp;
> > > +  add_reg_note (insn, REG_FRAME_RELATED_EXPR, dwarf);
> > this. I assume pushp should be different from push only by ppx hint, not 
> > dwarf.
> > > +
> > > +  return insn;
> > > +}
> > > +
> > > +
> > >  /* Return >= 0 if there is an unused call-clobbered register available
> > >     for the entire function.  */
> > >
> > > @@ -7369,7 +7409,10 @@ ix86_emit_save_regs (void)
> > >        for (regno = FIRST_PSEUDO_REGISTER - 1; regno >= 0; regno--)
> > >         if (GENERAL_REGNO_P (regno) && ix86_save_reg (regno, true, true))
> > >           {
> > > -           insn = emit_insn (gen_push (gen_rtx_REG (word_mode, regno)));
> > > +           if (TARGET_APX_PPX)
> > > +             insn = gen_pushp (gen_rtx_REG (word_mode, regno));
> > > +           else
> > > +             insn = emit_insn (gen_push (gen_rtx_REG (word_mode, 
> > > regno)));
> > >             RTX_FRAME_RELATED_P (insn) = 1;
> > >           }
> > >      }
> > > @@ -7399,7 +7442,8 @@ ix86_emit_save_regs (void)
> > >                                                  gen_rtx_REG (word_mode,
> > >                                                               
> > > regno_list[0]),
> > >                                                  gen_rtx_REG (word_mode,
> > > -                                                             
> > > regno_list[1])));
> > > +                                                             
> > > regno_list[1]),
> > > +                                                TARGET_APX_PPX));
> > >                     RTX_FRAME_RELATED_P (insn) = 1;
> > >                     rtx dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc 
> > > (3));
> > >
> > > @@ -7431,15 +7475,21 @@ ix86_emit_save_regs (void)
> > >               }
> > >             else
> > >               {
> > > -               insn = emit_insn (gen_push (gen_rtx_REG (word_mode, 
> > > regno)));
> > > +               if (TARGET_APX_PPX)
> > > +                 insn = gen_pushp (gen_rtx_REG (word_mode, regno));
> > > +               else
> > > +                 insn = emit_insn (gen_push (gen_rtx_REG (word_mode, 
> > > regno)));
> > >                 RTX_FRAME_RELATED_P (insn) = 1;
> > >                 aligned = true;
> > >               }
> > >           }
> > >        if (loaded_regnum == 1)
> > >         {
> > > -         insn = emit_insn (gen_push (gen_rtx_REG (word_mode,
> > > -                                                  regno_list[0])));
> > > +         if (TARGET_APX_PPX)
> > > +           insn = gen_pushp (gen_rtx_REG (word_mode, regno_list[0]));
> > > +         else
> > > +           insn = emit_insn (gen_push (gen_rtx_REG (word_mode,
> > > +                                                    regno_list[0])));
> > >           RTX_FRAME_RELATED_P (insn) = 1;
> > >         }
> > >      }
> > > @@ -9268,15 +9318,30 @@ ix86_expand_prologue (void)
> > >      emit_insn (gen_prologue_use (stack_pointer_rtx));
> > >  }
> > >
> > > -/* Emit code to restore REG using a POP insn.  */
> > > +/* Emit code to restore REG using a POP or POPP insn.  */
> > >
> > >  static void
> > > -ix86_emit_restore_reg_using_pop (rtx reg)
> > > +ix86_emit_restore_reg_using_pop (rtx reg, bool ppx_p)
> > >  {
> > >    struct machine_function *m = cfun->machine;
> > > -  rtx_insn *insn = emit_insn (gen_pop (reg));
> > > +  rtx_insn *insn;
> > >
> > > -  ix86_add_cfa_restore_note (insn, reg, m->fs.sp_offset);
> > > +  if (ppx_p)
> > > +    {
> > > +      rtx stack = gen_rtx_MEM (word_mode,
> > > +                              gen_rtx_POST_INC (Pmode,
> > > +                                                stack_pointer_rtx));
> > > +      insn = emit_insn (gen_popp_di (reg, stack));
> > Diddo for ..
> > > +      RTX_FRAME_RELATED_P (insn) = 1;
> > > +      rtx dwarf = NULL_RTX;
> > > +      dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
> > > +      REG_NOTES (insn) = dwarf;
> > .. this, why it's different from pop regarding cfa?
> > > +    }
> > > +  else
> > > +    {
> > > +      insn = emit_insn (gen_pop (reg));
> > > +      ix86_add_cfa_restore_note (insn, reg, m->fs.sp_offset);
> > > +    }
> > >    m->fs.sp_offset -= UNITS_PER_WORD;
> > >
> > >    if (m->fs.cfa_reg == crtl->drap_reg
> > > @@ -9328,14 +9393,19 @@ ix86_emit_restore_reg_using_pop (rtx reg)
> > >
> > >  /* Emit code to restore REG using a POP2 insn.  */
> > >  static void
> > > -ix86_emit_restore_reg_using_pop2 (rtx reg1, rtx reg2)
> > > +ix86_emit_restore_reg_using_pop2 (rtx reg1, rtx reg2, bool ppx_p = false)
> > >  {
> > >    struct machine_function *m = cfun->machine;
> > >    const int offset = UNITS_PER_WORD * 2;
> > > +  rtx_insn *insn;
> > >
> > >    rtx mem = gen_rtx_MEM (TImode, gen_rtx_POST_INC (Pmode,
> > >                                                    stack_pointer_rtx));
> > > -  rtx_insn *insn = emit_insn (gen_pop2_di (reg1, mem, reg2));
> > > +
> > > +  if (ppx_p)
> > > +    insn = emit_insn (gen_pop2p_di (reg1, mem, reg2));
> > > +  else
> > > +    insn = emit_insn (gen_pop2_di (reg1, mem, reg2));
> > >
> > >    RTX_FRAME_RELATED_P (insn) = 1;
> > >
> > > @@ -9397,13 +9467,13 @@ ix86_emit_restore_reg_using_pop2 (rtx reg1, rtx 
> > > reg2)
> > >  /* Emit code to restore saved registers using POP insns.  */
> > >
> > >  static void
> > > -ix86_emit_restore_regs_using_pop (void)
> > > +ix86_emit_restore_regs_using_pop (bool ppx_p)
> > >  {
> > >    unsigned int regno;
> > >
> > >    for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> > >      if (GENERAL_REGNO_P (regno) && ix86_save_reg (regno, false, true))
> > > -      ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, regno));
> > > +      ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, regno), 
> > > ppx_p);
> > >  }
> > >
> > >  /* Emit code to restore saved registers using POP2 insns.  */
> > > @@ -9432,20 +9502,23 @@ ix86_emit_restore_regs_using_pop2 (void)
> > >                 ix86_emit_restore_reg_using_pop2 (gen_rtx_REG (word_mode,
> > >                                                                
> > > regno_list[0]),
> > >                                                   gen_rtx_REG (word_mode,
> > > -                                                              
> > > regno_list[1]));
> > > +                                                              
> > > regno_list[1]),
> > > +                                                 TARGET_APX_PPX);
> > >                 loaded_regnum = 0;
> > >                 regno_list[0] = regno_list[1] = -1;
> > >               }
> > >           }
> > >         else
> > >           {
> > > -           ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, 
> > > regno));
> > > +           ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, 
> > > regno),
> > > +                                            TARGET_APX_PPX);
> > >             aligned = true;
> > >           }
> > >        }
> > >
> > >    if (loaded_regnum == 1)
> > > -    ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, 
> > > regno_list[0]));
> > > +    ix86_emit_restore_reg_using_pop (gen_rtx_REG (word_mode, 
> > > regno_list[0]),
> > > +                                    TARGET_APX_PPX);
> > >  }
> > >
> > >  /* Emit code and notes for the LEAVE instruction.  If insn is non-null,
> > > @@ -9990,7 +10063,7 @@ ix86_expand_epilogue (int style)
> > >        if (TARGET_APX_PUSH2POP2 && m->func_type == TYPE_NORMAL)
> > >         ix86_emit_restore_regs_using_pop2 ();
> > >        else
> > > -       ix86_emit_restore_regs_using_pop ();
> > > +       ix86_emit_restore_regs_using_pop (TARGET_APX_PPX);
> > >      }
> > >
> > >    /* If we used a stack pointer and haven't already got rid of it,
> > > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> > > index 037074758ea..227217a8712 100644
> > > --- a/gcc/config/i386/i386.h
> > > +++ b/gcc/config/i386/i386.h
> > > @@ -54,6 +54,7 @@ see the files COPYING3 and COPYING.RUNTIME 
> > > respectively.  If not, see
> > >  #define TARGET_APX_EGPR (ix86_apx_features & apx_egpr)
> > >  #define TARGET_APX_PUSH2POP2 (ix86_apx_features & apx_push2pop2)
> > >  #define TARGET_APX_NDD (ix86_apx_features & apx_ndd)
> > > +#define TARGET_APX_PPX (ix86_apx_features & apx_ppx)
> > >
> > >  #include "config/vxworks-dummy.h"
> > >
> > > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> > > index 1b5a794b9e5..8cce4c11e35 100644
> > > --- a/gcc/config/i386/i386.md
> > > +++ b/gcc/config/i386/i386.md
> > > @@ -210,10 +210,17 @@ (define_c_enum "unspec" [
> > >    ;; For insn_callee_abi:
> > >    UNSPEC_CALLEE_ABI
> > >
> > > -  ;; For PUSH2/POP2 support
> > > +  ;; For APX PUSH2/POP2 support
> > >    UNSPEC_APXPUSH2
> > >    UNSPEC_APXPOP2_LOW
> > >    UNSPEC_APXPOP2_HIGH
> > > +
> > > +  ;; For APX PPX support
> > > +  UNSPEC_APXPUSHP
> > > +  UNSPEC_APXPOPP
> > > +  UNSPEC_APXPUSH2P
> > > +  UNSPEC_APXPOP2P_LOW
> > > +  UNSPEC_APXPOP2P_HIGH
> > >  ])
> > >
> > >  (define_c_enum "unspecv" [
> > > @@ -3785,6 +3792,44 @@ (define_insn "pop2_di"
> > >    [(set_attr "mode" "TI")
> > >     (set_attr "prefix" "evex")])
> > >
> > > +(define_insn "pushp_di"
> > > +  [(set (match_operand:DI 0 "push_operand" "=<")
> > > +       (unspec: DI [(match_operand:DI 1 "register_operand" "r")]
> > > +                    UNSPEC_APXPUSHP))]
> > > +  "TARGET_64BIT"
> > > +  "pushp\t%1"
> > > +  [(set_attr "mode" "DI")])
> > I think you just need to add an extra (unspec [(const_int 0)]
> > UNSPEC_PPX) to origin push_di pattern, then no need for particular
> > handling of dwarf and cfa stuffs.
> > Ditto for popp and push2p and pop2p.
> > > +
> > > +(define_insn "popp_di"
> > > +  [(set (match_operand:DI 0 "nonimmediate_operand" "=r")
> > > +       (unspec:DI [(match_operand:DI 1 "pop_operand" ">")]
> > > +                  UNSPEC_APXPOPP))]
> > > +  "TARGET_APX_PPX"
> > > +  "popp\t%0"
> > > +  [(set_attr "mode" "DI")])
> > > +
> > > +(define_insn "push2p_di"
> > > +  [(set (match_operand:TI 0 "push_operand" "=<")
> > > +       (unspec:TI [(match_operand:DI 1 "register_operand" "r")
> > > +                   (match_operand:DI 2 "register_operand" "r")]
> > > +                   UNSPEC_APXPUSH2P))]
> > > +  "TARGET_APX_PUSH2POP2 && TARGET_APX_PPX"
> > > +  "push2p\t%1, %2"
> > > +  [(set_attr "mode" "TI")
> > > +   (set_attr "type" "multi")
> > > +   (set_attr "prefix" "evex")])
> > > +
> > > +(define_insn "pop2p_di"
> > > +  [(parallel [(set (match_operand:DI 0 "register_operand" "=r")
> > > +                  (unspec:DI [(match_operand:TI 1 "pop_operand" ">")]
> > > +                             UNSPEC_APXPOP2P_LOW))
> > > +             (set (match_operand:DI 2 "register_operand" "=r")
> > > +                  (unspec:DI [(const_int 0)] UNSPEC_APXPOP2P_HIGH))])]
> > > +  "TARGET_APX_PUSH2POP2 && TARGET_APX_PPX"
> > > +  "pop2p\t%0, %2"
> > > +  [(set_attr "mode" "TI")
> > > +   (set_attr "prefix" "evex")])
> > > +
> > >  (define_insn "*pushsf_rex64"
> > >    [(set (match_operand:SF 0 "push_operand" "=X,X,X")
> > >         (match_operand:SF 1 "nonmemory_no_elim_operand" "f,rF,v"))]
> > > diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> > > index 0c3b8f4b621..ee8898e3abb 100644
> > > --- a/gcc/config/i386/i386.opt
> > > +++ b/gcc/config/i386/i386.opt
> > > @@ -1333,6 +1333,9 @@ Enum(apx_features) String(push2pop2) 
> > > Value(apx_push2pop2) Set(3)
> > >  EnumValue
> > >  Enum(apx_features) String(ndd) Value(apx_ndd) Set(4)
> > >
> > > +EnumValue
> > > +Enum(apx_features) String(ppx) Value(apx_ppx) Set(5)
> > > +
> > >  EnumValue
> > >  Enum(apx_features) String(all) Value(apx_all) Set(1)
> > >
> > > diff --git a/gcc/testsuite/gcc.target/i386/apx-interrupt-1.c 
> > > b/gcc/testsuite/gcc.target/i386/apx-interrupt-1.c
> > > index 5f732d3e316..ffcb8fce71c 100644
> > > --- a/gcc/testsuite/gcc.target/i386/apx-interrupt-1.c
> > > +++ b/gcc/testsuite/gcc.target/i386/apx-interrupt-1.c
> > > @@ -1,5 +1,5 @@
> > >  /* { dg-do compile { target { ! ia32 } } } */
> > > -/* { dg-options "-mapxf -m64 -O2 -mgeneral-regs-only -mno-cld 
> > > -mno-push-args -maccumulate-outgoing-args" } */
> > > +/* { dg-options "-mapx-features=egpr -m64 -O2 -mgeneral-regs-only 
> > > -mno-cld -mno-push-args -maccumulate-outgoing-args" } */
> > >  /* { dg-skip-if "does not emit .cfi_xxx" "*-*-darwin*" } */
> > >
> > >  extern void foo (void *) __attribute__ ((interrupt));
> > > diff --git a/gcc/testsuite/gcc.target/i386/apx-ppx-1.c 
> > > b/gcc/testsuite/gcc.target/i386/apx-ppx-1.c
> > > new file mode 100644
> > > index 00000000000..e9a595381e3
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/i386/apx-ppx-1.c
> > > @@ -0,0 +1,9 @@
> > > +/* { dg-do compile { target { ! ia32 } } } */
> > > +/* { dg-options "-O2 -mapx-features=egpr,push2pop2,ppx" } */
> > > +
> > > +#include "apx-push2pop2-1.c"
> > > +
> > > +/* { dg-final { scan-assembler "pushp" } } */
> > > +/* { dg-final { scan-assembler "popp" } } */
> > > +/* { dg-final { scan-assembler "push2p" } } */
> > > +/* { dg-final { scan-assembler "pop2p" } } */
> > > diff --git a/gcc/testsuite/gcc.target/i386/apx-push2pop2-1.c 
> > > b/gcc/testsuite/gcc.target/i386/apx-push2pop2-1.c
> > > index 089941d3726..c53112758a5 100644
> > > --- a/gcc/testsuite/gcc.target/i386/apx-push2pop2-1.c
> > > +++ b/gcc/testsuite/gcc.target/i386/apx-push2pop2-1.c
> > > @@ -1,5 +1,5 @@
> > >  /* { dg-do compile { target { ! ia32 } } } */
> > > -/* { dg-options "-O2 -mapxf" } */
> > > +/* { dg-options "-O2 -mapx-features=push2pop2" } */
> > >  /* { dg-skip-if "does not emit .cfi_xxx" "*-*-darwin*" } */
> > >
> > >  extern int bar (int);
> > > diff --git a/gcc/testsuite/gcc.target/i386/apx-push2pop2_force_drap-1.c 
> > > b/gcc/testsuite/gcc.target/i386/apx-push2pop2_force_drap-1.c
> > > index 656ca91391a..022113bb1e2 100644
> > > --- a/gcc/testsuite/gcc.target/i386/apx-push2pop2_force_drap-1.c
> > > +++ b/gcc/testsuite/gcc.target/i386/apx-push2pop2_force_drap-1.c
> > > @@ -1,5 +1,5 @@
> > >  /* { dg-do compile { target { ! ia32 } } } */
> > > -/* { dg-options "-O2 -mapxf -mforce-drap" } */
> > > +/* { dg-options "-O2 -mapx-features=push2pop2 -mforce-drap" } */
> > >  /* { dg-skip-if "does not emit .cfi_xxx" "*-*-darwin*" } */
> > >
> > >  #include "apx-push2pop2-1.c"
> > > diff --git a/gcc/testsuite/gcc.target/i386/apx-push2pop2_interrupt-1.c 
> > > b/gcc/testsuite/gcc.target/i386/apx-push2pop2_interrupt-1.c
> > > index 747f7aaf191..a5b46893208 100644
> > > --- a/gcc/testsuite/gcc.target/i386/apx-push2pop2_interrupt-1.c
> > > +++ b/gcc/testsuite/gcc.target/i386/apx-push2pop2_interrupt-1.c
> > > @@ -1,5 +1,5 @@
> > >  /* { dg-do compile { target { ! ia32 } } } */
> > > -/* { dg-options "-O2 -mapxf -mgeneral-regs-only -mno-cld -mno-push-args 
> > > -maccumulate-outgoing-args" } */
> > > +/* { dg-options "-O2 -mapx-features=egpr,push2pop2 -mgeneral-regs-only 
> > > -mno-cld -mno-push-args -maccumulate-outgoing-args" } */
> > >
> > >  extern void foo (void *) __attribute__ ((interrupt));
> > >
> > > --
> > > 2.31.1
> > >
> >
> >
> > --
> > BR,
> > Hongtao



-- 
BR,
Hongtao

Reply via email to