aboutsummaryrefslogtreecommitdiff
path: root/hw
AgeCommit message (Expand)AuthorFilesLines
2016-01-18Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-peter' in...Peter Maydell2-5/+6
2016-01-18qdev: Free QemuOpts when the QOM path goes awayPaolo Bonzini1-1/+3
2016-01-18qom: Change object property iterator API contractDaniel P. Berrange1-4/+3
2016-01-18hw/arm: Clean up includesPeter Maydell42-1/+42
2016-01-18Merge remote-tracking branch 'remotes/mcayland/tags/qemu-sparc-signed' into s...Peter Maydell1-24/+0
2016-01-16target-sparc: Convert to VMStateDescriptionJuan Quintela1-24/+0
2016-01-15SCSI device: fix to incomplete QOMifyCao jin3-9/+9
2016-01-15qemu-char: delete send_all/recv_all helper methodsDaniel P. Berrange1-2/+27
2016-01-15scsi: initialise info object with appropriate sizeP J P1-1/+1
2016-01-15i386: avoid null pointer dereferenceP J P1-5/+10
2016-01-15scsi: revert change to scsi_req_cancel_async and add assertionsPaolo Bonzini1-0/+11
2016-01-15ARM: virt: Don't generate RTC ACPI device when using UEFIShannon Zhao1-19/+5
2016-01-15xlnx-zynqmp: Add support for high DDR memory regionsAlistair Francis2-19/+58
2016-01-14Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2016-01-13' into...Peter Maydell64-359/+269
2016-01-14Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20160113' into stagingPeter Maydell9-1126/+45
2016-01-13error: Consistently name Error * objects err, and not errpMarkus Armbruster1-5/+5
2016-01-13s390/sclp: Simplify control flow in sclp_realize()Markus Armbruster1-6/+3
2016-01-13hw/s390x: Rename local variables Error *l_err to just errMarkus Armbruster2-13/+13
2016-01-13error: Clean up errors with embedded newlines (again)Markus Armbruster1-2/+2
2016-01-13pci-assign: Clean up "Failed to assign" error messagesMarkus Armbruster1-8/+8
2016-01-13error: Strip trailing '\n' from error string arguments (again)Markus Armbruster6-16/+17
2016-01-13spapr: Use error_reportf_err()Markus Armbruster1-3/+4
2016-01-13error: Use error_prepend() where it makes obvious senseMarkus Armbruster3-13/+7
2016-01-13error: Use error_reportf_err() where it makes obvious senseMarkus Armbruster7-22/+15
2016-01-13error: Don't decorate original error message when adding to itMarkus Armbruster1-1/+1
2016-01-13error: Use error_report_err() instead of monitor_printf()Markus Armbruster1-2/+1
2016-01-13error: Use error_report_err() where appropriate (again)Markus Armbruster5-8/+6
2016-01-13isa: Clean up inappropriate hw_error()Markus Armbruster1-11/+0
2016-01-13isa: Clean up error handling around isa_bus_new()Markus Armbruster11-15/+33
2016-01-13isa: Trivially convert remaining PCI-ISA bridges to realize()Markus Armbruster2-7/+4
2016-01-13sysbus: Don't use hw_error() in machine_init_done_notifiersMarkus Armbruster1-13/+12
2016-01-13hw/arm/virt: Fix property "gic-version" error handlingMarkus Armbruster1-3/+2
2016-01-13raven: Mark use of hw_error() in realize() FIXMEMarkus Armbruster1-2/+4
2016-01-13etraxfs_eth: Don't use hw_error() in init() methodMarkus Armbruster1-1/+3
2016-01-13arm_mptimer: Don't use hw_error() in realize() methodMarkus Armbruster1-2/+3
2016-01-13omap: Don't use hw_error() in device init() methodsMarkus Armbruster3-13/+34
2016-01-13hw: Don't use hw_error() for machine initialization errorsMarkus Armbruster8-30/+48
2016-01-13hw: Inline the qdev_prop_set_drive_nofail() wrapperMarkus Armbruster7-20/+21
2016-01-13Use error_fatal to simplify obvious fatal errorsMarkus Armbruster11-150/+30
2016-01-13s390x/pci: return real state during listing PCIYi Min Zhao1-1/+2
2016-01-13virtio-ccw: fix sanity check for vectorHalil Pasic1-1/+2
2016-01-13s390: Introduce CCW_COMPAT_2_5Shmulik Ladkani1-0/+9
2016-01-13s390x/virtio: use qemu_check_nic_model()Cornelia Huck1-4/+1
2016-01-13s390x/pci: code cleanupYi Min Zhao1-3/+3
2016-01-13s390x/pci: reject some operations to disabled PCI functionYi Min Zhao3-7/+11
2016-01-13s390x: remove s390-virtio devicesPierre Morel4-946/+1
2016-01-13s390x: remove s390-virtio machinePierre Morel1-162/+0
2016-01-13s390x: add 2.6 compat machineCornelia Huck1-2/+16
2016-01-13virtio serial port: fix to incomplete QOMifyCao jin1-1/+1
2016-01-12Merge remote-tracking branch 'remotes/kvaneesh/tags/for-upstream-signed' into...Peter Maydell23-618/+667
n47'>47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
/* Return arc hyperbole sine for float value, with the imaginary part
   of the result possibly adjusted for use in computing other
   functions.
   Copyright (C) 1997-2013 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <complex.h>
#include <math.h>
#include <math_private.h>
#include <float.h>

/* Return the complex inverse hyperbolic sine of finite nonzero Z,
   with the imaginary part of the result subtracted from pi/2 if ADJ
   is nonzero.  */

__complex__ float
__kernel_casinhf (__complex__ float x, int adj)
{
  __complex__ float res;
  float rx, ix;
  __complex__ float y;

  /* Avoid cancellation by reducing to the first quadrant.  */
  rx = fabsf (__real__ x);
  ix = fabsf (__imag__ x);

  if (rx >= 1.0f / FLT_EPSILON || ix >= 1.0f / FLT_EPSILON)
    {
      /* For large x in the first quadrant, x + csqrt (1 + x * x)
	 is sufficiently close to 2 * x to make no significant
	 difference to the result; avoid possible overflow from
	 the squaring and addition.  */
      __real__ y = rx;
      __imag__ y = ix;

      if (adj)
	{
	  float t = __real__ y;
	  __real__ y = __copysignf (__imag__ y, __imag__ x);
	  __imag__ y = t;
	}

      res = __clogf (y);
      __real__ res += (float) M_LN2;
    }
  else if (rx >= 0.5f && ix < FLT_EPSILON / 8.0f)
    {
      float s = __ieee754_hypotf (1.0f, rx);

      __real__ res = __ieee754_logf (rx + s);
      if (adj)
	__imag__ res = __ieee754_atan2f (s, __imag__ x);
      else
	__imag__ res = __ieee754_atan2f (ix, s);
    }
  else if (rx < FLT_EPSILON / 8.0f && ix >= 1.5f)
    {
      float s = __ieee754_sqrtf ((ix + 1.0f) * (ix - 1.0f));

      __real__ res = __ieee754_logf (ix + s);
      if (adj)
	__imag__ res = __ieee754_atan2f (rx, __copysignf (s, __imag__ x));
      else
	__imag__ res = __ieee754_atan2f (s, rx);
    }
  else if (ix > 1.0f && ix < 1.5f && rx < 0.5f)
    {
      if (rx < FLT_EPSILON * FLT_EPSILON)
	{
	  float ix2m1 = (ix + 1.0f) * (ix - 1.0f);
	  float s = __ieee754_sqrtf (ix2m1);

	  __real__ res = __log1pf (2.0f * (ix2m1 + ix * s)) / 2.0f;
	  if (adj)
	    __imag__ res = __ieee754_atan2f (rx, __copysignf (s, __imag__ x));
	  else
	    __imag__ res = __ieee754_atan2f (s, rx);
	}
      else
	{
	  float ix2m1 = (ix + 1.0f) * (ix - 1.0f);
	  float rx2 = rx * rx;
	  float f = rx2 * (2.0f + rx2 + 2.0f * ix * ix);
	  float d = __ieee754_sqrtf (ix2m1 * ix2m1 + f);
	  float dp = d + ix2m1;
	  float dm = f / dp;
	  float r1 = __ieee754_sqrtf ((dm + rx2) / 2.0f);
	  float r2 = rx * ix / r1;

	  __real__ res
	    = __log1pf (rx2 + dp + 2.0f * (rx * r1 + ix * r2)) / 2.0f;
	  if (adj)
	    __imag__ res = __ieee754_atan2f (rx + r1, __copysignf (ix + r2,
								   __imag__ x));
	  else
	    __imag__ res = __ieee754_atan2f (ix + r2, rx + r1);
	}
    }
  else if (ix == 1.0f && rx < 0.5f)
    {
      if (rx < FLT_EPSILON / 8.0f)
	{
	  __real__ res = __log1pf (2.0f * (rx + __ieee754_sqrtf (rx))) / 2.0f;
	  if (adj)
	    __imag__ res = __ieee754_atan2f (__ieee754_sqrtf (rx),
					     __copysignf (1.0f, __imag__ x));
	  else
	    __imag__ res = __ieee754_atan2f (1.0f, __ieee754_sqrtf (rx));
	}
      else
	{
	  float d = rx * __ieee754_sqrtf (4.0f + rx * rx);
	  float s1 = __ieee754_sqrtf ((d + rx * rx) / 2.0f);
	  float s2 = __ieee754_sqrtf ((d - rx * rx) / 2.0f);

	  __real__ res = __log1pf (rx * rx + d + 2.0f * (rx * s1 + s2)) / 2.0f;
	  if (adj)
	    __imag__ res = __ieee754_atan2f (rx + s1,
					     __copysignf (1.0f + s2,
							  __imag__ x));
	  else
	    __imag__ res = __ieee754_atan2f (1.0f + s2, rx + s1);
	}
    }
  else if (ix < 1.0f && rx < 0.5f)
    {
      if (ix >= FLT_EPSILON)
	{
	  if (rx < FLT_EPSILON * FLT_EPSILON)
	    {
	      float onemix2 = (1.0f + ix) * (1.0f - ix);
	      float s = __ieee754_sqrtf (onemix2);

	      __real__ res = __log1pf (2.0f * rx / s) / 2.0f;
	      if (adj)
		__imag__ res = __ieee754_atan2f (s, __imag__ x);
	      else
		__imag__ res = __ieee754_atan2f (ix, s);
	    }
	  else
	    {
	      float onemix2 = (1.0f + ix) * (1.0f - ix);
	      float rx2 = rx * rx;
	      float f = rx2 * (2.0f + rx2 + 2.0f * ix * ix);
	      float d = __ieee754_sqrtf (onemix2 * onemix2 + f);
	      float dp = d + onemix2;
	      float dm = f / dp;
	      float r1 = __ieee754_sqrtf ((dp + rx2) / 2.0f);
	      float r2 = rx * ix / r1;

	      __real__ res
		= __log1pf (rx2 + dm + 2.0f * (rx * r1 + ix * r2)) / 2.0f;
	      if (adj)
		__imag__ res = __ieee754_atan2f (rx + r1,
						 __copysignf (ix + r2,
							      __imag__ x));
	      else
		__imag__ res = __ieee754_atan2f (ix + r2, rx + r1);
	    }
	}
      else
	{
	  float s = __ieee754_hypotf (1.0f, rx);

	  __real__ res = __log1pf (2.0f * rx * (rx + s)) / 2.0f;
	  if (adj)
	    __imag__ res = __ieee754_atan2f (s, __imag__ x);
	  else
	    __imag__ res = __ieee754_atan2f (ix, s);
	}
      if (__real__ res < FLT_MIN)
	{
	  volatile float force_underflow = __real__ res * __real__ res;
	  (void) force_underflow;
	}
    }
  else
    {
      __real__ y = (rx - ix) * (rx + ix) + 1.0f;
      __imag__ y = 2.0f * rx * ix;

      y = __csqrtf (y);

      __real__ y += rx;
      __imag__ y += ix;

      if (adj)
	{
	  float t = __real__ y;
	  __real__ y = __copysignf (__imag__ y, __imag__ x);
	  __imag__ y = t;
	}

      res = __clogf (y);
    }

  /* Give results the correct sign for the original argument.  */
  __real__ res = __copysignf (__real__ res, __real__ x);
  __imag__ res = __copysignf (__imag__ res, (adj ? 1.0f : __imag__ x));

  return res;
}