aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2016-04-29 16:43:29 +0200
committerUros Bizjak <uros@gcc.gnu.org>2016-04-29 16:43:29 +0200
commitfebaf72616a01e0bd74dc6c473912f6868118de7 (patch)
treef5f9351509e1f841f68535bbe134674b25eb9829
parentb891ade601b742d159a4a566e89321317bfe8975 (diff)
downloadgcc-febaf72616a01e0bd74dc6c473912f6868118de7.zip
gcc-febaf72616a01e0bd74dc6c473912f6868118de7.tar.gz
gcc-febaf72616a01e0bd74dc6c473912f6868118de7.tar.bz2
i386.md (unspec): Add UNSPEC_PROBE_STACK.
* config/i386/i386.md (unspec): Add UNSPEC_PROBE_STACK. (probe_stack): New expander. (probe_stack_<mode>): New insn pattern. From-SVN: r235642
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md25
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 86523e0..01f2580 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2016-04-29 Uros Bizjak <ubizjak@gmail.com>
+ * config/i386/i386.md (unspec): Add UNSPEC_PROBE_STACK.
+ (probe_stack): New expander.
+ (probe_stack_<mode>): New insn pattern.
+
+2016-04-29 Uros Bizjak <ubizjak@gmail.com>
+
* config/i386/i386.md
(operations with memory inputs setting flags peephole2):
Remove uneeded REG_P checks. Cleanup pattern generation.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 217551b..a0343d9 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_<mode>"
+ [(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{<imodesuffix>}\t{%1, %0|%0, %1}"
+ [(set_attr "type" "alu1")
+ (set_attr "mode" "<MODE>")
+ (set_attr "length_immediate" "1")])
+
(define_insn "adjust_stack_and_probe<mode>"
[(set (match_operand:P 0 "register_operand" "=r")
(unspec_volatile:P [(match_operand:P 1 "register_operand" "0")]