diff options
Diffstat (limited to 'gcc/config/tahoe/tahoe.md')
-rw-r--r-- | gcc/config/tahoe/tahoe.md | 2113 |
1 files changed, 0 insertions, 2113 deletions
diff --git a/gcc/config/tahoe/tahoe.md b/gcc/config/tahoe/tahoe.md deleted file mode 100644 index 101d69f6822..00000000000 --- a/gcc/config/tahoe/tahoe.md +++ /dev/null @@ -1,2113 +0,0 @@ -;; Machine description for GNU compiler, Tahoe version -;; Copyright (C) 1989, 1994, 1996 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, 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - - -; File: tahoe.md -; -; Original port made at the University of Buffalo by Devon Bowen, -; Dale Wiles and Kevin Zachmann. -; -; Piet van Oostrum (piet@cs.ruu.nl) made changes for HCX/UX, fixed -; some bugs and made some improvements (hopefully). -; -; Mail bugs reports or fixes to: gcc@cs.buffalo.edu - - -; movdi must call the output_move_double routine to move it around since -; the tahoe doesn't efficiently support 8 bit moves. - -(define_insn "movdi" - [(set (match_operand:DI 0 "general_operand" "=g") - (match_operand:DI 1 "general_operand" "g"))] - "" - "* -{ - CC_STATUS_INIT; - return output_move_double (operands); -}") - - -; the trick in the movsi is accessing the contents of the sp register. The -; tahoe doesn't allow you to access it directly so you have to access the -; address of the top of the stack instead. - -(define_insn "movsi" - [(set (match_operand:SI 0 "general_operand" "=g") - (match_operand:SI 1 "general_operand" "g"))] - "" - "* -{ - rtx link; - if (operands[1] == const1_rtx - && (link = find_reg_note (insn, REG_WAS_0, 0)) - && ! INSN_DELETED_P (XEXP (link, 0)) - && GET_CODE (XEXP (link, 0)) != NOTE - && no_labels_between_p (XEXP (link, 0), insn) - /* Make sure the reg hasn't been clobbered. */ - && ! reg_set_between_p (operands[0], XEXP (link, 0), insn)) - return \"incl %0\"; - if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST) - { - if (push_operand (operands[0], SImode)) - return \"pushab %a1\"; - return \"movab %a1,%0\"; - } - if (operands[1] == const0_rtx) - return \"clrl %0\"; - if (push_operand (operands[0], SImode)) - return \"pushl %1\"; - if (GET_CODE(operands[1]) == REG && REGNO(operands[1]) == 14) - return \"moval (sp),%0\"; - return \"movl %1,%0\"; -}") - - -(define_insn "movhi" - [(set (match_operand:HI 0 "general_operand" "=g") - (match_operand:HI 1 "general_operand" "g"))] - "" - "* -{ - rtx link; - if (operands[1] == const1_rtx - && (link = find_reg_note (insn, REG_WAS_0, 0)) - && ! INSN_DELETED_P (XEXP (link, 0)) - && GET_CODE (XEXP (link, 0)) != NOTE - && no_labels_between_p (XEXP (link, 0), insn) - /* Make sure the reg hasn't been clobbered. */ - && ! reg_set_between_p (operands[0], XEXP (link, 0), insn)) - return \"incw %0\"; - if (operands[1] == const0_rtx) - return \"clrw %0\"; - return \"movw %1,%0\"; -}") - - -(define_insn "movqi" - [(set (match_operand:QI 0 "general_operand" "=g") - (match_operand:QI 1 "general_operand" "g"))] - "" - "* -{ - if (operands[1] == const0_rtx) - return \"clrb %0\"; - return \"movb %1,%0\"; -}") - - -; movsf has three cases since they can move from one place to another -; or to/from the fpp and since different instructions are needed for -; each case. The fpp related instructions don't set the flags properly. - -(define_insn "movsf" - [(set (match_operand:SF 0 "general_operand" "=g,=a,=g") - (match_operand:SF 1 "general_operand" "g,g,a"))] - "" - "* -{ - CC_STATUS_INIT; - switch (which_alternative) - { - case 0: return \"movl %1,%0\"; - case 1: return \"ldf %1\"; - case 2: return \"stf %0\"; - } -}") - - -; movdf has a number of different cases. If it's going to or from -; the fpp, use the special instructions to do it. If not, use the -; output_move_double function. - -(define_insn "movdf" - [(set (match_operand:DF 0 "general_operand" "=a,=g,?=g") - (match_operand:DF 1 "general_operand" "g,a,g"))] - "" - "* -{ - CC_STATUS_INIT; - switch (which_alternative) - { - case 0: - return \"ldd %1\"; - case 1: - if (push_operand (operands[0], DFmode)) - return \"pushd\"; - else - return \"std %0\"; - case 2: - return output_move_double (operands); - } -}") - - -;======================================================================== -; The tahoe has the following semantics for byte (and similar for word) -; operands: if the operand is a register or immediate, it takes the full 32 -; bit operand, if the operand is memory, it sign-extends the byte. The -; operation is performed on the 32 bit values. If the destination is a -; register, the full 32 bit result is stored, if the destination is memory, -; of course only the low part is stored. The condition code is based on the -; 32 bit operation. Only on the movz instructions the byte from memory is -; zero-extended rather than sign-extended. - -; This means that for arithmetic instructions we can use addb etc. to -; perform a long add from a signed byte from memory to a register. Of -; course this would also work for logical operations, but that doesn't seem -; very useful. - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")) - (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "addb3 %1,%2,%0") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (match_operand:SI 1 "nonmemory_operand" "%ri") - (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"addb2 %2,%0\"; - return \"addb3 %1,%2,%0\"; -}") - -; We can also consider the result to be a half integer - -(define_insn "" - [(set (match_operand:HI 0 "register_operand" "=r") - (plus:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")) - (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "addb3 %1,%2,%0") - -(define_insn "" - [(set (match_operand:HI 0 "register_operand" "=r") - (plus:HI (match_operand:HI 1 "nonmemory_operand" "%ri") - (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"addb2 %2,%0\"; - return \"addb3 %1,%2,%0\"; -}") - -; The same applies to words (HI) - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")) - (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))] - "" - "addw3 %1,%2,%0") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (match_operand:SI 1 "nonmemory_operand" "%ri") - (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"addw2 %2,%0\"; - return \"addw3 %1,%2,%0\"; -}") - -; ======================= Now for subtract ============================== - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (minus:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")) - (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "subb3 %2,%1,%0") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (minus:SI (match_operand:SI 1 "nonmemory_operand" "ri") - (sign_extend:SI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"subb2 %2,%0\"; - return \"subb3 %2,%1,%0\"; -}") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (minus:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")) - (match_operand:SI 2 "nonmemory_operand" "ri")))] - "" - "subb3 %2,%1,%0") - -; We can also consider the result to be a half integer - -(define_insn "" - [(set (match_operand:HI 0 "register_operand" "=r") - (minus:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")) - (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "subb3 %2,%1,%0") - -(define_insn "" - [(set (match_operand:HI 0 "register_operand" "=r") - (minus:HI (match_operand:HI 1 "nonmemory_operand" "%ri") - (sign_extend:HI (match_operand:QI 2 "memory_operand" "m"))))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"subb2 %2,%0\"; - return \"subb3 %2,%1,%0\"; -}") - -(define_insn "" - [(set (match_operand:HI 0 "register_operand" "=r") - (minus:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")) - (match_operand:HI 2 "nonmemory_operand" "ri")))] - "" - "subb3 %2,%1,%0") - -; The same applies to words (HI) - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (minus:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")) - (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))] - "" - "subw3 %2,%1,%0") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (minus:SI (match_operand:SI 1 "nonmemory_operand" "ri") - (sign_extend:SI (match_operand:HI 2 "memory_operand" "m"))))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"subw2 %2,%0\"; - return \"subw3 %2,%1,%0\"; -}") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (minus:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")) - (match_operand:SI 2 "nonmemory_operand" "ri")))] - "" - "subw3 %2,%1,%0") - -; ======================= Now for neg ============================== - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (neg:SI (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))] - "" - "mnegb %1,%0") - -(define_insn "" - [(set (match_operand:HI 0 "register_operand" "=r") - (neg:HI (sign_extend:HI (match_operand:QI 1 "memory_operand" "m"))))] - "" - "mnegb %1,%0") - -(define_insn "" - [(set (match_operand:SI 0 "register_operand" "=r") - (neg:SI (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))] - "" - "mnegw %1,%0") - -;======================================================================== - - -(define_insn "addsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (plus:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - { - if (operands[2] == const1_rtx) - return \"incl %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && INTVAL (operands[2]) == -1) - return \"decl %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && (unsigned) (- INTVAL (operands[2])) < 64) - return \"subl2 $%n2,%0\"; - return \"addl2 %2,%0\"; - } - if (rtx_equal_p (operands[0], operands[2])) - return \"addl2 %1,%0\"; - if (GET_CODE (operands[2]) == CONST_INT - && GET_CODE (operands[1]) == REG) - { - if (push_operand (operands[0], SImode)) - return \"pushab %c2(%1)\"; - return \"movab %c2(%1),%0\"; - } - if (GET_CODE (operands[2]) == CONST_INT - && (unsigned) (- INTVAL (operands[2])) < 64) - return \"subl3 $%n2,%1,%0\"; - return \"addl3 %1,%2,%0\"; -}") - - -(define_insn "addhi3" - [(set (match_operand:HI 0 "general_operand" "=g") - (plus:HI (match_operand:HI 1 "general_operand" "g") - (match_operand:HI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - { - if (operands[2] == const1_rtx) - return \"incw %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && INTVAL (operands[2]) == -1) - return \"decw %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && (unsigned) (- INTVAL (operands[2])) < 64) - return \"subw2 $%n2,%0\"; - return \"addw2 %2,%0\"; - } - if (rtx_equal_p (operands[0], operands[2])) - return \"addw2 %1,%0\"; - if (GET_CODE (operands[2]) == CONST_INT - && (unsigned) (- INTVAL (operands[2])) < 64) - return \"subw3 $%n2,%1,%0\"; - return \"addw3 %1,%2,%0\"; -}") - - -(define_insn "addqi3" - [(set (match_operand:QI 0 "general_operand" "=g") - (plus:QI (match_operand:QI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - { - if (operands[2] == const1_rtx) - return \"incb %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && INTVAL (operands[2]) == -1) - return \"decb %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && (unsigned) (- INTVAL (operands[2])) < 64) - return \"subb2 $%n2,%0\"; - return \"addb2 %2,%0\"; - } - if (rtx_equal_p (operands[0], operands[2])) - return \"addb2 %1,%0\"; - if (GET_CODE (operands[2]) == CONST_INT - && (unsigned) (- INTVAL (operands[2])) < 64) - return \"subb3 $%n2,%1,%0\"; - return \"addb3 %1,%2,%0\"; -}") - -; addsf3 can only add into the fpp register since the fpp is treated -; as a separate unit in the machine. It also doesn't set the flags at -; all. - -(define_insn "addsf3" - [(set (match_operand:SF 0 "register_operand" "=a") - (plus:SF (match_operand:SF 1 "register_operand" "%0") - (match_operand:SF 2 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"addf %2\"; -}") - - -; adddf3 can only add into the fpp reg since the fpp is treated as a -; separate entity. Doubles can only be read from a register or memory -; since a double is not an immediate mode. Flags are not set by this -; instruction. - -(define_insn "adddf3" - [(set (match_operand:DF 0 "register_operand" "=a") - (plus:DF (match_operand:DF 1 "register_operand" "%0") - (match_operand:DF 2 "general_operand" "rm")))] - "" - "* -{ - CC_STATUS_INIT; - return \"addd %2\"; -}") - - -; Subtraction from the sp (needed by the built in alloc function) needs -; to be different since the sp cannot be directly read on the tahoe. -; If it's a simple constant, you just use displacement. Otherwise, you -; push the sp, and then do the subtraction off the stack. - -(define_insn "subsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (minus:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - { - if (operands[2] == const1_rtx) - return \"decl %0\"; - if (GET_CODE(operands[0]) == REG && REGNO(operands[0]) == 14) - { - if (GET_CODE(operands[2]) == CONST_INT) - return \"movab %n2(sp),sp\"; - else - return \"pushab (sp)\;subl3 %2,(sp),sp\"; - } - return \"subl2 %2,%0\"; - } - if (rtx_equal_p (operands[1], operands[2])) - return \"clrl %0\"; - return \"subl3 %2,%1,%0\"; -}") - - -(define_insn "subhi3" - [(set (match_operand:HI 0 "general_operand" "=g") - (minus:HI (match_operand:HI 1 "general_operand" "g") - (match_operand:HI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - { - if (operands[2] == const1_rtx) - return \"decw %0\"; - return \"subw2 %2,%0\"; - } - if (rtx_equal_p (operands[1], operands[2])) - return \"clrw %0\"; - return \"subw3 %2,%1,%0\"; -}") - - -(define_insn "subqi3" - [(set (match_operand:QI 0 "general_operand" "=g") - (minus:QI (match_operand:QI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - { - if (operands[2] == const1_rtx) - return \"decb %0\"; - return \"subb2 %2,%0\"; - } - if (rtx_equal_p (operands[1], operands[2])) - return \"clrb %0\"; - return \"subb3 %2,%1,%0\"; -}") - - -; subsf3 can only subtract into the fpp accumulator due to the way -; the fpp reg is limited by the instruction set. This also doesn't -; bother setting up flags. - -(define_insn "subsf3" - [(set (match_operand:SF 0 "register_operand" "=a") - (minus:SF (match_operand:SF 1 "register_operand" "0") - (match_operand:SF 2 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"subf %2\"; -}") - - -; subdf3 is set up to subtract into the fpp reg due to limitations -; of the fpp instruction set. Doubles can not be immediate. This -; instruction does not set the flags. - -(define_insn "subdf3" - [(set (match_operand:DF 0 "register_operand" "=a") - (minus:DF (match_operand:DF 1 "register_operand" "0") - (match_operand:DF 2 "general_operand" "rm")))] - "" - "* -{ - CC_STATUS_INIT; - return \"subd %2\"; -}") - - -(define_insn "mulsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (mult:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"mull2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"mull2 %1,%0\"; - return \"mull3 %1,%2,%0\"; -}") - - -; mulsf3 can only multiply into the fpp accumulator due to limitations -; of the fpp. It also does not set the condition codes properly. - -(define_insn "mulsf3" - [(set (match_operand:SF 0 "register_operand" "=a") - (mult:SF (match_operand:SF 1 "register_operand" "%0") - (match_operand:SF 2 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"mulf %2\"; -}") - - -; muldf3 can only multiply into the fpp reg since the fpp is limited -; from the rest. Doubles may not be immediate mode. This does not set -; the flags like gcc would expect. - -(define_insn "muldf3" - [(set (match_operand:DF 0 "register_operand" "=a") - (mult:DF (match_operand:DF 1 "register_operand" "%0") - (match_operand:DF 2 "general_operand" "rm")))] - "" - "* -{ - CC_STATUS_INIT; - return \"muld %2\"; -}") - - - -(define_insn "divsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (div:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[1], operands[2])) - return \"movl $1,%0\"; - if (operands[1] == const0_rtx) - return \"clrl %0\"; - if (GET_CODE (operands[2]) == CONST_INT - && INTVAL (operands[2]) == -1) - return \"mnegl %1,%0\"; - if (rtx_equal_p (operands[0], operands[1])) - return \"divl2 %2,%0\"; - return \"divl3 %2,%1,%0\"; -}") - - -; divsf3 must divide into the fpp accumulator. Flags are not set by -; this instruction, so they are cleared. - -(define_insn "divsf3" - [(set (match_operand:SF 0 "register_operand" "=a") - (div:SF (match_operand:SF 1 "register_operand" "0") - (match_operand:SF 2 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"divf %2\"; -}") - - -; divdf3 also must divide into the fpp reg so optimization isn't -; possible. Note that doubles cannot be immediate. The flags here -; are not set correctly so they must be ignored. - -(define_insn "divdf3" - [(set (match_operand:DF 0 "register_operand" "=a") - (div:DF (match_operand:DF 1 "register_operand" "0") - (match_operand:DF 2 "general_operand" "rm")))] - "" - "* -{ - CC_STATUS_INIT; - return \"divd %2\"; -}") - - - -(define_insn "andsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (and:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"andl2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"andl2 %1,%0\"; - return \"andl3 %2,%1,%0\"; -}") - - - -(define_insn "andhi3" - [(set (match_operand:HI 0 "general_operand" "=g") - (and:HI (match_operand:HI 1 "general_operand" "g") - (match_operand:HI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"andw2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"andw2 %1,%0\"; - return \"andw3 %2,%1,%0\"; -}") - - -(define_insn "andqi3" - [(set (match_operand:QI 0 "general_operand" "=g") - (and:QI (match_operand:QI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"andb2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"andb2 %1,%0\"; - return \"andb3 %2,%1,%0\"; -}") - - -(define_insn "iorsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (ior:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"orl2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"orl2 %1,%0\"; - return \"orl3 %2,%1,%0\"; -}") - - - -(define_insn "iorhi3" - [(set (match_operand:HI 0 "general_operand" "=g") - (ior:HI (match_operand:HI 1 "general_operand" "g") - (match_operand:HI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"orw2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"orw2 %1,%0\"; - return \"orw3 %2,%1,%0\"; -}") - - - -(define_insn "iorqi3" - [(set (match_operand:QI 0 "general_operand" "=g") - (ior:QI (match_operand:QI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"orb2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"orb2 %1,%0\"; - return \"orb3 %2,%1,%0\"; -}") - - -(define_insn "xorsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (xor:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:SI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"xorl2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"xorl2 %1,%0\"; - return \"xorl3 %2,%1,%0\"; -}") - - -(define_insn "xorhi3" - [(set (match_operand:HI 0 "general_operand" "=g") - (xor:HI (match_operand:HI 1 "general_operand" "g") - (match_operand:HI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"xorw2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"xorw2 %1,%0\"; - return \"xorw3 %2,%1,%0\"; -}") - - -(define_insn "xorqi3" - [(set (match_operand:QI 0 "general_operand" "=g") - (xor:QI (match_operand:QI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - if (rtx_equal_p (operands[0], operands[1])) - return \"xorb2 %2,%0\"; - if (rtx_equal_p (operands[0], operands[2])) - return \"xorb2 %1,%0\"; - return \"xorb3 %2,%1,%0\"; -}") - - -; shifts on the tahoe are expensive, try some magic first... - -(define_insn "ashlsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (ashift:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - if (GET_CODE(operands[2]) == REG) - return \"mull3 ___shtab[%2],%1,%0\"; - /* if (GET_CODE(operands[2]) == REG) - if (rtx_equal_p (operands[0], operands[1])) - return \"mull2 ___shtab[%2],%1\"; - else - return \"mull3 ___shtab[%2],%1,%0\"; */ - if (GET_CODE(operands[1]) == REG) - { - if (operands[2] == const1_rtx) - { - CC_STATUS_INIT; - return \"movaw 0[%1],%0\"; - } - if (GET_CODE(operands[2]) == CONST_INT && INTVAL(operands[2]) == 2) - { - CC_STATUS_INIT; - return \"moval 0[%1],%0\"; - } - } - if (GET_CODE(operands[2]) != CONST_INT || INTVAL(operands[2]) == 1) - return \"shal %2,%1,%0\"; - if (rtx_equal_p (operands[0], operands[1])) - return \"mull2 %s2,%1\"; - else - return \"mull3 %s2,%1,%0\"; -}") - - -(define_insn "ashrsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "shar %2,%1,%0") - - -; shifts are very expensive, try some magic first... - -(define_insn "lshrsi3" - [(set (match_operand:SI 0 "general_operand" "=g") - (lshiftrt:SI (match_operand:SI 1 "general_operand" "g") - (match_operand:QI 2 "general_operand" "g")))] - "" - "shrl %2,%1,%0") - - -(define_insn "negsi2" - [(set (match_operand:SI 0 "general_operand" "=g") - (neg:SI (match_operand:SI 1 "general_operand" "g")))] - "" - "mnegl %1,%0") - - -(define_insn "neghi2" - [(set (match_operand:HI 0 "general_operand" "=g") - (neg:HI (match_operand:HI 1 "general_operand" "g")))] - "" - "mnegw %1,%0") - - -(define_insn "negqi2" - [(set (match_operand:QI 0 "general_operand" "=g") - (neg:QI (match_operand:QI 1 "general_operand" "g")))] - "" - "mnegb %1,%0") - - -; negsf2 can only negate the value already in the fpp accumulator. -; The value remains in the fpp accumulator. No flags are set. - -(define_insn "negsf2" - [(set (match_operand:SF 0 "register_operand" "=a,=a") - (neg:SF (match_operand:SF 1 "register_operand" "a,g")))] - "" - "* -{ - CC_STATUS_INIT; - switch (which_alternative) - { - case 0: return \"negf\"; - case 1: return \"lnf %1\"; - } -}") - - -; negdf2 can only negate the value already in the fpp accumulator. -; The value remains in the fpp accumulator. No flags are set. - -(define_insn "negdf2" - [(set (match_operand:DF 0 "register_operand" "=a,=a") - (neg:DF (match_operand:DF 1 "register_operand" "a,g")))] - "" - "* -{ - CC_STATUS_INIT; - switch (which_alternative) - { - case 0: return \"negd\"; - case 1: return \"lnd %1\"; - } -}") - - -; sqrtsf2 tahoe can calculate the square root of a float in the -; fpp accumulator. The answer remains in the fpp accumulator. No -; flags are set by this function. - -(define_insn "sqrtsf2" - [(set (match_operand:SF 0 "register_operand" "=a") - (sqrt:SF (match_operand:SF 1 "register_operand" "0")))] - "" - "* -{ - CC_STATUS_INIT; - return \"sqrtf\"; -}") - - -; ffssi2 tahoe instruction gives one less than gcc desired result for -; any given input. So the increment is necessary here. - -(define_insn "ffssi2" - [(set (match_operand:SI 0 "general_operand" "=g") - (ffs:SI (match_operand:SI 1 "general_operand" "g")))] - "" - "* -{ - if (push_operand(operands[0], SImode)) - return \"ffs %1,%0\;incl (sp)\"; - return \"ffs %1,%0\;incl %0\"; -}") - - -(define_insn "one_cmplsi2" - [(set (match_operand:SI 0 "general_operand" "=g") - (not:SI (match_operand:SI 1 "general_operand" "g")))] - "" - "mcoml %1,%0") - - -(define_insn "one_cmplhi2" - [(set (match_operand:HI 0 "general_operand" "=g") - (not:HI (match_operand:HI 1 "general_operand" "g")))] - "" - "mcomw %1,%0") - - -(define_insn "one_cmplqi2" - [(set (match_operand:QI 0 "general_operand" "=g") - (not:QI (match_operand:QI 1 "general_operand" "g")))] - "" - "mcomb %1,%0") - - -; cmpsi works fine, but due to microcode problems, the tahoe doesn't -; properly compare hi's and qi's. Leaving them out seems to be acceptable -; to the compiler, so they were left out. Compares of the stack are -; possible, though. - -; There are optimized cases possible, however. These follow first. - -(define_insn "" - [(set (cc0) - (compare (sign_extend:SI (match_operand:HI 0 "memory_operand" "m")) - (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))] - "" - "cmpw %0,%1") - -(define_insn "" - [(set (cc0) - (compare (match_operand:SI 0 "nonmemory_operand" "ri") - (sign_extend:SI (match_operand:HI 1 "memory_operand" "m"))))] - "" - "cmpw %0,%1") - -(define_insn "" - [(set (cc0) - (compare (sign_extend:SI (match_operand:HI 0 "memory_operand" "m")) - (match_operand:SI 1 "nonmemory_operand" "ri")))] - "" - "cmpw %0,%1") - -; zero-extended compares give the same result as sign-extended compares, if -; the compare is unsigned. Just see: if both operands are <65536 they are the -; same in both cases. If both are >=65536 the you effectively compare x+D -; with y+D, where D=2**32-2**16, so the result is the same. if x<65536 and -; y>=65536 then you compare x with y+D, and in both cases the result is x<y. - -(define_insn "" - [(set (cc0) - (compare (zero_extend:SI (match_operand:HI 0 "memory_operand" "m")) - (zero_extend:SI (match_operand:HI 1 "memory_operand" "m"))))] - "tahoe_cmp_check (insn, operands[0], 0)" - "cmpw %0,%1") - -(define_insn "" - [(set (cc0) - (compare (zero_extend:SI (match_operand:HI 0 "memory_operand" "m")) - (match_operand:SI 1 "immediate_operand" "i")))] - "tahoe_cmp_check(insn, operands[1], 65535)" - "* -{ - if (INTVAL (operands[1]) > 32767) - operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 0xffff0000); - return \"cmpw %0,%1\"; -}") - - -(define_insn "" - [(set (cc0) - (compare (sign_extend:SI (match_operand:QI 0 "memory_operand" "m")) - (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))] - "" - "cmpb %0,%1") - -(define_insn "" - [(set (cc0) - (compare (match_operand:SI 0 "nonmemory_operand" "ri") - (sign_extend:SI (match_operand:QI 1 "memory_operand" "m"))))] - "" - "cmpb %0,%1") - -(define_insn "" - [(set (cc0) - (compare (sign_extend:SI (match_operand:QI 0 "memory_operand" "m")) - (match_operand:SI 1 "nonmemory_operand" "ri")))] - "" - "cmpb %0,%1") - -; zero-extended compares give the same result as sign-extended compares, if -; the compare is unsigned. Just see: if both operands are <128 they are the -; same in both cases. If both are >=128 the you effectively compare x+D -; with y+D, where D=2**32-2**8, so the result is the same. if x<128 and -; y>=128 then you compare x with y+D, and in both cases the result is x<y. - -(define_insn "" - [(set (cc0) - (compare (zero_extend:SI (match_operand:QI 0 "memory_operand" "m")) - (zero_extend:SI (match_operand:QI 1 "memory_operand" "m"))))] - "tahoe_cmp_check (insn, operands[0], 0)" - "cmpb %0,%1") - -(define_insn "" - [(set (cc0) - (compare (zero_extend:SI (match_operand:QI 0 "memory_operand" "m")) - (match_operand:SI 1 "immediate_operand" "i")))] - "tahoe_cmp_check(insn, operands[1], 255)" - "* -{ - if (INTVAL (operands[1]) > 127) - operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 0xffffff00); - return \"cmpb %0,%1\"; -}") - - -(define_insn "cmpsi" - [(set (cc0) - (compare (match_operand:SI 0 "nonimmediate_operand" "g") - (match_operand:SI 1 "general_operand" "g")))] - "" - "cmpl %0,%1") - - -; cmpsf similar to vax, but first operand is expected to be in the -; fpp accumulator. - -(define_insn "cmpsf" - [(set (cc0) - (compare (match_operand:SF 0 "general_operand" "a,g") - (match_operand:SF 1 "general_operand" "g,g")))] - "" - "* -{ - switch (which_alternative) - { - case 0: return \"cmpf %1\"; - case 1: return \"cmpf2 %0,%1\"; - } -}") - - -; cmpdf similar to vax, but first operand is expected to be in the -; fpp accumulator. Immediate doubles not allowed. - -(define_insn "cmpdf" - [(set (cc0) - (compare (match_operand:DF 0 "general_operand" "a,rm") - (match_operand:DF 1 "general_operand" "rm,rm")))] - "" - "* -{ - switch (which_alternative) - { - case 0: return \"cmpd %1\"; - case 1: return \"cmpd2 %0,%1\"; - } -}") - -;; We don't want to allow a constant operand for test insns because -;; (set (cc0) (const_int foo)) has no mode information. Such insns will -;; be folded while optimizing anyway. - -(define_insn "tstsi" - [(set (cc0) - (match_operand:SI 0 "nonimmediate_operand" "g"))] - "" - "tstl %0") - - -; small tests from memory are normal, but testing from registers doesn't -; expand the data properly. So test in this case does a convert and tests -; the new register data from the stack. - -; First some special cases that do work - - -(define_insn "" - [(set (cc0) - (sign_extend:SI (match_operand:HI 0 "memory_operand" "m")))] - "" - "tstw %0") - -(define_insn "" - [(set (cc0) - (zero_extend:SI (match_operand:HI 0 "memory_operand" "m")))] - "tahoe_cmp_check (insn, operands[0], 0)" - "tstw %0") - - -(define_insn "tsthi" - [(set (cc0) - (match_operand:HI 0 "extendable_operand" "m,!r"))] - "GET_MODE (operands[0]) != VOIDmode" - "* -{ - rtx xoperands[2]; - extern rtx tahoe_reg_conversion_loc; - switch (which_alternative) - { - case 0: - return \"tstw %0\"; - case 1: - xoperands[0] = operands[0]; - xoperands[1] = tahoe_reg_conversion_loc; - output_asm_insn (\"movl %0,%1\", xoperands); - xoperands[1] = plus_constant (XEXP (tahoe_reg_conversion_loc, 0), 2); - output_asm_insn (\"tstw %a1\", xoperands); - return \"\"; - } -}") - - -(define_insn "" - [(set (cc0) - (sign_extend:SI (match_operand:QI 0 "memory_operand" "m")))] - "" - "tstb %0") - -(define_insn "" - [(set (cc0) - (zero_extend:SI (match_operand:QI 0 "memory_operand" "m")))] - "tahoe_cmp_check (insn, operands[0], 0)" - "tstb %0") - - -(define_insn "tstqi" - [(set (cc0) - (match_operand:QI 0 "extendable_operand" "m,!r"))] - "GET_MODE (operands[0]) != VOIDmode" - "* -{ - rtx xoperands[2]; - extern rtx tahoe_reg_conversion_loc; - switch (which_alternative) - { - case 0: - return \"tstb %0\"; - case 1: - xoperands[0] = operands[0]; - xoperands[1] = tahoe_reg_conversion_loc; - output_asm_insn (\"movl %0,%1\", xoperands); - xoperands[1] = plus_constant (XEXP (tahoe_reg_conversion_loc, 0), 3); - output_asm_insn (\"tstb %a1\", xoperands); - return \"\"; - } -}") - -; tstsf compares a given value to a value already in the fpp accumulator. -; No flags are set by this so ignore them. - -(define_insn "tstsf" - [(set (cc0) - (match_operand:SF 0 "register_operand" "a"))] - "" - "tstf") - - -; tstdf compares a given value to a value already in the fpp accumulator. -; immediate doubles not allowed. Flags are ignored after this. - -(define_insn "tstdf" - [(set (cc0) - (match_operand:DF 0 "register_operand" "a"))] - "" - "tstd") - - - -; movstrhi tahoe instruction does not load registers by itself like -; the vax counterpart does. registers 0-2 must be primed by hand. -; we have loaded the registers in the order: dst, src, count. - -(define_insn "movstrhi" - [(set (match_operand:BLK 0 "general_operand" "p") - (match_operand:BLK 1 "general_operand" "p")) - (use (match_operand:HI 2 "general_operand" "g")) - (clobber (reg:SI 0)) - (clobber (reg:SI 1)) - (clobber (reg:SI 2))] - "" - "movab %0,r1\;movab %1,r0\;movl %2,r2\;movblk") - - -; floatsisf2 on tahoe converts the long from reg/mem into the fpp -; accumulator. There are no hi and qi counterparts. Flags are not -; set correctly here. - -(define_insn "floatsisf2" - [(set (match_operand:SF 0 "register_operand" "=a") - (float:SF (match_operand:SI 1 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"cvlf %1\"; -}") - - -; floatsidf2 on tahoe converts the long from reg/mem into the fpp -; accumulator. There are no hi and qi counterparts. Flags are not -; set correctly here. - -(define_insn "floatsidf2" - [(set (match_operand:DF 0 "register_operand" "=a") - (float:DF (match_operand:SI 1 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"cvld %1\"; -}") - - -; fix_truncsfsi2 to convert a float to long, tahoe must have the float -; in the fpp accumulator. Flags are not set here. - -(define_insn "fix_truncsfsi2" - [(set (match_operand:SI 0 "general_operand" "=g") - (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "a"))))] - "" - "* -{ - CC_STATUS_INIT; - return \"cvfl %0\"; -}") - - -; fix_truncsfsi2 to convert a double to long, tahoe must have the double -; in the fpp accumulator. Flags are not set here. - -(define_insn "fix_truncdfsi2" - [(set (match_operand:SI 0 "general_operand" "=g") - (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "a"))))] - "" - "* -{ - CC_STATUS_INIT; - return \"cvdl %0\"; -}") - - -(define_insn "truncsihi2" - [(set (match_operand:HI 0 "general_operand" "=g") - (truncate:HI (match_operand:SI 1 "general_operand" "g")))] - "" - "cvtlw %1,%0") - - -(define_insn "truncsiqi2" - [(set (match_operand:QI 0 "general_operand" "=g") - (truncate:QI (match_operand:SI 1 "general_operand" "g")))] - "" - "cvtlb %1,%0") - - -(define_insn "trunchiqi2" - [(set (match_operand:QI 0 "general_operand" "=g") - (truncate:QI (match_operand:HI 1 "general_operand" "g")))] - "" - "cvtwb %1,%0") - - -; The fpp related instructions don't set flags, so ignore them -; after this instruction. - -(define_insn "truncdfsf2" - [(set (match_operand:SF 0 "register_operand" "=a") - (float_truncate:SF (match_operand:DF 1 "register_operand" "0")))] - "" - "* -{ - CC_STATUS_INIT; - return \"cvdf\"; -}") - - -; This monster is to cover for the Tahoe's nasty habit of not extending -; a number if the source is in a register. (It just moves it!) Case 0 is -; a normal extend from memory. Case 1 does the extension from the top of -; the stack. Extension from the stack doesn't set the flags right since -; the moval changes them. - -(define_insn "extendhisi2" - [(set (match_operand:SI 0 "general_operand" "=g,?=g") - (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))] - "" - "* -{ - switch (which_alternative) - { - case 0: - return \"cvtwl %1,%0\"; - case 1: - if (push_operand (operands[0], SImode)) - return \"pushl %1\;cvtwl 2(sp),(sp)\"; - else - { - CC_STATUS_INIT; - return \"pushl %1\;cvtwl 2(sp),%0\;moval 4(sp),sp\"; - } - } -}") - -; This monster is to cover for the Tahoe's nasty habit of not extending -; a number if the source is in a register. (It just moves it!) Case 0 is -; a normal extend from memory. Case 1 does the extension from the top of -; the stack. Extension from the stack doesn't set the flags right since -; the moval changes them. - -(define_insn "extendqisi2" - [(set (match_operand:SI 0 "general_operand" "=g,?=g") - (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))] - "" - "* -{ - switch (which_alternative) - { - case 0: - return \"cvtbl %1,%0\"; - case 1: - if (push_operand (operands[0], SImode)) - return \"pushl %1\;cvtbl 3(sp),(sp)\"; - else - { - CC_STATUS_INIT; - return \"pushl %1\;cvtbl 3(sp),%0\;moval 4(sp),sp\"; - } - } -}") - - -; This monster is to cover for the Tahoe's nasty habit of not extending -; a number if the source is in a register. (It just moves it!) Case 0 is -; a normal extend from memory. Case 1 does the extension from the top of -; the stack. Extension from the stack doesn't set the flags right since -; the moval changes them. - -(define_insn "extendqihi2" - [(set (match_operand:HI 0 "general_operand" "=g,?=g") - (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))] - "" - "* -{ - switch (which_alternative) - { - case 0: - return \"cvtbw %1,%0\"; - case 1: - if (push_operand (operands[0], SImode)) - return \"pushl %1\;cvtbw 3(sp),(sp)\"; - else - { - CC_STATUS_INIT; - return \"pushl %1\;cvtbw 3(sp),%0\;moval 4(sp),sp\"; - } - } -}") - - -; extendsfdf2 tahoe uses the fpp accumulator to do the extension. -; It takes a float and loads it up directly as a double. - -(define_insn "extendsfdf2" - [(set (match_operand:DF 0 "register_operand" "=a") - (float_extend:DF (match_operand:SF 1 "general_operand" "g")))] - "" - "* -{ - CC_STATUS_INIT; - return \"ldfd %1\"; -}") - - -; movz works fine from memory but not from register for the same reasons -; the cvt instructions don't work right. So we use the normal instruction -; from memory and we use an and to simulate it from register. This is faster -; than pulling it off the stack. - - -(define_insn "zero_extendhisi2" - [(set (match_operand:SI 0 "general_operand" "=g,?=g") - (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "m,r")))] - "" - "* -{ - switch (which_alternative) - { - case 0: return \"movzwl %1,%0\"; - case 1: return \"andl3 $0xffff,%1,%0\"; - } -}") - -; movz works fine from memory but not from register for the same reasons -; the cvt instructions don't work right. So we use the normal instruction -; from memory and we use an and to simulate it from register. This is faster -; than pulling it off the stack. - -(define_insn "zero_extendqihi2" - [(set (match_operand:HI 0 "general_operand" "=g,?=g") - (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,r")))] - "" - "* -{ - switch (which_alternative) - { - case 0: return \"movzbw %1,%0\"; - case 1: return \"andw3 $0xff,%1,%0\"; - } -}") - - -; movz works fine from memory but not from register for the same reasons -; the cvt instructions don't work right. So we use the normal instruction -; from memory and we use an and to simulate it from register. This is faster -; than pulling it off the stack. - -(define_insn "zero_extendqisi2" - [(set (match_operand:SI 0 "general_operand" "=g,?=g") - (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "m,r")))] - "" - "* -{ - switch (which_alternative) - { - case 0: return \"movzbl %1,%0\"; - case 1: return \"andl3 $0xff,%1,%0\"; - } -}") - - -(define_insn "beq" - [(set (pc) - (if_then_else (eq (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jeql %l0") - - -(define_insn "bne" - [(set (pc) - (if_then_else (ne (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jneq %l0") - - -(define_insn "bgt" - [(set (pc) - (if_then_else (gt (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jgtr %l0") - - -(define_insn "bgtu" - [(set (pc) - (if_then_else (gtu (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jgtru %l0") - - -(define_insn "blt" - [(set (pc) - (if_then_else (lt (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jlss %l0") - - -(define_insn "bltu" - [(set (pc) - (if_then_else (ltu (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jlssu %l0") - - -(define_insn "bge" - [(set (pc) - (if_then_else (ge (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jgeq %l0") - - -(define_insn "bgeu" - [(set (pc) - (if_then_else (geu (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jgequ %l0") - - -(define_insn "ble" - [(set (pc) - (if_then_else (le (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jleq %l0") - - -(define_insn "bleu" - [(set (pc) - (if_then_else (leu (cc0) - (const_int 0)) - (label_ref (match_operand 0 "" "")) - (pc)))] - "" - "jlequ %l0") - - -; gcc does not account for register mask/argc longword. Thus the number -; for the call = number bytes for args + 4 - -(define_insn "call" - [(call (match_operand:QI 0 "memory_operand" "m") - (match_operand:QI 1 "general_operand" "g"))] - "" - "* -{ - operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) + 4)); - if (GET_CODE(operands[0]) == MEM - && CONSTANT_ADDRESS_P (XEXP(operands[0], 0)) - && INTVAL (operands[1]) < 64) - return \"callf %1,%0\"; /* this is much faster */ - return \"calls %1,%0\"; -}") - -; gcc does not account for register mask/argc longword. Thus the number -; for the call = number bytes for args + 4 - -(define_insn "call_value" - [(set (match_operand 0 "" "=g") - (call (match_operand:QI 1 "memory_operand" "m") - (match_operand:QI 2 "general_operand" "g")))] - "" - "* -{ - operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) + 4)); - if (GET_CODE(operands[1]) == MEM - && CONSTANT_ADDRESS_P (XEXP(operands[1], 0)) - && INTVAL (operands[2]) < 64) - return \"callf %2,%1\"; /* this is much faster */ - return \"calls %2,%1\"; -}") - - -(define_insn "return" - [(return)] - "" - "ret") - -(define_insn "nop" - [(const_int 0)] - "" - "nop") - -; casesi this code extracted from the vax code. The instructions are -; very similar. Tahoe requires that the table be word aligned. GCC -; places the table immediately after, thus the alignment directive. - -(define_insn "casesi" - [(set (pc) - (if_then_else (le (minus:SI (match_operand:SI 0 "general_operand" "g") - (match_operand:SI 1 "general_operand" "g")) - (match_operand:SI 2 "general_operand" "g")) - (plus:SI (sign_extend:SI - (mem:HI (plus:SI (pc) - (minus:SI (match_dup 0) - (match_dup 1))))) - (label_ref:SI (match_operand 3 "" ""))) - (pc)))] - "" - "casel %0,%1,%2\;.align %@") - - -(define_insn "jump" - [(set (pc) - (label_ref (match_operand 0 "" "")))] - "" - "jbr %l0") - - -;; This is the list of all the non-standard insn patterns - - -; This is used to access the address of a byte. This is similar to -; movqi, but the second operand had to be "address_operand" type, so -; it had to be an unnamed one. - -(define_insn "" - [(set (match_operand:SI 0 "general_operand" "=g") - (match_operand:QI 1 "address_operand" "p"))] - "" - "* -{ - if (push_operand (operands[0], SImode)) - return \"pushab %a1\"; - return \"movab %a1,%0\"; -}") - -; This is used to access the address of a word. This is similar to -; movhi, but the second operand had to be "address_operand" type, so -; it had to be an unnamed one. - -(define_insn "" - [(set (match_operand:SI 0 "general_operand" "=g") - (match_operand:HI 1 "address_operand" "p"))] - "" - "* -{ - if (push_operand (operands[0], SImode)) - return \"pushaw %a1\"; - return \"movaw %a1,%0\"; -}") - -; This is used to access the address of a long. This is similar to -; movsi, but the second operand had to be "address_operand" type, so -; it had to be an unnamed one. - -(define_insn "" - [(set (match_operand:SI 0 "general_operand" "=g") - (match_operand:SI 1 "address_operand" "p"))] - "" - "* -{ - if (push_operand (operands[0], SImode)) - return \"pushal %a1\"; - return \"moval %a1,%0\"; -}") - - -; bit test longword instruction, same as vax - -(define_insn "" - [(set (cc0) - (and:SI (match_operand:SI 0 "general_operand" "g") - (match_operand:SI 1 "general_operand" "g")))] - "" - "bitl %0,%1") - - -; bit test word instructions, same as vax - -(define_insn "" - [(set (cc0) - (and:HI (match_operand:HI 0 "general_operand" "g") - (match_operand:HI 1 "general_operand" "g")))] - "" - "bitw %0,%1") - - -; bit test instructions, same as vax - -(define_insn "" - [(set (cc0) - (and:QI (match_operand:QI 0 "general_operand" "g") - (match_operand:QI 1 "general_operand" "g")))] - "" - "bitb %0,%1") - - -; bne counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (eq (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jneq %l0") - - -; beq counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (ne (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jeql %l0") - - -; ble counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (gt (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jleq %l0") - - -; bleu counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (gtu (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jlequ %l0") - - -; bge counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (lt (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jgeq %l0") - - -; bgeu counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (ltu (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jgequ %l0") - - -; blt counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (ge (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jlss %l0") - - -; bltu counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (geu (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jlssu %l0") - - -; bgt counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (le (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jgtr %l0") - - -; bgtu counterpart. in case gcc reverses the conditional. - -(define_insn "" - [(set (pc) - (if_then_else (leu (cc0) - (const_int 0)) - (pc) - (label_ref (match_operand 0 "" ""))))] - "" - "jgtru %l0") - - -; casesi alternate form as found in vax code. this form is to -; compensate for the table's offset being no distance (0 displacement) - -(define_insn "" - [(set (pc) - (if_then_else (le (match_operand:SI 0 "general_operand" "g") - (match_operand:SI 1 "general_operand" "g")) - (plus:SI (sign_extend:SI - (mem:HI (plus:SI (pc) - (minus:SI (match_dup 0) - (const_int 0))))) - (label_ref:SI (match_operand 3 "" ""))) - (pc)))] - "" - "casel %0,$0,%1\;.align %@") - - -; casesi alternate form as found in vax code. another form to -; compensate for the table's offset being no distance (0 displacement) - -(define_insn "" - [(set (pc) - (if_then_else (le (match_operand:SI 0 "general_operand" "g") - (match_operand:SI 1 "general_operand" "g")) - (plus:SI (sign_extend:SI - (mem:HI (plus:SI (pc) - (match_dup 0)))) - (label_ref:SI (match_operand 3 "" ""))) - (pc)))] - "" - "casel %0,$0,%1 \;.align %@") - -(define_insn "" - [(set (pc) - (if_then_else - (lt (plus:SI (match_operand:SI 0 "general_operand" "+g") - (const_int 1)) - (match_operand:SI 1 "general_operand" "g")) - (label_ref (match_operand 2 "" "")) - (pc))) - (set (match_dup 0) - (plus:SI (match_dup 0) - (const_int 1)))] - "" - "aoblss %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (le (plus:SI (match_operand:SI 0 "general_operand" "+g") - (const_int 1)) - (match_operand:SI 1 "general_operand" "g")) - (label_ref (match_operand 2 "" "")) - (pc))) - (set (match_dup 0) - (plus:SI (match_dup 0) - (const_int 1)))] - "" - "aobleq %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (ge (plus:SI (match_operand:SI 0 "general_operand" "+g") - (const_int 1)) - (match_operand:SI 1 "general_operand" "g")) - (pc) - (label_ref (match_operand 2 "" "")))) - (set (match_dup 0) - (plus:SI (match_dup 0) - (const_int 1)))] - "" - "aoblss %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (gt (plus:SI (match_operand:SI 0 "general_operand" "+g") - (const_int 1)) - (match_operand:SI 1 "general_operand" "g")) - (pc) - (label_ref (match_operand 2 "" "")))) - (set (match_dup 0) - (plus:SI (match_dup 0) - (const_int 1)))] - "" - "aobleq %1,%0,%l2") - -; bbs/bbc - -(define_insn "" - [(set (pc) - (if_then_else - (ne (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (subreg:QI (match_operand:SI 1 "general_operand" "g") 0)) - (const_int 0)) - (label_ref (match_operand 2 "" "")) - (pc)))] - "" - "bbs %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (eq (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (subreg:QI (match_operand:SI 1 "general_operand" "g") 0)) - (const_int 0)) - (label_ref (match_operand 2 "" "")) - (pc)))] - "" - "bbc %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (ne (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (subreg:QI (match_operand:SI 1 "general_operand" "g") 0)) - (const_int 0)) - (pc) - (label_ref (match_operand 2 "" ""))))] - "" - "bbc %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (eq (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (subreg:QI (match_operand:SI 1 "general_operand" "g") 0)) - (const_int 0)) - (pc) - (label_ref (match_operand 2 "" ""))))] - "" - "bbs %1,%0,%l2") - -; if the shift count is a byte in a register we can use it as a long - -(define_insn "" - [(set (pc) - (if_then_else - (ne (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (match_operand:QI 1 "register_operand" "r")) - (const_int 0)) - (label_ref (match_operand 2 "" "")) - (pc)))] - "" - "bbs %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (eq (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (match_operand:QI 1 "register_operand" "r")) - (const_int 0)) - (label_ref (match_operand 2 "" "")) - (pc)))] - "" - "bbc %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (ne (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (match_operand:QI 1 "register_operand" "r")) - (const_int 0)) - (pc) - (label_ref (match_operand 2 "" ""))))] - "" - "bbc %1,%0,%l2") - -(define_insn "" - [(set (pc) - (if_then_else - (eq (sign_extract:SI (match_operand:SI 0 "register_operand" "rm") - (const_int 1) - (match_operand:QI 1 "register_operand" "r")) - (const_int 0)) - (pc) - (label_ref (match_operand 2 "" ""))))] - "" - "bbs %1,%0,%l2") - -; special case for 1 << constant. We don't do these because they are slower -; than the bitl instruction - -;(define_insn "" -; [(set (pc) -; (if_then_else -; (ne (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm") -; (match_operand:SI 1 "immediate_operand" "i")) -; (const_int 0)) -; (label_ref (match_operand 2 "" "")) -; (pc)))] -; "GET_CODE (operands[1]) == CONST_INT -; && exact_log2 (INTVAL (operands[1])) >= 0" -; "* -;{ -; operands[1] -; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); -; return \"bbs %1,%0,%l2\"; -;}") -; -;(define_insn "" -; [(set (pc) -; (if_then_else -; (eq (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm") -; (match_operand:SI 1 "immediate_operand" "i")) -; (const_int 0)) -; (label_ref (match_operand 2 "" "")) -; (pc)))] -; "GET_CODE (operands[1]) == CONST_INT -; && exact_log2 (INTVAL (operands[1])) >= 0" -; "* -;{ -; operands[1] -; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); -; return \"bbc %1,%0,%l2\"; -;}") -; -;(define_insn "" -; [(set (pc) -; (if_then_else -; (ne (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm") -; (match_operand:SI 1 "immediate_operand" "i")) -; (const_int 0)) -; (pc) -; (label_ref (match_operand 2 "" ""))))] -; "GET_CODE (operands[1]) == CONST_INT -; && exact_log2 (INTVAL (operands[1])) >= 0" -; "* -;{ -; operands[1] -; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); -; return \"bbc %1,%0,%l2\"; -;}") -; -;(define_insn "" -; [(set (pc) -; (if_then_else -; (eq (and:SI (match_operand:SI 0 "nonimmediate_operand" "%rm") -; (match_operand:SI 1 "immediate_operand" "i")) -; (const_int 0)) -; (pc) -; (label_ref (match_operand 2 "" ""))))] -; "GET_CODE (operands[1]) == CONST_INT -; && exact_log2 (INTVAL (operands[1])) >= 0" -; "* -;{ -; operands[1] -; = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); -; return \"bbs %1,%0,%l2\"; -;}") |