(clrstrsi): Correct check for constant size.

(allocate_stack{,_worker}): New patterns.

From-SVN: r12708
This commit is contained in:
Richard Kenner 1996-09-14 17:01:32 -04:00
parent 22371ff356
commit 578b58f55e
1 changed files with 29 additions and 1 deletions

View File

@ -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;
}")