aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1996-02-15 23:35:34 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1996-02-15 23:35:34 +0000
commitcea05fab5258188afcd73a957e89a9eb06d5e010 (patch)
tree6316c8d210dcbab5ed23c7b652fb2299f4add8ea /gcc
parent10568ad0dd64fc868941cb4f21d05ac802708c24 (diff)
downloadgcc-cea05fab5258188afcd73a957e89a9eb06d5e010.zip
gcc-cea05fab5258188afcd73a957e89a9eb06d5e010.tar.gz
gcc-cea05fab5258188afcd73a957e89a9eb06d5e010.tar.bz2
Fix alloca on NT
From-SVN: r11280
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/rs6000/rs6000.md17
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index f3476bd..38ce9eb 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -6336,9 +6336,10 @@
if (DEFAULT_ABI == ABI_NT
&& (GET_CODE (operands[0]) != CONST_INT || INTVAL (operands[0]) > 4096))
{
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, \"__allocate_stack\"), 0,
- VOIDmode, 1,
- operands[0], Pmode);
+ rtx tmp = gen_reg_rtx (SImode);
+ emit_library_call_value (gen_rtx (SYMBOL_REF, Pmode, \"__allocate_stack\"),
+ tmp, 0, SImode, 1, operands[0], Pmode);
+ emit_insn (gen_set_sp (tmp));
DONE;
}
@@ -6363,6 +6364,16 @@
DONE;
}")
+;; Marker to indicate that the stack pointer was changed under NT in
+;; ways not known to the compiler
+
+(define_insn "set_sp"
+ [(set (reg:SI 1)
+ (unspec [(match_operand:SI 0 "register_operand" "r")] 7))]
+ ""
+ ""
+ [(set_attr "length" "0")])
+
;; These patterns say how to save and restore the stack pointer. We need not
;; save the stack pointer at function level since we are careful to
;; preserve the backchain. At block level, we have to restore the backchain