[APX] Support Intel APX PUSH2POP2
This feature requires stack to be aligned at 16byte, therefore in prologue/epilogue, a standalone push/pop will be emitted before any push2/pop2 if the stack was not aligned to 16byte. Also for current implementation we only support push2/pop2 usage in function prologue/epilogue for those callee-saved registers. gcc/ChangeLog: * config/i386/i386.cc (gen_push2): New function to emit push2 and adjust cfa offset. (ix86_pro_and_epilogue_can_use_push2_pop2): New function to determine whether push2/pop2 can be used. (ix86_compute_frame_layout): Adjust preferred stack boundary and stack alignment needed for push2/pop2. (ix86_emit_save_regs): Emit push2 when available. (ix86_emit_restore_reg_using_pop2): New function to emit pop2 and adjust cfa info. (ix86_emit_restore_regs_using_pop2): New function to loop through the saved regs and call above. (ix86_expand_epilogue): Call ix86_emit_restore_regs_using_pop2 when push2pop2 available. * config/i386/i386.md (push2_di): New pattern for push2. (pop2_di): Likewise for pop2. gcc/testsuite/ChangeLog: * gcc.target/i386/apx-push2pop2-1.c: New test. * gcc.target/i386/apx-push2pop2_force_drap-1.c: Likewise. * gcc.target/i386/apx-push2pop2_interrupt-1.c: Likewise. Co-authored-by:Hu Lin1 <lin1.hu@intel.com> Co-authored-by:
Hongyu Wang <hongyu.wang@intel.com>
Showing
- gcc/config/i386/i386.cc 237 additions, 15 deletionsgcc/config/i386/i386.cc
- gcc/config/i386/i386.md 26 additions, 0 deletionsgcc/config/i386/i386.md
- gcc/testsuite/gcc.target/i386/apx-push2pop2-1.c 45 additions, 0 deletionsgcc/testsuite/gcc.target/i386/apx-push2pop2-1.c
- gcc/testsuite/gcc.target/i386/apx-push2pop2_force_drap-1.c 29 additions, 0 deletionsgcc/testsuite/gcc.target/i386/apx-push2pop2_force_drap-1.c
- gcc/testsuite/gcc.target/i386/apx-push2pop2_interrupt-1.c 28 additions, 0 deletionsgcc/testsuite/gcc.target/i386/apx-push2pop2_interrupt-1.c
Loading
Please register or sign in to comment