/* Copyright (C) 2006 Free Software Foundation, Inc.

   This file 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 of the License, or (at your option) 
   any later version.

   This file 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 file; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301, USA.  */

/* Vector modes.  */
VECTOR_MODES (INT, 2);        /*                 V2QI */ 
VECTOR_MODES (INT, 4);        /*            V4QI V2HI */
VECTOR_MODES (INT, 8);        /*       V8QI V4HI V2SI */
VECTOR_MODES (INT, 16);       /* V16QI V8HI V4SI V2DI */
        
        
VECTOR_MODES (FLOAT, 8);      /*            V4HF V2SF */ 
VECTOR_MODES (FLOAT, 16);     /*       V8HF V4SF V2DF */ 
        
/* A special mode for the intr register so we can treat it differently
   for conditional moves.  */
RANDOM_MODE (INTR);

/* cse_insn needs an INT_MODE larger than WORD_MODE, otherwise some
   parts of it will go into an infinite loop. */
INT_MODE (OI, 32);
