+2014-06-27 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #16561]
+ [BZ #16562]
+ * sysdeps/ieee754/dbl-64/e_jn.c: Include <float.h>.
+ (__ieee754_yn): Set FE_TONEAREST mode internally and then
+ recompute overflowing results in original rounding mode.
+ * sysdeps/ieee754/flt-32/e_jnf.c: Include <float.h>.
+ (__ieee754_ynf): Set FE_TONEAREST mode internally and then
+ recompute overflowing results in original rounding mode.
+ * sysdeps/ieee754/ldbl-128/e_jnl.c: Include <float.h>.
+ (__ieee754_ynl): Set FE_TONEAREST mode internally and then
+ recompute overflowing results in original rounding mode.
+ * sysdeps/ieee754/ldbl-128ibm/e_jnl.c: Include <float.h>.
+ (__ieee754_ynl): Set FE_TONEAREST mode internally and then
+ recompute overflowing results in original rounding mode.
+ * sysdeps/ieee754/ldbl-96/e_jnl.c: Include <float.h>.
+ (__ieee754_ynl): Set FE_TONEAREST mode internally and then
+ recompute overflowing results in original rounding mode.
+ * sysdeps/i386/fpu/fenv_private.h [!__SSE2_MATH__]
+ (libc_feholdsetround_ctx): New macro.
+ * math/libm-test.inc (yn_test): Use ALL_RM_TEST.
+ * sysdeps/i386/fpu/libm-test-ulps: Update.
+ * sysdeps/x86_64/fpu/libm-test-ulps : Likewise.
+
2014-06-26 Joseph Myers <joseph@codesourcery.com>
* sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h
6804, 9894, 12994, 13347, 13651, 14308, 14770, 15119, 15132, 15347, 15514,
15698, 15804, 15894, 15946, 16002, 16064, 16095, 16198, 16284, 16287,
16315, 16348, 16349, 16354, 16357, 16362, 16447, 16516, 16532, 16539,
- 16545, 16564, 16574, 16599, 16600, 16609, 16610, 16611, 16613, 16619,
- 16623, 16629, 16632, 16634, 16639, 16642, 16648, 16649, 16670, 16674,
- 16677, 16680, 16681, 16683, 16689, 16695, 16701, 16706, 16707, 16712,
- 16713, 16714, 16724, 16731, 16739, 16740, 16743, 16754, 16758, 16759,
- 16760, 16770, 16786, 16789, 16791, 16796, 16799, 16800, 16815, 16823,
- 16824, 16831, 16838, 16849, 16854, 16876, 16877, 16878, 16882, 16885,
- 16888, 16890, 16912, 16915, 16916, 16917, 16918, 16922, 16927, 16928,
- 16932, 16943, 16958, 16965, 16966, 16967, 16977, 16978, 16984, 16990,
- 16996, 17009, 17022, 17031, 17042, 17048, 17050, 17058, 17061, 17062,
- 17069, 17075, 17079, 17084, 17086.
+ 16545, 16561, 16562, 16564, 16574, 16599, 16600, 16609, 16610, 16611,
+ 16613, 16619, 16623, 16629, 16632, 16634, 16639, 16642, 16648, 16649,
+ 16670, 16674, 16677, 16680, 16681, 16683, 16689, 16695, 16701, 16706,
+ 16707, 16712, 16713, 16714, 16724, 16731, 16739, 16740, 16743, 16754,
+ 16758, 16759, 16760, 16770, 16786, 16789, 16791, 16796, 16799, 16800,
+ 16815, 16823, 16824, 16831, 16838, 16849, 16854, 16876, 16877, 16878,
+ 16882, 16885, 16888, 16890, 16912, 16915, 16916, 16917, 16918, 16922,
+ 16927, 16928, 16932, 16943, 16958, 16965, 16966, 16967, 16977, 16978,
+ 16984, 16990, 16996, 17009, 17022, 17031, 17042, 17048, 17050, 17058,
+ 17061, 17062, 17069, 17075, 17079, 17084, 17086.
* Optimized strchr implementation for AArch64. Contributed by ARM Ltd.
static void
yn_test (void)
{
- START (yn, 0);
- RUN_TEST_LOOP_if_f (yn, yn_test_data, );
- END;
+ ALL_RM_TEST (yn, 0, yn_test_data, RUN_TEST_LOOP_if_f, END);
}
#else
# define libc_feholdexcept_setround_ctx libc_feholdexcept_setround_387_ctx
# define libc_feupdateenv_ctx libc_feupdateenv_387_ctx
+# define libc_feholdsetround_ctx libc_feholdsetround_387_ctx
# define libc_feresetround_ctx libc_feresetround_387_ctx
#endif /* __SSE2_MATH__ */
ildouble: 4
ldouble: 4
+Function: "yn_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 5
+ldouble: 5
+
+Function: "yn_towardzero":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+ildouble: 5
+ldouble: 5
+
+Function: "yn_upward":
+double: 2
+float: 3
+idouble: 2
+ifloat: 3
+ildouble: 4
+ldouble: 4
+
# end of automatic generation
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
{
int32_t i, hx, ix, lx;
int32_t sign;
- double a, b, temp;
+ double a, b, temp, ret;
EXTRACT_WORDS (hx, lx, x);
ix = 0x7fffffff & hx;
}
if (n == 0)
return (__ieee754_y0 (x));
- if (n == 1)
- return (sign * __ieee754_y1 (x));
- if (__glibc_unlikely (ix == 0x7ff00000))
- return zero;
- if (ix >= 0x52D00000) /* x > 2**302 */
- { /* (x >> n**2)
- * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Let s=sin(x), c=cos(x),
- * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
- *
- * n sin(xn)*sqt2 cos(xn)*sqt2
- * ----------------------------------
- * 0 s-c c+s
- * 1 -s-c -c+s
- * 2 -s+c -c-s
- * 3 s+c c-s
- */
- double c;
- double s;
- __sincos (x, &s, &c);
- switch (n & 3)
- {
- case 0: temp = s - c; break;
- case 1: temp = -s - c; break;
- case 2: temp = -s + c; break;
- case 3: temp = s + c; break;
- }
- b = invsqrtpi * temp / __ieee754_sqrt (x);
- }
- else
- {
- u_int32_t high;
- a = __ieee754_y0 (x);
- b = __ieee754_y1 (x);
- /* quit if b is -inf */
- GET_HIGH_WORD (high, b);
- for (i = 1; i < n && high != 0xfff00000; i++)
- {
- temp = b;
- b = ((double) (i + i) / x) * b - a;
- GET_HIGH_WORD (high, b);
- a = temp;
- }
- /* If B is +-Inf, set up errno accordingly. */
- if (!__finite (b))
- __set_errno (ERANGE);
- }
- if (sign > 0)
- return b;
- else
- return -b;
+ {
+ SET_RESTORE_ROUND (FE_TONEAREST);
+ if (n == 1)
+ {
+ ret = sign * __ieee754_y1 (x);
+ goto out;
+ }
+ if (__glibc_unlikely (ix == 0x7ff00000))
+ return zero;
+ if (ix >= 0x52D00000) /* x > 2**302 */
+ { /* (x >> n**2)
+ * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Let s=sin(x), c=cos(x),
+ * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+ *
+ * n sin(xn)*sqt2 cos(xn)*sqt2
+ * ----------------------------------
+ * 0 s-c c+s
+ * 1 -s-c -c+s
+ * 2 -s+c -c-s
+ * 3 s+c c-s
+ */
+ double c;
+ double s;
+ __sincos (x, &s, &c);
+ switch (n & 3)
+ {
+ case 0: temp = s - c; break;
+ case 1: temp = -s - c; break;
+ case 2: temp = -s + c; break;
+ case 3: temp = s + c; break;
+ }
+ b = invsqrtpi * temp / __ieee754_sqrt (x);
+ }
+ else
+ {
+ u_int32_t high;
+ a = __ieee754_y0 (x);
+ b = __ieee754_y1 (x);
+ /* quit if b is -inf */
+ GET_HIGH_WORD (high, b);
+ for (i = 1; i < n && high != 0xfff00000; i++)
+ {
+ temp = b;
+ b = ((double) (i + i) / x) * b - a;
+ GET_HIGH_WORD (high, b);
+ a = temp;
+ }
+ /* If B is +-Inf, set up errno accordingly. */
+ if (!__finite (b))
+ __set_errno (ERANGE);
+ }
+ if (sign > 0)
+ ret = b;
+ else
+ ret = -b;
+ }
+ out:
+ if (__isinf (ret))
+ ret = __copysign (DBL_MAX, ret) * DBL_MAX;
+ return ret;
}
strong_alias (__ieee754_yn, __yn_finite)
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
float
__ieee754_ynf(int n, float x)
{
+ float ret;
+ {
int32_t i,hx,ix;
u_int32_t ib;
int32_t sign;
sign = 1 - ((n&1)<<1);
}
if(n==0) return(__ieee754_y0f(x));
- if(n==1) return(sign*__ieee754_y1f(x));
+ SET_RESTORE_ROUNDF (FE_TONEAREST);
+ if(n==1) {
+ ret = sign*__ieee754_y1f(x);
+ goto out;
+ }
if(__builtin_expect(ix==0x7f800000, 0)) return zero;
a = __ieee754_y0f(x);
/* If B is +-Inf, set up errno accordingly. */
if (! __finitef (b))
__set_errno (ERANGE);
- if(sign>0) return b; else return -b;
+ if(sign>0) ret = b; else ret = -b;
+ }
+ out:
+ if (__isinff (ret))
+ ret = __copysignf (FLT_MAX, ret) * FLT_MAX;
+ return ret;
}
strong_alias (__ieee754_ynf, __ynf_finite)
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
u_int32_t se;
int32_t i, ix;
int32_t sign;
- long double a, b, temp;
+ long double a, b, temp, ret;
ieee854_long_double_shape_type u;
u.value = x;
}
if (n == 0)
return (__ieee754_y0l (x));
- if (n == 1)
- return (sign * __ieee754_y1l (x));
- if (ix >= 0x7fff0000)
- return zero;
- if (ix >= 0x412D0000)
- { /* x > 2**302 */
+ {
+ SET_RESTORE_ROUNDL (FE_TONEAREST);
+ if (n == 1)
+ {
+ ret = sign * __ieee754_y1l (x);
+ goto out;
+ }
+ if (ix >= 0x7fff0000)
+ return zero;
+ if (ix >= 0x412D0000)
+ { /* x > 2**302 */
- /* ??? See comment above on the possible futility of this. */
+ /* ??? See comment above on the possible futility of this. */
- /* (x >> n**2)
- * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Let s=sin(x), c=cos(x),
- * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
- *
- * n sin(xn)*sqt2 cos(xn)*sqt2
- * ----------------------------------
- * 0 s-c c+s
- * 1 -s-c -c+s
- * 2 -s+c -c-s
- * 3 s+c c-s
- */
- long double s;
- long double c;
- __sincosl (x, &s, &c);
- switch (n & 3)
- {
- case 0:
- temp = s - c;
- break;
- case 1:
- temp = -s - c;
- break;
- case 2:
- temp = -s + c;
- break;
- case 3:
- temp = s + c;
- break;
- }
- b = invsqrtpi * temp / __ieee754_sqrtl (x);
- }
- else
- {
- a = __ieee754_y0l (x);
- b = __ieee754_y1l (x);
- /* quit if b is -inf */
- u.value = b;
- se = u.parts32.w0 & 0xffff0000;
- for (i = 1; i < n && se != 0xffff0000; i++)
- {
- temp = b;
- b = ((long double) (i + i) / x) * b - a;
- u.value = b;
- se = u.parts32.w0 & 0xffff0000;
- a = temp;
- }
- }
- /* If B is +-Inf, set up errno accordingly. */
- if (! __finitel (b))
- __set_errno (ERANGE);
- if (sign > 0)
- return b;
- else
- return -b;
+ /* (x >> n**2)
+ * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Let s=sin(x), c=cos(x),
+ * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+ *
+ * n sin(xn)*sqt2 cos(xn)*sqt2
+ * ----------------------------------
+ * 0 s-c c+s
+ * 1 -s-c -c+s
+ * 2 -s+c -c-s
+ * 3 s+c c-s
+ */
+ long double s;
+ long double c;
+ __sincosl (x, &s, &c);
+ switch (n & 3)
+ {
+ case 0:
+ temp = s - c;
+ break;
+ case 1:
+ temp = -s - c;
+ break;
+ case 2:
+ temp = -s + c;
+ break;
+ case 3:
+ temp = s + c;
+ break;
+ }
+ b = invsqrtpi * temp / __ieee754_sqrtl (x);
+ }
+ else
+ {
+ a = __ieee754_y0l (x);
+ b = __ieee754_y1l (x);
+ /* quit if b is -inf */
+ u.value = b;
+ se = u.parts32.w0 & 0xffff0000;
+ for (i = 1; i < n && se != 0xffff0000; i++)
+ {
+ temp = b;
+ b = ((long double) (i + i) / x) * b - a;
+ u.value = b;
+ se = u.parts32.w0 & 0xffff0000;
+ a = temp;
+ }
+ }
+ /* If B is +-Inf, set up errno accordingly. */
+ if (! __finitel (b))
+ __set_errno (ERANGE);
+ if (sign > 0)
+ ret = b;
+ else
+ ret = -b;
+ }
+ out:
+ if (__isinfl (ret))
+ ret = __copysignl (LDBL_MAX, ret) * LDBL_MAX;
+ return ret;
}
strong_alias (__ieee754_ynl, __ynl_finite)
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
uint32_t se, lx;
int32_t i, ix;
int32_t sign;
- long double a, b, temp;
+ long double a, b, temp, ret;
double xhi;
xhi = ldbl_high (x);
}
if (n == 0)
return (__ieee754_y0l (x));
- if (n == 1)
- return (sign * __ieee754_y1l (x));
- if (ix >= 0x7ff00000)
- return zero;
- if (ix >= 0x52D00000)
- { /* x > 2**302 */
+ {
+ SET_RESTORE_ROUNDL (FE_TONEAREST);
+ if (n == 1)
+ {
+ ret = sign * __ieee754_y1l (x);
+ goto out;
+ }
+ if (ix >= 0x7ff00000)
+ return zero;
+ if (ix >= 0x52D00000)
+ { /* x > 2**302 */
- /* ??? See comment above on the possible futility of this. */
+ /* ??? See comment above on the possible futility of this. */
- /* (x >> n**2)
- * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Let s=sin(x), c=cos(x),
- * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
- *
- * n sin(xn)*sqt2 cos(xn)*sqt2
- * ----------------------------------
- * 0 s-c c+s
- * 1 -s-c -c+s
- * 2 -s+c -c-s
- * 3 s+c c-s
- */
- long double s;
- long double c;
- __sincosl (x, &s, &c);
- switch (n & 3)
- {
- case 0:
- temp = s - c;
- break;
- case 1:
- temp = -s - c;
- break;
- case 2:
- temp = -s + c;
- break;
- case 3:
- temp = s + c;
- break;
- }
- b = invsqrtpi * temp / __ieee754_sqrtl (x);
- }
- else
- {
- a = __ieee754_y0l (x);
- b = __ieee754_y1l (x);
- /* quit if b is -inf */
- xhi = ldbl_high (b);
- GET_HIGH_WORD (se, xhi);
- se &= 0xfff00000;
- for (i = 1; i < n && se != 0xfff00000; i++)
- {
- temp = b;
- b = ((long double) (i + i) / x) * b - a;
- xhi = ldbl_high (b);
- GET_HIGH_WORD (se, xhi);
- se &= 0xfff00000;
- a = temp;
- }
- }
- /* If B is +-Inf, set up errno accordingly. */
- if (! __finitel (b))
- __set_errno (ERANGE);
- if (sign > 0)
- return b;
- else
- return -b;
+ /* (x >> n**2)
+ * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Let s=sin(x), c=cos(x),
+ * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+ *
+ * n sin(xn)*sqt2 cos(xn)*sqt2
+ * ----------------------------------
+ * 0 s-c c+s
+ * 1 -s-c -c+s
+ * 2 -s+c -c-s
+ * 3 s+c c-s
+ */
+ long double s;
+ long double c;
+ __sincosl (x, &s, &c);
+ switch (n & 3)
+ {
+ case 0:
+ temp = s - c;
+ break;
+ case 1:
+ temp = -s - c;
+ break;
+ case 2:
+ temp = -s + c;
+ break;
+ case 3:
+ temp = s + c;
+ break;
+ }
+ b = invsqrtpi * temp / __ieee754_sqrtl (x);
+ }
+ else
+ {
+ a = __ieee754_y0l (x);
+ b = __ieee754_y1l (x);
+ /* quit if b is -inf */
+ xhi = ldbl_high (b);
+ GET_HIGH_WORD (se, xhi);
+ se &= 0xfff00000;
+ for (i = 1; i < n && se != 0xfff00000; i++)
+ {
+ temp = b;
+ b = ((long double) (i + i) / x) * b - a;
+ xhi = ldbl_high (b);
+ GET_HIGH_WORD (se, xhi);
+ se &= 0xfff00000;
+ a = temp;
+ }
+ }
+ /* If B is +-Inf, set up errno accordingly. */
+ if (! __finitel (b))
+ __set_errno (ERANGE);
+ if (sign > 0)
+ ret = b;
+ else
+ ret = -b;
+ }
+ out:
+ if (__isinfl (ret))
+ ret = __copysignl (LDBL_MAX, ret) * LDBL_MAX;
+ return ret;
}
strong_alias (__ieee754_ynl, __ynl_finite)
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
u_int32_t se, i0, i1;
int32_t i, ix;
int32_t sign;
- long double a, b, temp;
+ long double a, b, temp, ret;
GET_LDOUBLE_WORDS (se, i0, i1, x);
}
if (n == 0)
return (__ieee754_y0l (x));
- if (n == 1)
- return (sign * __ieee754_y1l (x));
- if (__glibc_unlikely (ix == 0x7fff))
- return zero;
- if (ix >= 0x412D)
- { /* x > 2**302 */
+ {
+ SET_RESTORE_ROUNDL (FE_TONEAREST);
+ if (n == 1)
+ {
+ ret = sign * __ieee754_y1l (x);
+ goto out;
+ }
+ if (__glibc_unlikely (ix == 0x7fff))
+ return zero;
+ if (ix >= 0x412D)
+ { /* x > 2**302 */
- /* ??? See comment above on the possible futility of this. */
+ /* ??? See comment above on the possible futility of this. */
- /* (x >> n**2)
- * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
- * Let s=sin(x), c=cos(x),
- * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
- *
- * n sin(xn)*sqt2 cos(xn)*sqt2
- * ----------------------------------
- * 0 s-c c+s
- * 1 -s-c -c+s
- * 2 -s+c -c-s
- * 3 s+c c-s
- */
- long double s;
- long double c;
- __sincosl (x, &s, &c);
- switch (n & 3)
- {
- case 0:
- temp = s - c;
- break;
- case 1:
- temp = -s - c;
- break;
- case 2:
- temp = -s + c;
- break;
- case 3:
- temp = s + c;
- break;
- }
- b = invsqrtpi * temp / __ieee754_sqrtl (x);
- }
- else
- {
- a = __ieee754_y0l (x);
- b = __ieee754_y1l (x);
- /* quit if b is -inf */
- GET_LDOUBLE_WORDS (se, i0, i1, b);
- /* Use 0xffffffff since GET_LDOUBLE_WORDS sign-extends SE. */
- for (i = 1; i < n && se != 0xffffffff; i++)
- {
- temp = b;
- b = ((long double) (i + i) / x) * b - a;
- GET_LDOUBLE_WORDS (se, i0, i1, b);
- a = temp;
- }
- }
- /* If B is +-Inf, set up errno accordingly. */
- if (! __finitel (b))
- __set_errno (ERANGE);
- if (sign > 0)
- return b;
- else
- return -b;
+ /* (x >> n**2)
+ * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+ * Let s=sin(x), c=cos(x),
+ * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+ *
+ * n sin(xn)*sqt2 cos(xn)*sqt2
+ * ----------------------------------
+ * 0 s-c c+s
+ * 1 -s-c -c+s
+ * 2 -s+c -c-s
+ * 3 s+c c-s
+ */
+ long double s;
+ long double c;
+ __sincosl (x, &s, &c);
+ switch (n & 3)
+ {
+ case 0:
+ temp = s - c;
+ break;
+ case 1:
+ temp = -s - c;
+ break;
+ case 2:
+ temp = -s + c;
+ break;
+ case 3:
+ temp = s + c;
+ break;
+ }
+ b = invsqrtpi * temp / __ieee754_sqrtl (x);
+ }
+ else
+ {
+ a = __ieee754_y0l (x);
+ b = __ieee754_y1l (x);
+ /* quit if b is -inf */
+ GET_LDOUBLE_WORDS (se, i0, i1, b);
+ /* Use 0xffffffff since GET_LDOUBLE_WORDS sign-extends SE. */
+ for (i = 1; i < n && se != 0xffffffff; i++)
+ {
+ temp = b;
+ b = ((long double) (i + i) / x) * b - a;
+ GET_LDOUBLE_WORDS (se, i0, i1, b);
+ a = temp;
+ }
+ }
+ /* If B is +-Inf, set up errno accordingly. */
+ if (! __finitel (b))
+ __set_errno (ERANGE);
+ if (sign > 0)
+ ret = b;
+ else
+ ret = -b;
+ }
+ out:
+ if (__isinfl (ret))
+ ret = __copysignl (LDBL_MAX, ret) * LDBL_MAX;
+ return ret;
}
strong_alias (__ieee754_ynl, __ynl_finite)
ildouble: 4
ldouble: 4
+Function: "yn_downward":
+double: 3
+float: 4
+idouble: 3
+ifloat: 4
+ildouble: 5
+ldouble: 5
+
+Function: "yn_towardzero":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+ildouble: 5
+ldouble: 5
+
+Function: "yn_upward":
+double: 4
+float: 5
+idouble: 4
+ifloat: 5
+ildouble: 4
+ldouble: 4
+
# end of automatic generation