+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
UNSPEC_SET_GOT_OFFSET
UNSPEC_MEMORY_BLOCKAGE
UNSPEC_STACK_CHECK
+ UNSPEC_PROBE_STACK
;; TLS support
UNSPEC_TP
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")]