diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1996-09-14 17:01:32 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1996-09-14 17:01:32 -0400 |
commit | 578b58f55e206934fd5df07a8840fb38652398b5 (patch) | |
tree | c64a2b042cfb427594aff4f2ec3e1c73d39d4979 | |
parent | 22371ff356e90dd06b1bdbe097e246e3b63d7426 (diff) | |
download | gcc-578b58f55e206934fd5df07a8840fb38652398b5.zip gcc-578b58f55e206934fd5df07a8840fb38652398b5.tar.gz gcc-578b58f55e206934fd5df07a8840fb38652398b5.tar.bz2 |
(clrstrsi): Correct check for constant size.
(allocate_stack{,_worker}): New patterns.
From-SVN: r12708
-rw-r--r-- | gcc/config/i386/i386.md | 30 |
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; +}") |