aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-09-14 17:01:32 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-09-14 17:01:32 -0400
commit578b58f55e206934fd5df07a8840fb38652398b5 (patch)
treec64a2b042cfb427594aff4f2ec3e1c73d39d4979 /gcc
parent22371ff356e90dd06b1bdbe097e246e3b63d7426 (diff)
downloadgcc-578b58f55e206934fd5df07a8840fb38652398b5.zip
gcc-578b58f55e206934fd5df07a8840fb38652398b5.tar.gz
gcc-578b58f55e206934fd5df07a8840fb38652398b5.tar.bz2
(clrstrsi): Correct check for constant size.
(allocate_stack{,_worker}): New patterns. From-SVN: r12708
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386.md30
1 files changed, 29 insertions, 1 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 33c9ac6..a1480fb 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -58,6 +58,8 @@
;; operand 0 is the argument for `sin'.
;; 2 This is a `cos' operation. The mode of the UNSPEC is MODE_FLOAT.
;; operand 0 is the argument for `cos'.
+;; 3 This is part of a `stack probe' operation. The mode of the UNSPEC is
+;; always SImode. operand 0 is the size of the stack allocation.
;; This shadows the processor_type enumeration, so changes must be made
;; to i386.h at the same time.
@@ -6183,7 +6185,7 @@
{
rtx addr0, addr1;
- if (GET_CODE (operands[2]) != CONST_INT)
+ if (GET_CODE (operands[1]) != CONST_INT)
FAIL;
addr0 = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
@@ -7048,3 +7050,29 @@
"(TARGET_USE_Q_REG && optimize > 1)"
"* return output_strlen_unroll (operands);"
)
+
+(define_insn "allocate_stack_worker"
+ [(unspec:SI [(match_operand:SI 0 "register_operand" "a")] 3)
+ (set (reg:SI 7) (minus:SI (reg:SI 7) (match_dup 0)))
+ (clobber (match_dup 0))]
+ "TARGET_STACK_PROBE"
+ "* return AS1(call,__alloca);")
+
+(define_expand "allocate_stack"
+ [(set (reg:SI 7)
+ (minus:SI (reg:SI 7) (match_operand:SI 0 "general_operand" "")))]
+ "TARGET_STACK_PROBE"
+ "
+{
+#ifdef CHECK_STACK_LIMIT
+ if (GET_CODE (operands[0]) == CONST_INT
+ && INTVAL (operands[0]) < CHECK_STACK_LIMIT)
+ emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx,
+ operands[0]));
+ else
+#endif
+ emit_insn (gen_allocate_stack_worker (copy_to_mode_reg (SImode,
+ operands[0])));
+
+ DONE;
+}")