/* This file contains the definitions and documentation for the instructions
   used in the Superoptimizer.

   Copyright (C) 1992 Free Software Foundation, Inc.

   This program 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.

   This program 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 this program; see the file COPYING.  If not, write to the Free
   Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */

/* The fields in the cpp macro call "DEF_INSN()" are:

   1. The internal name of the instruction.

   2. The class of the instruction.  These are stored in the insn_class
   array and are accessed via the GET_INSN_CLASS macro.  They are defined
   as  follows:

     "1" an rtx code for a unary arithmetic expression (e.g, ABSVAL, CLZ)
     "c" an rtx code for a commutative binary operation (e.g,  ADD, XOR)
     "2" an rtx code for a non-commutative binary operation (e.g., SUB, CMP)
     "x" everything else

   3. The printed name of the instruction.

   */

/* Arithmetic insns.  d = r1 + r2 [+ cy] */
DEF_INSN (ADD,            'b', "add")
DEF_INSN (ADD_CI,         'b', "add_ci")
DEF_INSN (ADD_CO,         'b', "add_co")
DEF_INSN (ADD_CIO,        'b', "add_cio")
/* Arithmetic insns.  d = r1 - r2 [- cy] */
DEF_INSN (SUB,            '2', "sub")
DEF_INSN (SUB_CI,         '2', "sub_ci")
DEF_INSN (SUB_CO,         '2', "sub_co")
DEF_INSN (SUB_CIO,        '2', "sub_cio")
/* Arithmetic insns.  d = r1 + ~r2 [+ cy] */
DEF_INSN (ADC_CI,         '2', "adc_ci")
DEF_INSN (ADC_CO,         '2', "adc_co")
DEF_INSN (ADC_CIO,        '2', "adc_cio")

/* Logical insns that don't affect the carry flag.  */
DEF_INSN (AND,            'b', "and")
DEF_INSN (IOR,            'b', "ior")
DEF_INSN (XOR,            'b', "xor")
DEF_INSN (ANDC,           '2', "andc")
DEF_INSN (IORC,           '2', "iorc")
DEF_INSN (EQV,            '2', "eqv")
DEF_INSN (NAND,           'b', "nand")
DEF_INSN (NOR,            'b', "nor")

/* Logical insns that reset the carry flag.  */
DEF_INSN (AND_RC,         'b', "and_rc")
DEF_INSN (IOR_RC,         'b', "ior_rc")
DEF_INSN (XOR_RC,         'b', "xor_rc")
DEF_INSN (ANDC_RC,        '2', "andc_rc")
DEF_INSN (IORC_RC,        '2', "iorc_rc")
DEF_INSN (EQV_RC,         '2', "eqv_rc")
DEF_INSN (NAND_RC,        'b', "nand_rc")
DEF_INSN (NOR_RC,         'b', "nor_rc")

/* Logical insns that clobber the carry flag.  */
DEF_INSN (AND_CC,         'b', "and_cc")
DEF_INSN (IOR_CC,         'b', "ior_cc")
DEF_INSN (XOR_CC,         'b', "xor_cc")
DEF_INSN (ANDC_CC,        '2', "andc_cc")
DEF_INSN (IORC_CC,        '2', "iorc_cc")
DEF_INSN (EQV_CC,         '2', "eqv_cc")
DEF_INSN (NAND_CC,        'b', "nand_cc")
DEF_INSN (NOR_CC,         'b', "nor_cc")

/* Bit shift and count.  */
DEF_INSN (LSHIFTR,        '2', "log_shift_right")
DEF_INSN (ASHIFTR,        '2', "arith_shift_right")
DEF_INSN (SHIFTL,         '2', "shift_left")
DEF_INSN (LSHIFTR_CO,     '2', "log_shift_right_co")
DEF_INSN (ASHIFTR_CO,     '2', "arith_shift_right_co")
DEF_INSN (SHIFTL_CO,      '2', "shift_left_co")
DEF_INSN (ROTATEL,        '2', "rotate_left")
DEF_INSN (ROTATEL_CO,     '2', "rotate_left_co")

/* Rotate thru carry.  */
DEF_INSN (ROTATEXL_CIO,   '2', "rotate_thru_carry_left_co")

/* Shift arithmetic right instruction and set carry iff the shifted
   operand is negative and any bit shifted out is 1.  */
DEF_INSN (ASHIFTR_CON,    '2', "arith_shift_right_set_carry_if_neg_and_nzbit_lost")

/* Extract.  */
DEF_INSN (EXTS1,          '2', "exts1")
DEF_INSN (EXTS2,          '2', "exts2")
DEF_INSN (EXTU1,          '2', "extu1")
DEF_INSN (EXTU2,          '2', "extu2")

/* Count leading/trailing zero instructions.  */
DEF_INSN (CLZ,            '1', "clz")
DEF_INSN (CTZ,            '1', "ctz")
DEF_INSN (FF1,            '1', "ff1")
DEF_INSN (FF0,            '1', "ff0")

DEF_INSN (ABSVAL,         '1', "abs")
DEF_INSN (NABSVAL,        '1', "nabs")
DEF_INSN (CMP,            '2', "cmp")

/* 29k CMP instructions.  */
DEF_INSN (CPEQ,           '2', "cpeq")
DEF_INSN (CPGE,           '2', "cpge")
DEF_INSN (CPGEU,          '2', "cpgeu")
DEF_INSN (CPGT,           '2', "cpgt")
DEF_INSN (CPGTU,          '2', "cpgtu")
DEF_INSN (CPLE,           '2', "cple")
DEF_INSN (CPLEU,          '2', "cpleu")
DEF_INSN (CPLT,           '2', "cplt")
DEF_INSN (CPLTU,          '2', "cpltu")
DEF_INSN (CPNEQ,          '2', "cpneq")

/* Alpha CMP instructions.  */
DEF_INSN (CMPEQ,           '2', "cmpeq")
DEF_INSN (CMPLE,           '2', "cmple")
DEF_INSN (CMPLEU,          '2', "cmpleu")
DEF_INSN (CMPLT,           '2', "cmplt")
DEF_INSN (CMPLTU,          '2', "cmpltu")

/* 88100 cmp instruction.  */
DEF_INSN (CMPPAR,         '2', "cmppar")

/* Difference-or-zero (rs6000) */
DEF_INSN (DOZ,            '2', "difference_or_zero")

DEF_INSN (COPY,           '1', "copy")
DEF_INSN (EXCHANGE,       '2', "exchange")

/* Complement carry */
DEF_INSN (COMCY,          '2', "complement_cy")

/* Alpha conditional move */
DEF_INSN (CMOVEQ,	  '2', "cmoveq")
DEF_INSN (CMOVNE,	  '2', "cmovne")
DEF_INSN (CMOVLT,	  '2', "cmovlt")
DEF_INSN (CMOVGE,	  '2', "cmovge")
DEF_INSN (CMOVLE,	  '2', "cmovle")
DEF_INSN (CMOVGT,	  '2', "cmovgt")

DEF_INSN (INVDIV,         '2', "invdiv")
DEF_INSN (INVMOD,         '2', "invmod")
DEF_INSN (UMULWIDEN_HI,   '2', "umulwiden_hi")
DEF_INSN (MUL,            '2', "mul")

#if UDIV_WITH_SDIV
DEF_INSN (SDIV,           '2', "sdiv")
#endif

/*
Local variables:
mode:c
version-control: t
End:
*/
