// Copyright 2024 The Libc Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build !(linux && (amd64 || arm64 || loong64)) package libc // import "modernc.org/libc" import ( "math" "unsafe" ) func Xsin(t *TLS, x float64) float64 { return math.Sin(x) } func Xsinf(t *TLS, x float32) float32 { return float32(math.Sin(float64(x))) } func Xsinh(t *TLS, x float64) float64 { return math.Sinh(x) } func Xsinhf(t *TLS, x float32) float32 { return float32(math.Sinh(float64(x))) } func Xcos(t *TLS, x float64) float64 { return math.Cos(x) } func Xcosf(t *TLS, x float32) float32 { return float32(math.Cos(float64(x))) } func Xcosh(t *TLS, x float64) float64 { return math.Cosh(x) } func Xcoshf(t *TLS, x float32) float32 { return float32(math.Cosh(float64(x))) } func Xtan(t *TLS, x float64) float64 { return math.Tan(x) } func Xtanf(t *TLS, x float32) float32 { return float32(math.Tan(float64(x))) } func Xtanh(t *TLS, x float64) float64 { return math.Tanh(x) } func Xtanhf(t *TLS, x float32) float32 { return float32(math.Tanh(float64(x))) } func Xasin(t *TLS, x float64) float64 { return math.Asin(x) } func Xasinf(t *TLS, x float32) float32 { return float32(math.Asin(float64(x))) } func Xasinh(t *TLS, x float64) float64 { return math.Asinh(x) } func Xasinhf(t *TLS, x float32) float32 { return float32(math.Asinh(float64(x))) } func Xacos(t *TLS, x float64) float64 { return math.Acos(x) } func Xacosf(t *TLS, x float32) float32 { return float32(math.Acos(float64(x))) } func Xacosh(t *TLS, x float64) float64 { return math.Acosh(x) } func Xacoshf(t *TLS, x float32) float32 { return float32(math.Acosh(float64(x))) } func Xatan(t *TLS, x float64) float64 { return math.Atan(x) } func Xatanf(t *TLS, x float32) float32 { return float32(math.Atan(float64(x))) } func Xatan2(t *TLS, x, y float64) float64 { return math.Atan2(x, y) } func Xatan2f(t *TLS, x, y float32) float32 { return float32(math.Atan2(float64(x), float64(y))) } func Xatanh(t *TLS, x float64) float64 { return math.Atanh(x) } func Xatanhf(t *TLS, x float32) float32 { return float32(math.Atanh(float64(x))) } func Xexp(t *TLS, x float64) float64 { return math.Exp(x) } func Xexpf(t *TLS, x float32) float32 { return float32(math.Exp(float64(x))) } func Xfabs(t *TLS, x float64) float64 { return math.Abs(x) } func Xfabsf(t *TLS, x float32) float32 { return float32(math.Abs(float64(x))) } func Xlog(t *TLS, x float64) float64 { return math.Log(x) } func Xlogf(t *TLS, x float32) float32 { return float32(math.Log(float64(x))) } func Xlog10(t *TLS, x float64) float64 { return math.Log10(x) } func Xlog10f(t *TLS, x float32) float32 { return float32(math.Log10(float64(x))) } func Xlog2(t *TLS, x float64) float64 { return math.Log2(x) } func Xlog2f(t *TLS, x float32) float32 { return float32(math.Log2(float64(x))) } func Xpow(t *TLS, x, y float64) float64 { r := math.Pow(x, y) if x > 0 && r == 1 && y >= -1.0000000000000000715e-18 && y < -1e-30 { r = 0.9999999999999999 } return r } func Xpowf(t *TLS, x, y float32) float32 { return float32(math.Pow(float64(x), float64(y))) } func Xsqrt(t *TLS, x float64) float64 { return math.Sqrt(x) } func Xsqrtf(t *TLS, x float32) float32 { return float32(math.Sqrt(float64(x))) } func Xround(t *TLS, x float64) float64 { return math.Round(x) } func Xroundf(t *TLS, x float32) float32 { return float32(math.Round(float64(x))) } func Xceil(t *TLS, x float64) float64 { return math.Ceil(x) } func Xceilf(t *TLS, x float32) float32 { return float32(math.Ceil(float64(x))) } func Xfloor(t *TLS, x float64) float64 { return math.Floor(x) } func Xfloorf(t *TLS, x float32) float32 { return float32(math.Floor(float64(x))) } func Xcopysign(t *TLS, x, y float64) float64 { return math.Copysign(x, y) } func Xcopysignf(t *TLS, x, y float32) float32 { return float32(math.Copysign(float64(x), float64(y))) } func Xfmod(t *TLS, x, y float64) float64 { return math.Mod(x, y) } func Xfmodf(t *TLS, x, y float32) float32 { return float32(math.Mod(float64(x), float64(y))) } func Xhypot(t *TLS, x, y float64) float64 { return math.Hypot(x, y) } func Xhypotf(t *TLS, x, y float32) float32 { return float32(math.Hypot(float64(x), float64(y))) } func Xisnan(t *TLS, x float64) int32 { return Bool32(math.IsNaN(x)) } func Xisnanf(t *TLS, x float32) int32 { return Bool32(math.IsNaN(float64(x))) } func Xisnanl(t *TLS, x float64) int32 { return Bool32(math.IsNaN(x)) } func Xldexp(t *TLS, x float64, exp int32) float64 { return math.Ldexp(x, int(exp)) } func Xtrunc(t *TLS, x float64) float64 { return math.Trunc(x) } func Xtruncf(t *TLS, x float32) float32 { return float32(math.Trunc(float64(x))) } func Xfrexp(t *TLS, x float64, exp uintptr) float64 { f, e := math.Frexp(x) *(*int32)(unsafe.Pointer(exp)) = int32(e) return f } func Xfrexpf(t *TLS, x float32, exp uintptr) float32 { f, e := math.Frexp(float64(x)) *(*int32)(unsafe.Pointer(exp)) = int32(e) return float32(f) } func Xmodf(t *TLS, x float64, iptr uintptr) float64 { i, f := math.Modf(x) *(*float64)(unsafe.Pointer(iptr)) = i return f } func Xmodff(t *TLS, x float32, iptr uintptr) float32 { i, f := math.Modf(float64(x)) *(*float32)(unsafe.Pointer(iptr)) = float32(i) return float32(f) } var _toint5 = Float32FromInt32(1) / Float32FromFloat32(1.1920928955078125e-07) func Xrintf(tls *TLS, x float32) (r float32) { bp := tls.Alloc(16) defer tls.Free(16) var e, s int32 var y float32 var v1 float32 var _ /* u at bp+0 */ struct { Fi [0]uint32 Ff float32 } _, _, _, _ = e, s, y, v1 *(*struct { Fi [0]uint32 Ff float32 })(unsafe.Pointer(bp)) = struct { Fi [0]uint32 Ff float32 }{} *(*float32)(unsafe.Pointer(bp)) = x e = int32(*(*uint32)(unsafe.Pointer(bp)) >> int32(23) & uint32(0xff)) s = int32(*(*uint32)(unsafe.Pointer(bp)) >> int32(31)) if e >= Int32FromInt32(0x7f)+Int32FromInt32(23) { return x } if s != 0 { y = x - _toint5 + _toint5 } else { y = x + _toint5 - _toint5 } if y == Float32FromInt32(0) { if s != 0 { v1 = -Float32FromFloat32(0) } else { v1 = Float32FromFloat32(0) } return v1 } return y } func Xlrintf(tls *TLS, x float32) (r long) { return long(Xrintf(tls, x)) } func Xlrint(tls *TLS, x float64) (r long) { return long(Xrint(tls, x)) } func Xrint(tls *TLS, x float64) float64 { switch { case x == 0: // also +0 and -0 return 0 case math.IsInf(x, 0), math.IsNaN(x): return x case x >= math.MinInt64 && x <= math.MaxInt64 && float64(int64(x)) == x: return x case x >= 0: return math.Floor(x + 0.5) default: return math.Ceil(x - 0.5) } }