From febaf72616a01e0bd74dc6c473912f6868118de7 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 29 Apr 2016 16:43:29 +0200 Subject: [PATCH] i386.md (unspec): Add UNSPEC_PROBE_STACK. * config/i386/i386.md (unspec): Add UNSPEC_PROBE_STACK. (probe_stack): New expander. (probe_stack_): New insn pattern. From-SVN: r235642 --- gcc/ChangeLog | 6 ++++++ gcc/config/i386/i386.md | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 86523e00fea..01f2580cc77 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-04-29 Uros Bizjak + + * config/i386/i386.md (unspec): Add UNSPEC_PROBE_STACK. + (probe_stack): New expander. + (probe_stack_): New insn pattern. + 2016-04-29 Uros Bizjak * config/i386/i386.md diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 217551b1dc9..a0343d9d753 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -88,6 +88,7 @@ UNSPEC_SET_GOT_OFFSET UNSPEC_MEMORY_BLOCKAGE UNSPEC_STACK_CHECK + UNSPEC_PROBE_STACK ;; TLS support UNSPEC_TP @@ -17552,6 +17553,30 @@ DONE; }) +(define_expand "probe_stack" + [(match_operand 0 "memory_operand")] + "" +{ + rtx (*insn) (rtx, rtx) + = (GET_MODE (operands[0]) == DImode + ? gen_probe_stack_di : gen_probe_stack_si); + + emit_insn (insn (operands[0], const0_rtx)); + DONE; +}) + +;; Use OR for stack probes, this is shorter. +(define_insn "probe_stack_" + [(set (match_operand:W 0 "memory_operand" "=m") + (unspec:W [(match_operand:W 1 "const0_operand")] + UNSPEC_PROBE_STACK)) + (clobber (reg:CC FLAGS_REG))] + "" + "or{}\t{%1, %0|%0, %1}" + [(set_attr "type" "alu1") + (set_attr "mode" "") + (set_attr "length_immediate" "1")]) + (define_insn "adjust_stack_and_probe" [(set (match_operand:P 0 "register_operand" "=r") (unspec_volatile:P [(match_operand:P 1 "register_operand" "0")]