|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 76865 (0x12c41)
Types: TextFile
Names: »mips.md«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
└─⟦d53cfc7b2⟧ »./gcc-1.35.tar.Z«
└─⟦90f628c1d⟧
└─⟦this⟧ »gcc-1.35/config/mips.md«
;; Mips.md Naive version of Machine Description for MIPS
;; Contributed by A. Lichnewsky, lich@inria.inria.fr
;; Copyright (C) 1989 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 1, 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.
;;
;;------------------------------------------------------------------------
;;
\f
;;
;; ....................
;;
;; ARITHMETIC
;;
;; ....................
;;
(define_insn "adddf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(plus:DF (match_operand:DF 1 "general_operand" "%f")
(match_operand:DF 2 "general_operand" "f")))]
""
"*
{
return \"add.d\\t%0,%1,%2\";
}")
(define_insn "addsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(plus:SF (match_operand:SF 1 "general_operand" "%f")
(match_operand:SF 2 "general_operand" "f")))]
""
"*
{
return \"add.s\\t%0,%1,%2\";
}")
(define_insn "addsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(plus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "rIJ")))]
""
"*
{ if(GET_CODE(operands[2])==CONST_INT)
{ if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'I'))
{ return \"addi%u\\t%0,%1,%x2\\t#addsi3\\t%1,%d2 -> %0\";
}
else if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'J'))
return \"add%u\\t%0,%1,$0\\t#addsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#addsi3\\t%1,%2 -> %0\";
}
else
return \"add%u\\t%0,%1,%2\\t#addsi3\\t%1,%2 -> %0\";
}")
(define_insn "addhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(plus:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"add%u\\t%0,%1,%2\\t#addhi3 %1,%2 -> %0\";
}")
(define_insn "addqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(plus:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"add%u\\t%0,%1,%2\\t#addqi3 %1,%2 -> %0\";
}")
\f
;;- All kinds of subtract instructions.
(define_insn "subdf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(minus:DF (match_operand:DF 1 "general_operand" "f")
(match_operand:DF 2 "general_operand" "f")))]
""
"*
{
return \"sub.d\\t%0,%1,%2\";
}")
(define_insn "subsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(minus:SF (match_operand:SF 1 "general_operand" "f")
(match_operand:SF 2 "general_operand" "f")))]
""
"*
{
return \"sub.s\\t%0,%1,%2\";
}")
(define_insn "subsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(minus:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "rIJ")))]
""
"*
{ if(GET_CODE(operands[2])==CONST_INT)
{ if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'I'))
{ rtx ops[4];
ops[0]=operands[0];
ops[1]=operands[1];
ops[3]=operands[2];
ops[2]=gen_rtx(CONST_INT,VOIDmode,-INTVAL(operands[2]));
output_asm_insn( \"addi%u\\t%0,%1,%x2\\t#subsi3\\t%1,%d3 -> %0\"
,ops);
return \"\";
}
else if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'J'))
return \"sub%u\\t%0,%1,$0\\t#subsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#subsi3\\t%1,%2 -> %0\";
}
else
return \"sub%u\\t%0,%1,%2\\t#subsi3 %1,%2 -> %0\";
}")
(define_insn "subhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(minus:HI (match_operand:HI 1 "general_operand" "r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"sub%u\\t%0,%1,%2\\t#subhi3 %1,%2 -> %0\";
}")
(define_insn "subqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(minus:QI (match_operand:QI 1 "general_operand" "r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"sub%u\\t%0,%1,%2\\t#subqi3 %1,%2 -> %0\";
}")
\f
;;- Multiply instructions.
(define_insn "muldf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(mult:DF (match_operand:DF 1 "general_operand" "%f")
(match_operand:DF 2 "general_operand" "f")))]
""
"*
{ return \"mul.d\\t%0,%1,%2\";
}")
(define_insn "mulsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(mult:SF (match_operand:SF 1 "general_operand" "%f")
(match_operand:SF 2 "general_operand" "f")))]
""
"*
{ return \"mul.s\\t%0,%1,%2\";
}")
(define_insn "mulsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(mult:SI (match_operand:SI 1 "general_operand" "%r")
(match_operand:SI 2 "general_operand" "r")))]
""
"*
{ return \"mul\\t%0,%1,%2\\t#mulsi3 %1,%2 -> %0\";
}")
(define_insn "mulhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(mult:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"mul\\t%0,%1,%2\\t#mulhi3 %1,%2 -> %0\";
}")
(define_insn "mulqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(mult:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"mul\\t%0,%1,%2\\t#mulhi3 %1,%2 -> %0\";
}")
\f
;;- Divide instructions.
(define_insn "divdf3"
[(set (match_operand:DF 0 "general_operand" "=f")
(div:DF (match_operand:DF 1 "general_operand" "f")
(match_operand:DF 2 "general_operand" "f")))]
""
"*
{ return \"div.d\\t%0,\\t%1,%2\";
}")
(define_insn "divsf3"
[(set (match_operand:SF 0 "general_operand" "=f")
(div:SF (match_operand:SF 1 "general_operand" "f")
(match_operand:SF 2 "general_operand" "f")))]
""
"*
{ return \"div.s\\t%0,%1,%2\";
}")
(define_insn "divsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(div:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "r")))]
""
"*
{ return \"div\\t%0,%1,%2\\t#divsi3 %1,%2 -> %0\";
}")
(define_insn "divhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(div:HI (match_operand:HI 1 "general_operand" "r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"div\\t%0,%1,%2\\t#divhi3 %1,%2 -> %0\";
}")
(define_insn "divqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(div:QI (match_operand:QI 1 "general_operand" "r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"div\\t%0,%1,%2\\t#divqi3 %1,%2 -> %0\";
}")
\f
;;
;; ....................
;;
;; LOGICAL
;;
;; ....................
;;
(define_insn "anddi3"
[(set (match_operand:DI 0 "general_operand" "=r")
(and:DI (match_operand:DI 1 "general_operand" "r")
(match_operand:DI 2 "general_operand" "r")))]
""
"*
{rtx xops[3];
if( (REGNO(operands[0]) != (REGNO(operands[1]) +1))
&&
(REGNO(operands[0]) != (REGNO(operands[2]) +1)))
{ /* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
xops[2] = gen_rtx(REG,SImode,REGNO(operands[2]));
output_asm_insn(\"and\\t%0,%1,%2\\t#anddi %1,%2 -> %0\",xops);
xops[0] = gen_rtx(REG,SImode, REGNO(xops[0])+1);
xops[1] = gen_rtx(REG,SImode, REGNO(xops[1])+1);
xops[2] = gen_rtx(REG,SImode, REGNO(xops[2])+1);
output_asm_insn(\"and\\t%0,%1,%2\\t#anddi %1,%2 -> %0\",xops);
}
else
abort();
return \"\"; }
"
)
(define_insn "andsi3"
[(set (match_operand:SI 0 "general_operand" "=r,&r")
(and:SI (match_operand:SI 1 "general_operand" "r,r")
(match_operand:SI 2 "general_operand" "rJ,I")))]
""
"*
{ rtx xops[3];
if(GET_CODE(operands[2])==CONST_INT)
{ if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'I'))
if(INTVAL(operands[2]) >= 0)
{ return \"andi\\t%0,%1,%x2\\t#andsi3\\t%1,%d2 -> %0\";
}
else
{ xops[0]= operands[0];
xops[1]= operands[1];;
xops[2]= gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[2]))>>16);
output_asm_insn(\"lui\\t%0,%x2\\t#load higher part (andsi3)\",
xops);
xops[2]= gen_rtx(CONST_INT,VOIDmode,
0xffff & (INTVAL(operands[2])));
output_asm_insn(\"addi%u\\t%0,$0,%x2\\t#load lower part (andsi3)\",
xops);
output_asm_insn(\"and\\t%0,%0,%1\\t#andsi3\",xops);
return \"\";
}
else if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'J'))
return \"and\\t%0,%1,$0\\t#andsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#andsi3\\t%1,%2 -> %0\";
}
else
return \"and\\t%0,%1,%2\\t#andsi3\\t%1,%2 -> %0\";
}")
(define_insn "andhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(and:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"and\\t%0,%1,%2\\t#andhi3 %1,%2 -> %0\";
}")
(define_insn "andqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(and:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"and\\t%0,%1,%2\\t#andqi3 %1,%2 -> %0\";
}")
(define_insn "iordi3"
[(set (match_operand:DI 0 "general_operand" "=r")
(ior:DI (match_operand:DI 1 "general_operand" "r")
(match_operand:DI 2 "general_operand" "r")))]
""
"*
{rtx xops[3];
if( (REGNO(operands[0]) != (REGNO(operands[1]) +1))
&&
(REGNO(operands[0]) != (REGNO(operands[2]) +1)))
{ /* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
xops[2] = gen_rtx(REG,SImode,REGNO(operands[2]));
output_asm_insn(\"or\\t%0,%1,%2\\t#iordi3 %1,%2 -> %0\",xops);
xops[0] = gen_rtx(REG,SImode, REGNO(xops[0])+1);
xops[1] = gen_rtx(REG,SImode, REGNO(xops[1])+1);
xops[2] = gen_rtx(REG,SImode, REGNO(xops[2])+1);
output_asm_insn(\"or\\t%0,%1,%2\\t#iordi3 %1,%2 -> %0\",xops);
}
else
abort();
return \"\"; }
"
)
(define_insn "iorsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(ior:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "rIJ")))]
""
"*
{ if(GET_CODE(operands[2])==CONST_INT)
{ if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'I'))
{ return \"ori\\t%0,%1,%x2\\t#iorsi3\\t%1,%d2 -> %0\";
}
else if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'J'))
return \"or\\t%0,%1,$0\\t#iorsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#iorsi3\\t%1,%2 -> %0\";
}
else
return \"or\\t%0,%1,%2\\t#iorsi3\\t%1,%2 -> %0\";
}")
(define_insn "iorhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(ior:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"or\\t%0,%1,%2\\t#iorhi3 %1,%2 -> %0\";
}")
(define_insn "iorqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(ior:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"or\\t%0,%1,%2\\t#iorqi3 %1,%2 -> %0\";
}")
(define_insn "xordi3"
[(set (match_operand:DI 0 "general_operand" "=r")
(xor:DI (match_operand:DI 1 "general_operand" "r")
(match_operand:DI 2 "general_operand" "r")))]
""
"*
{rtx xops[3];
if( (REGNO(operands[0]) != (REGNO(operands[1]) +1))
&&
(REGNO(operands[0]) != (REGNO(operands[2]) +1)))
{ /* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
xops[2] = gen_rtx(REG,SImode,REGNO(operands[2]));
output_asm_insn(\"xor\\t%0,%1,%2\\t#xordi3 %1,%2 -> %0\",xops);
xops[0] = gen_rtx(REG,SImode, REGNO(xops[0])+1);
xops[1] = gen_rtx(REG,SImode, REGNO(xops[1])+1);
xops[2] = gen_rtx(REG,SImode, REGNO(xops[2])+1);
output_asm_insn(\"xor\\t%0,%1,%2\\t#xordi3 %1,%2 -> %0\",xops);
}
else
abort();
return \"\"; }
"
)
(define_insn "xorsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(xor:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "general_operand" "rIJ")))]
""
"*
{ if(GET_CODE(operands[2])==CONST_INT)
{ if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'I'))
{ return \"xori\\t%0,%1,%x2\\t#xorsi3\\t%1,%d2 -> %0\";
}
else if (CONST_OK_FOR_LETTER_P(INTVAL(operands[2]),'J'))
return \"xor\\t%0,%1,$0\\t#xorsi3\\t%1,%2 -> %0\";
else return \"ERROR op2 not zero \\t#xorsi3\\t%1,%2 -> %0\";
}
else
return \"xor\\t%0,%1,%2\\t#xorsi3\\t%1,%2 -> %0\";
}")
(define_insn "xorhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(xor:HI (match_operand:HI 1 "general_operand" "%r")
(match_operand:HI 2 "general_operand" "r")))]
""
"*
{ return \"xor\\t%0,%1,%2\\t#xorhi3 %1,%2 -> %0\";
}")
(define_insn "xorqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(xor:QI (match_operand:QI 1 "general_operand" "%r")
(match_operand:QI 2 "general_operand" "r")))]
""
"*
{ return \"xor\\t%0,%1,%2\\t#xorqi3 %1,%2 -> %0\";
}")
\f
;;
;; ....................
;;
;; TRUNCATION
;;
;; ....................
;; Extension and truncation insns.
;; Those for integer source operand
;; are ordered widest source type first.
;; CHARACTERS ARE CONSIDERED UNSIGNED
;; --------------- cf. tm.h ---------
(define_insn "truncsiqi2"
[(set (match_operand:QI 0 "general_operand" "=r")
(truncate:QI (match_operand:SI 1 "general_operand" "r")))]
""
"*
if (DEFAULT_SIGNED_CHAR)
return \"ERROR(SIGNED CHAR)\\tandi\\t%0,%1,0xff\\t#truncsiqi2\\t %1 -> %0\";
else
return \"andi\\t%0,%1,0xff\\t#truncsiqi2\\t %1 -> %0\";"
)
(define_insn ""
[(set (match_operand:QI 0 "general_operand" "=r,r")
(subreg:QI (match_operand:SI 1 "general_operand" "r,*m") 0))]
""
"*
if (GET_CODE(operands[1]) == MEM)
{ rtx nops[3];
nops[0]= operands[0];
nops[2]=operands[1];
nops[1]= addr_compensate(operands[1], QImode, SImode,0);
output_asm_insn(\"lbu\\t%0,%1\\t#(subreg:QI %1 0)->%0\",nops);
return \"\";
}
else
if (DEFAULT_SIGNED_CHAR)
return \"ERROR(SIGNED CHAR)\\tandi\\t%0,%1,0xff\\t#subreg truncsiqi2\\t %1 -> %0\";
else
return \"andi\\t%0,%1,0xff\\t#subreg truncsiqi2\\t %1 -> %0\";"
)
(define_insn "truncsihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(truncate:HI (match_operand:SI 1 "general_operand" "r")))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x10\\t#truncsihi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x10\\t#truncsihi2\\t %1 -> %0\";
")
(define_insn ""
[(set (match_operand:HI 0 "general_operand" "=r")
(subreg:HI (match_operand:SI 1 "general_operand" "r") 0))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x10\\t#subreg truncsihi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x10\\t#subreg truncsihi2\\t %1 -> %0\";
")
(define_insn "trunchiqi2"
[(set (match_operand:QI 0 "general_operand" "=r")
(truncate:QI (match_operand:HI 1 "general_operand" "r")))]
""
"*
if (DEFAULT_SIGNED_CHAR)
return \"ERROR(SIGNED CHAR)\\tandi\\t%0,%1,0xff\\t#trunchiqi2\\t %1 -> %0\";
else
return \"andi\\t%0,%1,0xff\\t#trunchiqi2\\t %1 -> %0\";")
(define_insn ""
[(set (match_operand:QI 0 "general_operand" "=r")
(subreg:QI (match_operand:HI 1 "general_operand" "r") 0))]
""
"*
if (DEFAULT_SIGNED_CHAR)
return \"ERROR(SIGNED CHAR)\\tandi\\t%0,%1,0xff\\t#subreg trunchiqi2\\t %1 -> %0\";
else
return \"andi\\t%0,%1,0xff\\t#subreg trunchiqi2\\t %1 -> %0\";")
(define_insn "truncdfsf2"
[(set (match_operand:SF 0 "general_operand" "=f")
(float_truncate:SF (match_operand:DF 1 "general_operand" "f")))]
""
"cvt.s.d\\t%0,%1\\t#truncdfsf2\\t %1 -> %0")
\f
;;
;; ....................
;;
;; ZERO EXTENSION
;;
;; ....................
;; Extension insns.
;; Those for integer source operand
;; are ordered widest source type first.
;; CHARACTERS ARE CONSIDERED UNSIGNED
;; --------------- cf. tm.h ---------
(define_insn "zero_extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(zero_extend:SI (match_operand:HI 1 "general_operand" "r")))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x10\\t#zero_extendhisi2\\t %1 -> %0\",
operands);
return \"srl\\t%0,%0,0x10\\t#zero_extendhisi2\\t %1 -> %0\";
"
)
(define_insn "zero_extendqihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(zero_extend:HI (match_operand:QI 1 "general_operand" "r")))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x18\\t#zero_extendqihi2\\t %1 -> %0\",
operands);
return \"srl\\t%0,%0,0x18\\t#zero_extendqihi2\\t %1 -> %0\";
"
)
(define_insn "zero_extendqisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(zero_extend:SI (match_operand:QI 1 "general_operand" "r")))]
""
"*
return \"andi\\t%0,%1,0xff\\t#zero_extendqisi2\\t %1 -> %0\";
"
)
\f
;;
;; ....................
;;
;; SIGN EXTENSION
;;
;; ....................
;; Extension insns.
;; Those for integer source operand
;; are ordered widest source type first.
;; CHARACTERS ARE CONSIDERED UNSIGNED
;; --------------- cf. tm.h ---------
(define_insn "extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(sign_extend:SI (match_operand:HI 1 "general_operand" "r")))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x10\\t#extendhisi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x10\\t#extendhisi2\\t %1 -> %0\";
"
)
(define_insn "extendqihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(sign_extend:HI (match_operand:QI 1 "general_operand" "r")))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x18\\t#extendqihi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x18\\t#extendqihi2\\t %1 -> %0\";
"
)
(define_insn "extendqisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(sign_extend:SI (match_operand:QI 1 "general_operand" "r")))]
""
"*
output_asm_insn(\"sll\\t%0,%1,0x18\\t#extendqisi2\\t %1 -> %0\",
operands);
return \"sra\\t%0,%0,0x18\\t#extendqisi2\\t %1 -> %0\";
"
)
(define_insn "extendsfdf2"
[(set (match_operand:DF 0 "general_operand" "=f")
(float_extend:DF (match_operand:SF 1 "general_operand" "f")))]
""
"*
return \"cvt.d.s\\t%0,%1\\t#extendsfdf2\\t %1 -> %0\";
"
)
\f
;;
;; ....................
;;
;; CONVERSIONS
;;
;; ....................
(define_insn "fix_truncdfsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(fix:SI (fix:DF (match_operand:DF 1 "general_operand" "f"))))
(clobber (reg:DF 44))]
""
"cvt.w.d\\t$f12,%1\\t#fix_truncdfsi2\\t%1 -> %0\;mfc1\\t%0,$f12\\t#fix_truncdfsi2\\t%1 -> %0"
)
(define_insn "fix_truncsfsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(fix:SI (fix:SF (match_operand:SF 1 "general_operand" "f"))))
(clobber (reg:DF 44))]
""
"cvt.w.s\\t $f12,%1\\t#fix_truncsfsi2\\t%1 -> %0\;mfc1\\t%0,$f12\\t#fix_truncsfsi2\\t%1 -> %0"
)
(define_insn "floatsidf2"
[(set (match_operand:DF 0 "general_operand" "=f")
(float:DF (match_operand:SI 1 "general_operand" "r")))]
""
"mtc1\\t%1,%0\\t#floatsidf2\\t%1 -> %0\;cvt.d.w\\t%0,%0\\t#floatsidf2\\t%1 -> %0"
)
(define_insn "floatsisf2"
[(set (match_operand:SF 0 "general_operand" "=f")
(float:SF (match_operand:SI 1 "general_operand" "r")))]
""
"mtc1\\t%1,%0\\t#floatsisf2\\t%1 -> %0\;cvt.s.w\\t%0,%0\\t#floatsisf2\\t%1 -> %0"
)
\f
;;- Wild things used when
;;- unions make double and int
;;- overlap.
;;-
;;- This must be supported
;;- since corresponding code
;;- gets generated
(define_insn ""
[(set (subreg:DF
(match_operand:DI 0 "register_operand" "=ry")
0)
(match_operand:DF 1 "register_operand" "rf"))
(clobber (match_operand 2 "register_operand" "rf"))]
""
"*
{rtx xops[2];
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1]));
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \\t likely Union\"
,xops);
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \"
,xops);
return(\"\");
}
"
)
(define_insn ""
[(set (subreg:DF
(match_operand:DI 0 "register_operand" "=ry")
0)
(match_operand:DF 1 "register_operand" "rf"))]
""
"*
{rtx xops[2];
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1]));
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \\t likely Union\"
,xops);
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> (subreg:DF %0 0) \"
,xops);
return(\"\");
}
"
)
(define_insn ""
[(set (match_operand:DF 0 "register_operand" "=rf")
(subreg:DF
(match_operand:DI 1 "register_operand" "ry")
0)
)
(clobber (match_operand 2 "register_operand" "rf"))]
""
"*
{rtx xops[2];
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
,xops);
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
,xops);
return(\"\");
}
"
)
(define_insn ""
[(set (match_operand:DF 0 "register_operand" "=rf")
(subreg:DF
(match_operand:DI 1 "register_operand" "ry")
0)
)]
""
"*
{rtx xops[2];
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
,xops);
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# (subreg:DF %1) -> %0 \\t\"
,xops);
return(\"\");
}
"
)
\f
;;
;; ....................
;;
;; MOVES
;;
;; and
;;
;; LOADS AND STORES
;;
;; ....................
(define_insn "movdi"
[(set (match_operand:DI 0 "general_operand" "=r,*r,*m")
(match_operand:DI 1 "general_operand" "r,*m,*r"))]
""
"*
{ extern rtx change_address();
extern rtx plus_constant();
if( which_alternative == 0)
{rtx xops[2];
if(REGNO(operands[0]) != (REGNO(operands[1]) +1))
{ /* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
output_asm_insn(\"add%u\\t%0,$0,%1\\t#movdi %1 -> %0\",xops);
xops[0] = gen_rtx(REG,SImode, REGNO(xops[0])+1);
xops[1] = gen_rtx(REG,SImode, REGNO(xops[1])+1);
output_asm_insn(\"add%u\\t%0,$0,%1\\t#movdi %1 -> %0\",xops);
}
else
{ /* TAKE CARE OF OVERLAPS */
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0])+1);
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
output_asm_insn(\"add%u\\t%0,$0,%1\\t#movdi %1 -> %0\",xops);
xops[0] = gen_rtx(REG,SImode, REGNO(xops[0])-1);
xops[1] = gen_rtx(REG,SImode, REGNO(xops[1])-1);
output_asm_insn(\"add%u\\t%0,$0,%1\\t#movdi %1 -> %0\",xops);
}
return \"\"; }
else if(which_alternative == 1)
{ /* No overlap here */
rtx xops[2];
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
if (GET_CODE(operands[1]) == MEM)
xops[1] = gen_rtx(MEM,SImode,XEXP(operands[1],0));
else abort();
output_asm_insn(\"lw\\t%0,%1\\t#movdi %1(mem) -> %0\",xops);
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0])+1);
/* See change_address in emit-rtl.c */
/* See plus_constant in explow.c */
if (GET_CODE(operands[1]) == MEM)
xops[1] = change_address(operands[1],SImode,
plus_constant(XEXP(operands[1],0),4));
else abort();
output_asm_insn(\"lw\\t%0,%1\\t#movdi %1(mem) -> %0\",xops);
return \"\";
}
else
{ /* No overlap here */
rtx xops[2];
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
if (GET_CODE(operands[0]) == MEM)
xops[0] = gen_rtx(MEM,SImode,XEXP(operands[0],0));
else abort();
output_asm_insn(\"sw\\t%1,%0\\t#movdi %1 -> %0(mem)\",xops);
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
/* See change_address in emit-rtl.c */
/* See plus_constant in explow.c */
if (GET_CODE(operands[0]) == MEM)
xops[0] = change_address(operands[0],SImode,
plus_constant(XEXP(operands[0],0),4));
else abort();
output_asm_insn(\"sw\\t%1,%0\\t#movdi %1 -> %0 (mem)\",xops);
return \"\";
}
}
"
)
(define_insn "movsi"
[(set (match_operand:SI 0 "general_operand" "=r,r,m,r")
(match_operand:SI 1 "general_operand" "r,m,r,i"))]
""
"*
{ if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"add%u\\t%0,$0,%1\\t#movsi\\t%1 -> %0 \";}
else
{if ((GET_CODE (operands[0]) == REG )
&&
(GET_CODE (operands[1]) == CONST_INT))
{ rtx xops[3];
xops[0] = operands[0];
xops[2] = gen_rtx(CONST_INT,VOIDmode,
INTVAL(operands[1]));
if ( ((INTVAL(operands[1]))>>16)
&& ((INTVAL(operands[1])) & 0xffff))
{if(!( (-INTVAL(operands[1]))>>16))
{ xops[1] = gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[1])) & 0xffff);
output_asm_insn(\"addi%u\\t%0,$0,%x1\\t#movsi low part of %2\",
xops);
}
else
{
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[1]))>>16);
output_asm_insn(\"lui\\t%0,%x1\\t#movsi high part of %2\",xops);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[1])) & 0xffff);
output_asm_insn(\"ori\\t%0,%x1\\t#movsi low part of %2\",xops);
}}
else
if ((INTVAL(operands[1]))>>16)
{ xops[1] = gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[1]))>>16);
output_asm_insn(\"lui\\t%0,%x1\\t#movsi high part of %2\",xops);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[1])) & 0xffff);
}
else
{
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(INTVAL(operands[1])) & 0xffff);
output_asm_insn(\"ori\\t%0,$0,%x1\\t#movsi low part of %2\",
xops);
}
return \"\";
}
else
if (GET_CODE (operands[0]) == REG )
{if ( (GET_CODE(operands[1]) == SYMBOL_REF)
||(GET_CODE(operands[1]) == LABEL_REF)
)
{return \"la\\t%0,%1\\t#movsi %1 -> %0\";}
else
{if (GET_CODE(operands[1]) == CONST)
{return \"la\\t%0,%1\\t#movsi %1(AExp) -> %0\";}
else
{return \"lw\\t%0,%1\\t#movsi %1 -> %0\";}}}
else
{
return \"sw\\t%1,%0\\t#movsi %1 -> %0\";}}
}")
(define_insn "movhi"
[(set (match_operand:HI 0 "general_operand" "=r,r,m,r")
(match_operand:HI 1 "general_operand" "r,m,r,i"))]
""
"*
{ if((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"add%u\\t%0,$0,%1\\t#move.h %1 -> %0 \";
}
else
{if ((GET_CODE (operands[0]) == REG )
&&
(GET_CODE (operands[1]) == CONST_INT))
{
return \"addi%u\\t%0,$0,%x1\\t# movhi %1 -> %0\";
}
else
{if (GET_CODE (operands[0]) == REG)
{return \"lh\\t%0,%1\\t#movhi %1 -> %0\";}
else
{return \"sh\\t%1,%0\\t#movhi %1 -> %0\";}}}
}")
(define_insn "movqi"
[(set (match_operand:QI 0 "general_operand" "=r,r,m,r")
(match_operand:QI 1 "general_operand" "r,m,r,i"))]
""
"*
{ if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"add%u\\t%0,$0,%1\\t#move.b %1 -> %0 \";
}
{if ((GET_CODE (operands[0]) == REG )
&&
(GET_CODE (operands[1]) == CONST_INT))
{
return \"addi%u\\t%0,$0,%x1\\t# movqi %1 -> %0\";
}
/* Should say that I am not padding high order ;;
** bits correctly
*/
else
{if (GET_CODE (operands[0]) == REG)
{return \"lbu\\t%0,%1\\t#movqi %1 -> %0\";}
else
{return \"sb\\t%1,%0\\t#movqi %1 -> %0\";}}}
}")
\f
(define_insn "movsf"
[(set (match_operand:SF 0 "general_operand" "=f,f,m,f")
(match_operand:SF 1 "general_operand" "f,m,f,F"))
(clobber (reg:SI 24))]
""
"*
{ if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
}
{if ((GET_CODE (operands[0]) == REG )
&&
(GET_CODE (operands[1]) == CONST_DOUBLE))
{ rtx xops[3];
xops[0] = operands[0];
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],0))>>16);
xops[2] = gen_rtx(CONST_INT,VOIDmode,
XINT(operands[1],0));
output_asm_insn(\"lui\\t$24,%x1\\t#move high part of %2\",xops);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],0)) & 0xff);
output_asm_insn(\"ori\\t$24,%x1\\t#move low part of %2\",xops);
output_asm_insn(\"mtc1\\t$24,%0\",xops);
xops[0] = gen_rtx(REG,SFmode, REGNO(xops[0])+1);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],1))>>16);
xops[2] = gen_rtx(CONST_INT,VOIDmode,
XINT(operands[1],1));
output_asm_insn(\"lui\\t$24,%x1\\t#move high part of %2\",xops);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],1)) & 0xff);
output_asm_insn(\"ori\\t$24,%x1\\t#move low part of %2\",xops);
output_asm_insn(\"mtc1\\t$24,%0\",xops);
return \"cvt.s.d\\t %0,%0 \";
}
/* Should say that I am not padding high order ;;
** bits correctly
*/
else
{if (GET_CODE (operands[0]) == REG)
{return \"l.s\\t %0,%1\\t#movsf %1 -> %0\";}
else
{return \"s.s\\t %1,%0\\t#movsf %1 -> %0\";}}}
}")
;; ---
(define_insn "movdf"
[(set (match_operand:DF 0 "general_operand" "=f,f,m,f,*f,*y")
(match_operand:DF 1 "general_operand" "f,m,f,F,*y,*f"))
(clobber (reg:SI 24))]
""
"* if(which_alternative >3)
{rtx xops[2];
if(REGNO(operands[1]) == 6)
{
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
return(\"\");
}
else
if(REGNO(operands[0]) == 6)
{
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
return(\"\");
}
else {abort_with_insn(insn,
\"Matched *y constraint and register number wrong\");}
}
else
{ if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \";
}
{if ((GET_CODE (operands[0]) == REG )
&&
(GET_CODE (operands[1]) == CONST_DOUBLE))
{ rtx xops[3];
xops[0] = operands[0];
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],0))>>16);
xops[2] = gen_rtx(CONST_INT,VOIDmode,
XINT(operands[1],0));
output_asm_insn(\"lui\\t$24,%x1\\t#move high part of %2\",xops);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],0)) & 0xff);
output_asm_insn(\"ori\\t$24,%x1\\t#move low part of %2\",xops);
output_asm_insn(\"mtc1\\t%0,$24\",xops);
xops[0] = gen_rtx(REG,SFmode, REGNO(xops[0])+1);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],1))>>16);
xops[2] = gen_rtx(CONST_INT,VOIDmode,
XINT(operands[1],1));
output_asm_insn(\"lui\\t$24,%x1\\t#move high part of %2\",xops);
xops[1] = gen_rtx(CONST_INT,VOIDmode,
(XINT(operands[1],1)) & 0xff);
output_asm_insn(\"ori\\t$24,%x1\\t#move low part of %2\",xops);
output_asm_insn(\"mtc1\\t%0,$24\",xops);
return \"# \";
}
else
{if (GET_CODE (operands[0]) == REG)
{return \"l.d\\t %0,%1\\t#movdf %1 -> %0\";}
else
{return \"s.d\\t %1,%0\\t#movdf %1 -> %0\";}}}
}")
(define_insn ""
[(set (match_operand:SF 0 "general_operand" "=f,f,m")
(match_operand:SF 1 "general_operand" "f,m,f"))
]
""
"*
{ if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"mov.s %0,%1\\t#movsf %1 -> %0 \";
}
{if (GET_CODE (operands[0]) == REG)
{return \"l.s\\t %0,%1\\t#movsf %1 -> %0\";}
else
{return \"s.s\\t %1,%0\\t#movsf %1 -> %0\";}}
}")
;; ---
(define_insn ""
[(set (match_operand:DF 0 "general_operand" "=f,f,m,*f,*y")
(match_operand:DF 1 "general_operand" "f,m,f,*y,*f"))
]
""
"*
if(which_alternative >2)
{rtx xops[2];
if(REGNO(operands[1]) == 6)
{
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
xops[0] = gen_rtx(REG,DFmode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mtc1\\t%1,%0\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
return(\"\");
}
else
if(REGNO(operands[0]) == 6)
{
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0]));
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1])+1);
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1]));
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
xops[0] = gen_rtx(REG,SImode,REGNO(operands[0])+1);
#ifndef DECSTATION
xops[1] = gen_rtx(REG,DFmode,REGNO(operands[1]));
#else
xops[1] = gen_rtx(REG,SImode,REGNO(operands[1])+1);
#endif
output_asm_insn(\"mfc1\\t%0,%1\\t# %1 -> %0 \\tcalling sequence trick\"
,xops);
return(\"\");
}
else {abort_with_insn(insn,
\"Matched *y constraint and register number wrong\");}
}
else
{ if ((GET_CODE (operands[0]) == REG) && (GET_CODE (operands[1]) == REG))
{ return \"mov.d\\t%0,%1\\t#movdf %1 -> %0 \";
}
{if (GET_CODE (operands[0]) == REG)
{return \"l.d\\t %0,%1\\t#movdf %1 -> %0\";}
else
{return \"s.d\\t %1,%0\\t#movdf %1 -> %0\";}}
}")
\f
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r")
(match_operand:QI 1 "general_operand" "r"))]
""
"*
return \"andi\\t%0,%1,0xff\\t#Wild zero_extendqisi2\\t %1 -> %0\";
"
)
\f
;;
;; ....................
;;
;; OTHER ARITHMETIC AND SHIFT
;;
;; ....................
(define_insn "ashlqi3"
[(set (match_operand:QI 0 "general_operand" "=r")
(ashift:QI (match_operand:QI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{operands[2]=gen_rtx(CONST_INT,VOIDmode,(XINT(operands[2],0))& 0x1f);
output_asm_insn(\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0\",operands);
}
else
output_asm_insn(\"sll\\t%0,%1,%2\\t#ashlqi3\\t (%1<<%2) -> %0 (asm syntax)\",
operands);
return \"andi\\t%0,%0,0xff\\t#ashlqi3\";
}")
(define_insn "ashlhi3"
[(set (match_operand:HI 0 "general_operand" "=r")
(ashift:HI (match_operand:HI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{operands[2]=gen_rtx(CONST_INT,VOIDmode,(XINT(operands[2],0))& 0x1f);
output_asm_insn( \"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0\",
operands);
}
else
output_asm_insn( \"sll\\t%0,%1,%2\\t#ashlhi3\\t (%1<<%2) -> %0 (asm syntax)\",
operands);
return \"sll\\t%0,%0,0x10\;sra\\t%0,%0,0x10\\t#ashlhi3\";
}")
(define_insn "ashlsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(ashift:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{operands[2]=gen_rtx(CONST_INT,VOIDmode,(XINT(operands[2],0))& 0x1f);
return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0\";
}
return \"sll\\t%0,%1,%2\\t#ashlsi3\\t (%1<<%2) -> %0 (asm syntax)\";
}")
(define_insn "ashrsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(ashiftrt:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "ri")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{operands[2]=gen_rtx(CONST_INT,VOIDmode,(XINT(operands[2],0))& 0x1f);
return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0\";
}
return \"sra\\t%0,%1,%2\\t#ashrsi3\\t (%1>>%2) -> %0 (asm syntax for srav)\";
}")
(define_insn "lshrsi3"
[(set (match_operand:SI 0 "general_operand" "=r")
(lshiftrt:SI (match_operand:SI 1 "general_operand" "r")
(match_operand:SI 2 "arith32_operand" "rn")))]
""
"*
{
if (GET_CODE (operands[2]) == CONST_INT)
{operands[2]=gen_rtx(CONST_INT,VOIDmode,(XINT(operands[2],0))& 0x1f);
return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0\";
}
return \"srl\\t%0,%1,%2\\t#lshrsi3\\t (%1>>%2) -> %0 (asm syntax)\";
}")
(define_insn "negsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(neg:SI (match_operand:SI 1 "arith_operand" "r")))]
""
"sub%u\\t%0,$0,%1\\t#negsi2")
(define_insn "negdf2"
[(set (match_operand:DF 0 "general_operand" "=f")
(neg:DF (match_operand:DF 1 "general_operand" "f")))]
""
"neg.d\\t%0,%1\\t#negdf2")
(define_insn "negsf2"
[(set (match_operand:SF 0 "general_operand" "=f")
(neg:SF (match_operand:SF 1 "general_operand" "f")))]
""
"neg.s\\t%0,%1\\t#negsf2")
(define_insn "one_cmplsi2"
[(set (match_operand:SI 0 "general_operand" "=r")
(not:SI (match_operand:SI 1 "arith_operand" "r")))]
""
"nor\\t%0,$0,%1\\t#one_cmplsi2")
(define_insn "one_cmplhi2"
[(set (match_operand:HI 0 "general_operand" "=r")
(not:HI (match_operand:HI 1 "arith_operand" "r")))]
""
"nor\\t%0,$0,%1\\t#one_cmplhi2")
(define_insn "one_cmplqi2"
[(set (match_operand:QI 0 "general_operand" "=r")
(not:QI (match_operand:QI 1 "arith_operand" "r")))]
""
"nor\\t%0,$0,%1\\t#one_cmplqi2")
\f
;;
;; ....................
;;
;; BRANCHES
;;
;; ....................
;;- MERGED CMPSI + BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"beq \\t%0,%1,%l2\\t#beq MIPS primitive insn")
;;- MERGED CMPSI + INV BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"beq \\t%0,%1,%l2\\t#beq inverted primitive insn")
;;- MERGED CMPSI + BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bne \\t%0,%1,%l2\\t#bne MIPS primitive insn")
;;- MERGED CMPSI + INV BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bne \\t%0,%1,%l2\\t#bne inverted primitive insn")
;;- MERGED CMPSI + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bgt \\t%0,%1,%l2\\t#bgt MIPS composite insn")
;;- MERGED CMPSI + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bgt \\t%0,%1,%l2\\t#bgt inverted composite insn")
;;- MERGED CMPSI + BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"blt \\t%0,%1,%l2\\t#blt MIPS composite insn")
;;- MERGED CMPSI + INV BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"blt \\t%0,%1,%l2\\t#blt inverted composite insn")
;;- MERGED CMPSI + BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bge \\t%0,%1,%l2\\t#bge composite insn")
;;- MERGED CMPSI + INV BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bge \\t%0,%1,%l2\\t#bge inverted composite insn")
;;- MERGED CMPSI + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"ble \\t%0,%1,%l2\\t#ble composite insn")
;;- MERGED CMPSI + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"ble \\t%0,%1,%l2\\t#ble inverted composite insn")
\f
;;- MERGED CMPSI + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bgtu \\t%0,%1,%l2\\t#bgtu MIPS composite insn")
;;- MERGED CMPSI + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bgtu \\t%0,%1,%l2\\t#bgtu inverted composite insn")
;;- MERGED CMPSI + INV BLTU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"blt \\t%0,%1,%l2\\t#blt inverted composite insn")
;;- MERGED CMPSI + BGEU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bgeu \\t%0,%1,%l2\\t#bgeu composite insn")
;;- MERGED CMPSI + INV BGEU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bgeu \\t%0,%1,%l2\\t#bgeu inverted composite insn")
;;- MERGED CMPSI + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bleu \\t%0,%1,%l2\\t#bleu composite insn")
;;- MERGED CMPSI + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bleu \\t%0,%1,%l2\\t#bleu inverted composite insn")
;;- MERGED CMPSI + BLTU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"bltu \\t%0,%1,%l2\\t#bltu MIPS composite insn")
;;- MERGED CMPSI + INV BLTU
(define_peephole
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))
(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"bltu \\t%0,%1,%l2\\t#bltu inverted composite insn")
\f
;;- FLOATING POINT CASES
;;- --------------------
;;- MERGED CMPSF + BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ")
;;- MERGED CMPSF + INV BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + BEQ \;bc1t\\t%l2\\t# Merged CMPSF + BEQ ")
;;- MERGED CMPSF + BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + BNE \;bc1f\\t%l2\\t# Merged CMPSF + BNE ")
;;- MERGED CMPSF + INV BNE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.eq.s\\t%0,%1\\t# Merged CMPSF + I.BNE \;bc1f\\t%l2\\t# Merged CMPSF +I.BNE ")
;;- MERGED CMPSF + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.le.s\\t%1,%0\\t# Merged CMPSF + BGT \;bc1f\\t%l2\\t# Merged CMPSF + BGT ")
;;- MERGED CMPSF + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + I.BGT \;bc1f\\t%l2\\t# Merged CMPSF +I. BGT ")
;;- MERGED CMPSF + BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF + BLT \;bc1t\\t%l2\\t# Merged CMPSF + BLT ")
;;- MERGED CMPSF + INV BLT
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF + I.BLT \;bc1t\\t%l2\\t# Merged CMPSF + I.BLT ")
;;- MERGED CMPSF + BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF + BGE \;bc1f\\t%l2\\t# Merged CMPSF + BGE")
;;- MERGED CMPSF + INV BGE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.lt.s\\t%0,%1\\t# Merged CMPSF +INV BGE \;bc1f\\t%l2\\t# Merged CMPSF +INV BGE ")
;;- MERGED CMPSF + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + BLE \;bc1t\\t%l2\\t# Merged CMPSF + BLE ")
;;- MERGED CMPSF + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.le.s\\t%0,%1\\t# Merged CMPSF + INV BLE \;bc1t\\t%l2\\t# Merged CMPSF +I. BLE")
;;- DOUBLE FLOATING POINT CASES
;;- --------------------
;;- MERGED CMPDF + BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF + BEQ \;bc1t\\t%l2\\t# Merged CMPDF + BEQ ")
;;- MERGED CMPDF + INV BEQ
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF + I.BEQ \;bc1t\\t%l2\\t# Merged CMPDF +I. BEQ ")
;;- MERGED CMPDF + BNE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF + BNE \;bc1f\\t%l2\\t# Merged CMPDF + BNE ")
;;- MERGED CMPDF + INV BNE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.eq.d\\t%0,%1\\t# Merged CMPDF +I. BNE \;bc1f\\t%l2\\t# Merged CMPDF +I BNE")
;;- MERGED CMPDF + BGT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF + BGT \;bc1f\\t%l2\\t# Merged CMPDF + BGT ")
;;- MERGED CMPDF + INV BGT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF + I. BGT \;bc1f\\t%l2\\t# Merged CMPDF + I. BGT ")
;;- MERGED CMPDF + BLT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF + BLT \;bc1t\\t%l2\\t# Merged CMPDF + BLT ")
;;- MERGED CMPDF + INV BLT
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF + I.BLT \;bc1t\\t%l2\\t# Merged CMPDF + I.BLT")
;;- MERGED CMPDF + BGE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF + BGE \;bc1f\\t%l2\\t# Merged CMPDF + BGE")
;;- MERGED CMPDF + INV BGE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.lt.d\\t%0,%1\\t# Merged CMPDF +I. BGE \;bc1f\\t%l2\\t# Merged CMPDF +I. BGE")
;;- MERGED CMPDF + BLE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF + BLE \;bc1t\\t%l2\\t# Merged CMPDF + BLE ")
;;- MERGED CMPDF + INV BLE
(define_peephole
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))
(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 2 "" ""))
))
]
""
"c.le.d\\t%0,%1\\t# Merged CMPDF +I. BLE \;bc1t\\t%l2\\t# Merged CMPDF + I.BLE ")
\f
;;
;; ....................
;;
;; COMPARISONS
;;
;; ....................
;;- Order is significant here
;;- because there are untyped
;;- comparisons generated by
;;- the optimizer
;;- (set (cc0)
;;- (compare (const_int 2)
;;- (const_int 1)))
(define_insn "cmpsi"
[(set (cc0)
(compare (match_operand:SI 0 "general_operand" "r")
(match_operand:SI 1 "general_operand" "r")))]
""
"*
compare_collect(SImode,operands[0],operands[1]);
return \" #\\tcmpsi\\t%0,%1\";
")
(define_insn "cmphi"
[(set (cc0)
(compare (match_operand:HI 0 "general_operand" "r")
(match_operand:HI 1 "general_operand" "r")))]
""
"*
compare_collect(HImode,operands[0],operands[1]);
return \" #\\tcmphi\\t%0,%1\";
")
(define_insn "cmpqi"
[(set (cc0)
(compare (match_operand:QI 0 "general_operand" "r")
(match_operand:QI 1 "general_operand" "r")))]
""
"*
compare_collect(QImode,operands[0],operands[1]);
return \" #\\tcmpqi\\t%0,%1\";
")
(define_insn "cmpdf"
[(set (cc0)
(compare (match_operand:DF 0 "general_operand" "f")
(match_operand:DF 1 "general_operand" "f")))]
""
"*
compare_collect(DFmode,operands[0],operands[1]);
return \" #\\tcmpdf\\t%0,%1\" ;
")
(define_insn "cmpsf"
[(set (cc0)
(compare (match_operand:SF 0 "general_operand" "f")
(match_operand:SF 1 "general_operand" "f")))]
""
"*
compare_collect(SFmode,operands[0],operands[1]);
return \" #\\tcmpsf\\t%0,%1\" ;
")
(define_insn ""
[(set (cc0)
(match_operand:QI 0 "general_operand" "r"))
]
""
"*
compare_collect(QImode,operands[0],gen_rtx(REG,QImode,0));
return \" #\\t(set (cc0)\\t%0)\";
")
(define_insn ""
[(set (cc0)
(match_operand:HI 0 "general_operand" "r"))
]
""
"*
compare_collect(HImode,operands[0],gen_rtx(REG,HImode,0));
return \" #\\t(set (cc0)\\t%0)\";
"
)
(define_insn ""
[(set (cc0)
(match_operand:SI 0 "general_operand" "r"))
]
""
"*
compare_collect(SImode,operands[0],gen_rtx(REG,SImode,0));
return \" #\\t(set (cc0)\\t%0)\";
"
)
\f
;;
;; ....................
;;
;; BRANCHES
;;
;; ....................
\f
(define_insn "jump"
[(set (pc)
(label_ref (match_operand 0 "" "")))]
""
"*
if (GET_CODE(operands[0]) == REG)
return \"j\\t%%0\\t#jump %l0 (jr not asm syntax)\";
else return \"j\\t%l0\\t#jump %l0\";
")
(define_insn "beq"
[(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.eq.d\\t%0,%1\\t#beq\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.eq.s\\t%0,%1\\t#beq\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#beq\", br_ops);
}
else { output_asm_insn(\"beq\\t%0,%1,%2\\t#beq\", br_ops);
}
return \"\";
}
")
(define_insn "bne"
[(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.eq.d\\t%0,%1\\t#bne\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bne\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.eq.s\\t%0,%1\\t#bne\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bne\", br_ops);
}
else { output_asm_insn(\"bne\\t%0,%1,%2\\t#bne\", br_ops);
}
return \"\";
}
")
(define_insn "bgt"
[(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#bgt branch %0 > %1\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgt\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#bgt branch %0 > %1\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgt\", br_ops);
}
else { output_asm_insn(\"bgt\\t%0,%1,%2\\t#bgt\", br_ops);
}
return \"\";
}
")
(define_insn "blt"
[(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#blt\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#blt\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#blt\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#blt\", br_ops);
}
else { output_asm_insn(\"blt\\t%0,%1,%2\\t#blt\", br_ops);
}
return \" #\\tblt \\t%l0\\t#blt\";
}
")
\f
(define_insn "bgtu"
[(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#bgtu\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgtu\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#bgtu\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgtu\", br_ops);
}
else { output_asm_insn(\"bgtu\\t%0,%1,%2\\t#bgtu\", br_ops);
}
return \" #\\tbgtu \\t%l0\\t#bgtu\";
}
")
(define_insn "bltu"
[(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#bltu\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#bltu\", br_ops);
}
else { output_asm_insn(\"bltu\\t%0,%1,%2\\t#bltu\", br_ops);
}
return \"\";
}
")
(define_insn "bge"
[(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bge\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bge\", br_ops);
}
else { output_asm_insn(\"bge\\t%0,%1,%2\\t#bge\", br_ops);
}
return \"\";
}
")
(define_insn "bgeu"
[(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#bgeu\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgeu\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#bgeu\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgeu\", br_ops);
}
else { output_asm_insn(\"bgeu\\t%0,%1,%2\\t#bgeu\", br_ops);
}
return \"\";
}
")
(define_insn "ble"
[(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#ble\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#ble\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#ble\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#ble\", br_ops);
}
else { output_asm_insn(\"ble\\t%0,%1,%2\\t#ble\", br_ops);
}
return \"\";
}
")
(define_insn "bleu"
[(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#ble\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#ble\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#ble\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#ble\", br_ops);
}
else { output_asm_insn(\"bleu\\t%0,%1,%2\\t#bleu\", br_ops);
}
return \" #\\tbleu \\t%l0\\t#bleu\";
}
")
\f
(define_insn ""
[(set (pc)
(if_then_else (ne (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.eq.d\\t%0,%1\\t#beq\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.eq.s\\t%0,%1\\t#beq\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#beq\", br_ops);
}
else { output_asm_insn(\"beq\\t%0,%1,%2\\t#beq Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.eq.d\\t%0,%1\\t#bne\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bne\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.eq.s\\t%0,%1\\t#bne\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#beq\", br_ops);
}
else { output_asm_insn(\"bne\\t%0,%1,%2\\t#bne Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (le (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#beq\", br_ops);
}
else { output_asm_insn(\"bgt\\t%0,%1,%2\\t#bgt Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (leu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#bgt\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#beq\", br_ops);
}
else { output_asm_insn(\"bgtu\\t%0,%1,%2\\t#bgtu Inv.\", br_ops);
}
return \" #\\tbgtu \\t%l0\\t#bgtu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#blt\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#beq\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#blt\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#beq\", br_ops);
}
else { output_asm_insn(\"blt\\t%0,%1,%2\\t#blt Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (geu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#bltu\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#bltu\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#bltu\", br_ops);
}
else { output_asm_insn(\"bltu\\t%0,%1,%2\\t#bltu Inv.\", br_ops);
}
return \" #\\tbltu \\t%l0\\t#bltu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bge (DF) Inv.\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bge (SF) Inv.\", br_ops);
}
else { output_asm_insn(\"bge\\t%0,%1,%2\\t#bge Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (ltu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.lt.d\\t%0,%1\\t#bge\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgeu (DF) Inv.\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.lt.s\\t%0,%1\\t#bge\", br_ops);
output_asm_insn(\"bc1f\\t%2\\t#bgeu (SF )Inv.\", br_ops);
}
else { output_asm_insn(\"bgeu\\t%0,%1,%2\\t#bgeu Inv.\", br_ops);
}
return \" #\\tbgeu \\t%l0\\t#bgeu\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (gt (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#ble\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#ble\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#ble\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#ble\", br_ops);
}
else { output_asm_insn(\"ble\\t%0,%1,%2\\t#ble Inv.\", br_ops);
}
return \"\";
}
")
(define_insn ""
[(set (pc)
(if_then_else (gtu (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))
))]
""
"*
{rtx br_ops[3];
enum machine_mode mode;
compare_restore(br_ops, &mode, insn);
br_ops[2] = operands[0];
if ( mode == DFmode)
{output_asm_insn(\"c.le.d\\t%0,%1\\t#bleu\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#bleu\", br_ops);
}
else if (mode == SFmode)
{ output_asm_insn(\"c.le.s\\t%0,%1\\t#bleu\", br_ops);
output_asm_insn(\"bc1t\\t%2\\t#bleu\", br_ops);
}
else { output_asm_insn(\"bleu\\t%0,%1,%2\\t#bleu Inv.\", br_ops);
}
return \"\";
}
")
(define_insn "tablejump"
[(set (pc)
(match_operand:SI 0 "general_operand" "r"))
(use (label_ref (match_operand 1 "" "")))
]
""
"j\\t%0\\t# tablejump, label %l1\\t(jr not asm syntax)")
\f
;;
;; ....................
;;
;; LINKAGE
;;
;; ....................
(define_insn "call"
[(call (match_operand 0 "general_operand" "g")
(match_operand 1 "general_operand" "g"))
(clobber (reg:SI 31))]
""
"* if(GET_CODE(XEXP(operands[0],0)) == SYMBOL_REF)
return \"jal\\t%0\\t# call with %1 arguments\";
else { operands[0] = XEXP(operands[0],0);
return \"jal\\t$31,%0\\t# call with %1 arguments (reg)\";
}
" )
(define_expand "call_value"
[(set (match_operand 0 "" "rf")
(call (match_operand:SI 1 "memory_operand" "m")
(match_operand 2 "" "i")))
(clobber (reg:SI 31))]
;; operand 3 is next_arg_register
""
"
{
rtx fn_rtx, nregs_rtx;
rtvec vec;
fn_rtx = operands[1];
nregs_rtx = const0_rtx;
vec = gen_rtvec (2,
gen_rtx (SET, VOIDmode, operands[0],
gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx)),
gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, SImode, 31)));
emit_call_insn (gen_rtx (PARALLEL, VOIDmode, vec));
DONE;
}")
(define_insn ""
[(set (match_operand 0 "general_operand" "g,f")
(call (match_operand 1 "general_operand" "g,g")
(match_operand 2 "general_operand" "g,g")))
(clobber (match_operand 3 "general_operand" "g,g"))]
""
"* if(GET_CODE(XEXP(operands[1],0)) == SYMBOL_REF)
return \"jal\\t%1\\t# call %1 regle 2-call (VOIDmode)\";
else { operands[1] = XEXP(operands[1],0);
return \"jal\\t$31,%1\\t# call %1 regle 2-call (VOIDmode,reg)\";
}
")
;;- RETURN == BRANCH TO EPILOGUE
;;-- (define_insn "return"
;;-- [(return)
;;-- (use (reg:SI 31))]
;;-- ""
;;-- "#\\t\\t ---- return")
\f
;;
;;- Local variables:
;;- mode:emacs-lisp
;;- comment-start: ";;- "
;;- eval: (set-syntax-table (copy-sequence (syntax-table)))
;;- eval: (modify-syntax-entry ?[ "(]")
;;- eval: (modify-syntax-entry ?] ")[")
;;- eval: (modify-syntax-entry ?{ "(}")
;;- eval: (modify-syntax-entry ?} "){")
;;- End: