/* Typedefs for polynomial integers used in GCC.
   Copyright (C) 2016-2021 Free Software Foundation, Inc.

This file is part of GCC.

GCC 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 3, or (at your option) any later
version.

GCC 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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef HAVE_POLY_INT_TYPES_H
#define HAVE_POLY_INT_TYPES_H

typedef poly_int_pod<NUM_POLY_INT_COEFFS, unsigned short> poly_uint16_pod;
typedef poly_int_pod<NUM_POLY_INT_COEFFS, HOST_WIDE_INT> poly_int64_pod;
typedef poly_int_pod<NUM_POLY_INT_COEFFS,
		     unsigned HOST_WIDE_INT> poly_uint64_pod;
typedef poly_int_pod<NUM_POLY_INT_COEFFS, offset_int> poly_offset_int_pod;
typedef poly_int_pod<NUM_POLY_INT_COEFFS, wide_int> poly_wide_int_pod;
typedef poly_int_pod<NUM_POLY_INT_COEFFS, widest_int> poly_widest_int_pod;

typedef poly_int<NUM_POLY_INT_COEFFS, unsigned short> poly_uint16;
typedef poly_int<NUM_POLY_INT_COEFFS, HOST_WIDE_INT> poly_int64;
typedef poly_int<NUM_POLY_INT_COEFFS, unsigned HOST_WIDE_INT> poly_uint64;
typedef poly_int<NUM_POLY_INT_COEFFS, offset_int> poly_offset_int;
typedef poly_int<NUM_POLY_INT_COEFFS, wide_int> poly_wide_int;
typedef poly_int<NUM_POLY_INT_COEFFS, wide_int_ref> poly_wide_int_ref;
typedef poly_int<NUM_POLY_INT_COEFFS, widest_int> poly_widest_int;

/* Divide bit quantity X by BITS_PER_UNIT and round down (towards -Inf).
   If X is a bit size, this gives the number of whole bytes spanned by X.

   This is safe because non-constant mode sizes must be a whole number
   of bytes in size.  */
#define bits_to_bytes_round_down(X) force_align_down_and_div (X, BITS_PER_UNIT)

/* Divide bit quantity X by BITS_PER_UNIT and round up (towards +Inf).
   If X is a bit size, this gives the number of whole or partial bytes
   spanned by X.

   This is safe because non-constant mode sizes must be a whole number
   of bytes in size.  */
#define bits_to_bytes_round_up(X) force_align_up_and_div (X, BITS_PER_UNIT)

/* Return the number of bits in bit quantity X that do not belong to
   whole bytes.  This is equivalent to:

       X - bits_to_bytes_round_down (X) * BITS_PER_UNIT

   This is safe because non-constant mode sizes must be a whole number
   of bytes in size.  */
#define num_trailing_bits(X) force_get_misalignment (X, BITS_PER_UNIT)

/* Round bit quantity X down to the nearest byte boundary.

   This is safe because non-constant mode sizes must be a whole number
   of bytes in size.  */
#define round_down_to_byte_boundary(X) force_align_down (X, BITS_PER_UNIT)

/* Round bit quantity X up the nearest byte boundary.

   This is safe because non-constant mode sizes must be a whole number
   of bytes in size.  */
#define round_up_to_byte_boundary(X) force_align_up (X, BITS_PER_UNIT)

/* Return the size of an element in a vector of size SIZE, given that
   the vector has NELTS elements.  The return value is in the same units
   as SIZE (either bits or bytes).

   to_constant () is safe in this situation because vector elements are
   always constant-sized scalars.  */
#define vector_element_size(SIZE, NELTS) \
  (exact_div (SIZE, NELTS).to_constant ())

/* Return the number of unroll times when a vector that has NELTS1 elements
   is unrolled to vectors that have NELTS2 elements.

   to_constant () is safe in this situation because the multiples of the
   NELTS of two vectors are always constant-size scalars.  */
#define vector_unroll_factor(NELTS1, NELTS2) \
  (exact_div (NELTS1, NELTS2).to_constant ())

/* Wrapper for poly_int arguments to target macros, so that if a target
   doesn't need polynomial-sized modes, its header file can continue to
   treat the argument as a normal constant.  This should go away once
   macros are moved to target hooks.  It shouldn't be used in other
   contexts.  */
#if NUM_POLY_INT_COEFFS == 1
#define MACRO_INT(X) ((X).to_constant ())
#else
#define MACRO_INT(X) (X)
#endif

#endif
