home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 7
/
FreshFishVol7.bin
/
bbs
/
gnu
/
gcc-2.3.3-src.lha
/
GNU
/
src
/
amiga
/
gcc-2.3.3
/
config
/
convex.md
< prev
next >
Wrap
Text File
|
1994-02-06
|
37KB
|
1,352 lines
;;- Machine description for GNU compiler
;;- Convex Version
;; Copyright (C) 1991 Free Software Foundation, Inc.
;; This file is part of GNU CC.
;; GNU CC is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; GNU CC is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU CC; see the file COPYING. If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;; Scheduling defs
;;
;; Insn scheduling is not used at present. Scheduling increases
;; register pressure so much that many spills are generated
;; even for very small functions.
;; Compares
(define_insn "tstsi"
[(set (cc0)
(match_operand:SI 0 "register_operand" "r"))]
""
"* return set_cmp (operands[0], const0_rtx, 'w');")
(define_insn "tsthi"
[(set (cc0)
(match_operand:HI 0 "register_operand" "r"))]
""
"* return set_cmp (operands[0], const0_rtx, 'h');")
(define_expand "tstqi"
[(set (match_dup 1)
(sign_extend:SI (match_operand:QI 0 "register_operand" "r")))
(set (cc0)
(match_dup 1))]
""
"operands[1] = gen_reg_rtx (SImode);")
(define_expand "tstdi"
[(parallel [(set (cc0) (match_operand:DI 0 "register_operand" "d"))
(use (match_dup 1))])]
""
"operands[1] = force_reg (DImode, const0_rtx);")
(define_insn ""
[(set (cc0) (match_operand:DI 0 "register_operand" "d"))
(use (match_operand:DI 1 "register_operand" "d"))]
""
"* return set_cmp (operands[0], operands[1], 'l');")
(define_expand "tstdf"
[(set (cc0)
(compare (match_operand:DF 0 "register_operand" "d")
(match_dup 1)))]
""
"operands[1] = force_reg (DFmode, CONST0_RTX (DFmode));")
(define_insn "tstsf"
[(set (cc0)
(match_operand:SF 0 "register_operand" "d"))]
""
"* return set_cmp (operands[0], CONST0_RTX (SFmode), 's');")
(define_insn "cmpsi"
[(set (cc0)
(compare (match_operand:SI 0 "register_operand" "d,a,i,r")
(match_operand:SI 1 "nonmemory_operand" "d,a,r,i")))]
""
"* return set_cmp (operands[0], operands[1], 'w');")
(define_insn "cmphi"
[(set (cc0)
(compare (match_operand:HI 0 "register_operand" "d,a,r,i")
(match_operand:HI 1 "nonmemory_operand" "d,a,i,r")))]
""
"* return set_cmp (operands[0], operands[1], 'h');")
(define_insn "cmpqi"
[(set (cc0)
(compare (match_operand:QI 0 "register_operand" "d")
(match_operand:QI 1 "register_operand" "d")))]
""
"* return set_cmp (operands[0], operands[1], 'b');")
(define_insn "cmpdi"
[(set (cc0)
(compare (match_operand:DI 0 "register_operand" "d")
(match_operand:DI 1 "register_operand" "d")))]
""
"* return set_cmp (operands[0], operands[1], 'l');")
(define_insn "cmpdf"
[(set (cc0)
(compare (match_operand:DF 0 "register_operand" "d")
(match_operand:DF 1 "register_operand" "d")))]
""
"* return set_cmp (operands[0], operands[1], 'd');")
(define_insn "cmpsf"
[(set (cc0)
(compare (match_operand:SF 0 "nonmemory_operand" "dF,d")
(match_operand:SF 1 "nonmemory_operand" "d,F")))]
""
"* return set_cmp (operands[0], operands[1], 's');")
;; Moves
;(define_insn "movtf"
; [(set (match_operand:TF 0 "general_operand" "=g,d")
; (match_operand:TF 1 "general_operand" "d,g"))]
; ""
; "*
;{
; rtx opaddr = 0;
; rtx xoperands[4];
; xoperands[0] = operands[0];
; xoperands[2] = operands[1];
;
; if (REG_P (operands[0]))
; xoperands[1] = gen_rtx (REG, TFmode, REGNO (operands[0]) + 1);
; else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
; xoperands[1] = 0;
; else if (offsettable_memref_p (operands[0]))
; xoperands[1] = adj_offsettable_operand (operands[0], 8);
; else
; {
; opaddr = XEXP (operands[0], 0);
; xoperands[0] = gen_rtx (MEM, TFmode, gen_rtx (REG, SImode, 13));
; xoperands[1] = adj_offsettable_operand (xoperands[0], 8);
; }
;
; if (REG_P (operands[1]))
; xoperands[3] = gen_rtx (REG, TFmode, REGNO (operands[1]) + 1);
; else if (offsettable_memref_p (operands[1]))
; xoperands[3] = adj_offsettable_operand (operands[1], 8);
; else
; {
; opaddr = XEXP (operands[1], 0);
; xoperands[2] = gen_rtx (MEM, TFmode, gen_rtx (REG, SImode, 13));
; xoperands[3] = adj_offsettable_operand (xoperands[2], 8);
; }
;
; if (opaddr)
; output_asm_insn (\"psh.w a5\;ld.w %0,a5\", &opaddr);
; if (push_operand (operands[0], TFmode))
; output_asm_insn (\"psh.l %3\;psh.l %2\", xoperands);
; else if (GET_CODE (operands[0]) == MEM)
; output_asm_insn (\"st.l %2,%0\;st.l %3,%1\", xoperands);
; else if (GET_CODE (operands[1]) == REG)
; output_asm_insn (\"mov %2,%0\;mov %3,%1\", xoperands);
; else
; output_asm_insn (\"ld.l %2,%0\;ld.l %3,%1\", xoperands);
; if (opaddr)
; output_asm_insn (\"pop.w a5\");
; return \"\";
;}")
(define_insn "movdf"
[(set (match_operand:DF 0 "general_operand" "=g,d")
(match_operand:DF 1 "general_operand" "d,dmG"))]
""
"*
{
if (push_operand (operands[0], DFmode))
return \"psh.l %1\";
else if (GET_CODE (operands[0]) == MEM)
return \"st.l %1,%0\";
else if (GET_CODE (operands[1]) == REG)
return \"mov %1,%0\";
else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_D_P (operands[1]))
{
operands[1] = gen_rtx (CONST_INT, VOIDmode,
const_double_high_int (operands[1]));
return \"ld.d %1,%0\";
}
else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_L_P (operands[1]))
{
operands[1] = gen_rtx (CONST_INT, VOIDmode,
const_double_low_int (operands[1]));
return \"ld.l %1,%0\";
}
else
return \"ld.l %1,%0\";
}")
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=g,d")
(match_operand:SF 1 "general_operand" "d,gF"))]
""
"*
{
if (push_operand (operands[0], SFmode))
return \"psh.w %1\";
else if (GET_CODE (operands[0]) == MEM)
return \"st.s %1,%0\";
else if (GET_CODE (operands[1]) == REG)
return \"mov.s %1,%0\";
else
return \"ld.s %1,%0\";
}")
(define_insn "movdi"
[(set (match_operand:DI 0 "general_operand" "=g,d")
(match_operand:DI 1 "general_operand" "d,dmiG"))]
""
"*
{
if (push_operand (operands[0], DImode))
return \"psh.l %1\";
else if (GET_CODE (operands[0]) == MEM)
return \"st.l %1,%0\";
else if (GET_CODE (operands[1]) == REG)
return \"mov %1,%0\";
else if (GET_CODE (operands[1]) == CONST_DOUBLE && LD_D_P (operands[1]))
{
operands[1] = gen_rtx (CONST_INT, VOIDmode,
const_double_high_int (operands[1]));
return \"ld.d %1,%0\";
}
else
return \"ld.l %1,%0\";
}")
;; Special case of movsi, needed to express A-reg preference.
(define_insn ""
[(set (match_operand:SI 0 "push_operand" "=<")
(plus:SI (match_operand:SI 1 "register_operand" "a")
(match_operand:SI 2 "immediate_operand" "i")))]
"operands[1] != stack_pointer_rtx"
"pshea %a2(%1)")
;; General movsi. Constraints will be selected based on TARGET_INDIRECTS
;; to avoid indirect addressing on C3, where it is slow.
(define_expand "movsi"
[(set (match_operand:SI 0 "general_operand" "")
(match_operand:SI 1 "general_operand" ""))]
""
"")
(define_insn ""
[(set (match_operand:SI 0 "push_operand" "=<,<")
(match_operand:SI 1 "general_operand" "Ad,io"))]
""
"@
psh.w %1
pshea %a1")
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=g,r,<")
(match_operand:SI 1 "general_operand" "r,g,io"))]
"TARGET_INDIRECTS"
"*
{
if (push_operand (operands[0], SImode))
{
if (GET_CODE (operands[1]) == REG)
return \"psh.w %1\";
else
return \"pshea %a1\";
}
if (GET_CODE (operands[0]) == MEM)
return \"st.w %1,%0\";
if (GET_CODE (operands[1]) != REG)
return \"ld.w %1,%0\";
if (S_REG_P (operands[0]) && S_REG_P (operands[1]))
return \"mov.w %1,%0\";
return \"mov %1,%0\";
}")
(define_insn ""
[(set (match_operand:SI 0 "general_operand"