From 578b58f55e206934fd5df07a8840fb38652398b5 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sat, 14 Sep 1996 17:01:32 -0400 Subject: [PATCH] (clrstrsi): Correct check for constant size. (allocate_stack{,_worker}): New patterns. From-SVN: r12708 --- gcc/config/i386/i386.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 33c9ac691d9..a1480fbe604 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; +}") -- 2.30.2