This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: FWIW: VAX fix backport and gcc built on 4.3BSD first time ever!
- To: dave at hiauly1 dot hia dot nrc dot ca (John David Anglin)
- Subject: Re: FWIW: VAX fix backport and gcc built on 4.3BSD first time ever!
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- Date: Thu, 21 Dec 2000 17:32:44 -0500 (EST)
- Cc: gcc at gcc dot gnu dot org, msokolov at ivan dot harhan dot org
Here is a revised patch for the mainline vax.md. The bootstrap with
this patch looks like it is going ok, although it is far from complete.
I will submit the patch formally when I am certain that it is ok.
It is possible that using this new patched version with the 2.95 branch
would work. It now has the call and call_value patterns which might enable
it to work without the call_pop/call_value_pop patch. It also has at
least one other fix for a reload problem. It it does work, this might
be a more acceptable change to incorporate into the 2.95 branch since
it only affects the vax.
Dave
--
J. David Anglin dave.anglin@nrc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6605)
2000-12-21 John David Anglin <dave@hiauly1.hia.nrc.ca>
* vax.md (call_pop, call_value_pop): Change to define_expand.
(call_pop_internal, call, call_value): Define.
(casesi1 + 1): Make operands contiguous.
--- vax.md.orig Tue Sep 12 10:58:47 2000
+++ vax.md Wed Dec 20 13:33:13 2000
@@ -1818,70 +1818,74 @@
""
"decl %0\;jgequ %l1")
-;; Note that operand 1 is total size of args, in bytes,
-;; and what the call insn wants is the number of words.
-;; It is used in the call instruction as a byte, but in the addl2 as
-;; a word. Since the only time we actually use it in the call instruction
-;; is when it is a constant, SImode (for addl2) is the proper mode.
-(define_insn "call_pop"
+;; Call instructions.
+
+;; Call procedure returning no value.
+;; Operand 2 is not used on the vax.
+
+(define_expand "call_pop"
[(call (match_operand:QI 0 "memory_operand" "m")
(match_operand:SI 1 "const_int_operand" "n"))
(set (reg:SI 14) (plus:SI (reg:SI 14)
(match_operand:SI 3 "immediate_operand" "i")))]
""
- "*
- if (INTVAL (operands[1]) > 255 * 4)
- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
- return \"calls $0,%0\;addl2 %1,sp\";
- operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
- return \"calls %1,%0\";
-")
+ "
+{
+ emit_insn (gen_call_pop_internal (operands[0], operands[1]));
+ DONE;
+}")
+
+;; Call procedure returning a value in operand 0.
+;; Operand 3 is not used on the vax.
-(define_insn "call_value_pop"
+(define_expand "call_value_pop"
[(set (match_operand 0 "" "=g")
(call (match_operand:QI 1 "memory_operand" "m")
(match_operand:SI 2 "const_int_operand" "n")))
(set (reg:SI 14) (plus:SI (reg:SI 14)
(match_operand:SI 4 "immediate_operand" "i")))]
""
- "*
- if (INTVAL (operands[2]) > 255 * 4)
- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
- return \"calls $0,%1\;addl2 %2,sp\";
- operands[2] = GEN_INT ((INTVAL (operands[2]) + 3)/ 4);
- return \"calls %2,%1\";
-")
+ "
+{
+ emit_insn (gen_call_pop_internal (operands[1], operands[2]));
+ DONE;
+}")
-;; Define another set of these for the case of functions with no
-;; operands. In that case, combine may simplify the adjustment of sp.
-(define_insn ""
+;; Call procedure with no arguments.
+
+(define_insn "call"
[(call (match_operand:QI 0 "memory_operand" "m")
- (match_operand:SI 1 "const_int_operand" "n"))
- (set (reg:SI 14) (reg:SI 14))]
+ (const_int 0))]
""
- "*
- if (INTVAL (operands[1]) > 255 * 4)
- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
- return \"calls $0,%0\;addl2 %1,sp\";
- operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
- return \"calls %1,%0\";
-")
+ "calls $0,%0")
-(define_insn ""
+;; Call procedure returning a value in operand 0 with no arguments.
+
+(define_insn "call_value"
[(set (match_operand 0 "" "=g")
(call (match_operand:QI 1 "memory_operand" "m")
- (match_operand:SI 2 "const_int_operand" "n")))
- (set (reg:SI 14) (reg:SI 14))]
+ (const_int 0)))]
+ ""
+ "calls $0,%1")
+
+;; Note that operand 1 is total size of args, in bytes,
+;; and what the call insn wants is the number of words.
+;; It is used in the call instruction as a byte, but in the addl2 as
+;; a word. Since the only time we actually use it in the call instruction
+;; is when it is a constant, SImode (for addl2) is the proper mode.
+(define_insn "call_pop_internal"
+ [(call (match_operand:QI 0 "memory_operand" "m")
+ (match_operand:SI 1 "const_int_operand" "n"))]
""
"*
- if (INTVAL (operands[2]) > 255 * 4)
+ if (INTVAL (operands[1]) > 255 * 4)
/* Vax `calls' really uses only one byte of #args, so pop explicitly. */
- return \"calls $0,%1\;addl2 %2,sp\";
- operands[2] = GEN_INT ((INTVAL (operands[2]) + 3)/ 4);
- return \"calls %2,%1\";
+ return \"calls $0,%0\;addl2 %1,sp\";
+ operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
+ return \"calls %1,%0\";
")
-;; Call subroutine returning any type.
+;; Call procedure returning any type.
(define_expand "untyped_call"
[(parallel [(call (match_operand 0 "" "")
@@ -1986,7 +1990,7 @@
(mult:SI (minus:SI (match_dup 0)
(const_int 0))
(const_int 2)))))
- (label_ref:SI (match_operand 3 "" "")))
+ (label_ref:SI (match_operand 2 "" "")))
(pc)))]
""
"casel %0,$0,%1")