view gcc/d/longdouble.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

/* longdouble.h -- Definitions of floating-point access for the frontend.
   Copyright (C) 2015-2020 Free Software Foundation, Inc.

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 GCC_D_LONGDOUBLE_H
#define GCC_D_LONGDOUBLE_H

struct real_value;
class Type;

struct longdouble
{
public:
  /* Return the hidden real_value from the longdouble type.  */
  const real_value& rv (void) const
  { return *(const real_value *) this; }

  real_value& rv (void)
  { return *(real_value *) this; }

  /* Normalize the value to be the precision supported by target.  */
  longdouble normalize (void);

  /* No constructor to be able to use this class in a union.  */
  template<typename T> longdouble& operator = (T x)
  { set (x); return *this; }

  /* Lvalue operators.  */
  void set (real_value& d);
  void set (int32_t d);
  void set (int64_t d);
  void set (uint32_t d);
  void set (uint64_t d);
  void set (bool d);

  /* Rvalue operators.  */
  bool to_bool () const;
  int64_t to_int () const;
  uint64_t to_uint () const;

  operator int32_t (void)
  { return (int32_t) this->to_int (); }

  operator int64_t (void)
  { return this->to_int (); }

  operator uint32_t (void)
  { return (uint32_t) this->to_uint (); }

  operator uint64_t (void)
  { return this->to_uint (); }

  operator bool (void)
  { return this->to_bool (); }

  /* Arithmetic operators.  */
  longdouble add (const longdouble& r) const;
  longdouble sub (const longdouble& r) const;
  longdouble mul (const longdouble& r) const;
  longdouble div (const longdouble& r) const;
  longdouble mod (const longdouble& r) const;
  longdouble neg () const;

  longdouble operator + (const longdouble& r)
  { return this->add (r); }

  longdouble operator - (const longdouble& r)
  { return this->sub (r); }

  longdouble operator * (const longdouble& r)
  { return this->mul (r); }

  longdouble operator / (const longdouble& r)
  { return this->div (r); }

  longdouble operator % (const longdouble& r)
  { return this->mod (r); }

  longdouble operator -()
  { return this->neg (); }

  /* Comparison operators.  */
  int cmp (const longdouble& t) const;
  int equals (const longdouble& t) const;

  bool operator < (const longdouble& r)
  { return this->cmp (r) < 0; }

  bool operator <= (const longdouble& r)
  { return this->cmp (r) <= 0; }

  bool operator > (const longdouble& r)
  { return this->cmp (r) > 0; }

  bool operator >= (const longdouble& r)
  { return this->cmp (r) >= 0; }

  bool operator == (const longdouble& r)
  { return this->equals (r); }

  bool operator != (const longdouble& r)
  { return !this->equals (r); }

private:
  /* Including gcc/real.h presents too many problems, so just
     statically allocate enough space for REAL_VALUE_TYPE.  */
  long realvalue[(2 + (16 + sizeof (long)) / sizeof (long))];
};

/* Declared, but "volatile" is not required.  */
typedef longdouble volatile_longdouble;

/* Use ldouble() to explicitly create a longdouble value.  */
template<typename T>
inline longdouble
ldouble (T x)
{
  longdouble d;
  d.set (x);
  return d;
}

#endif  /* GCC_D_LONGDOUBLE_H  */