mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 07:15:46 +00:00
Backed out 6 changesets (bug 531915) for causing build bustages. CLOSED TREE
Backed out changeset 65cf5929d5f2 (bug 531915) Backed out changeset c9d70e46dfca (bug 531915) Backed out changeset a4824d5f29fd (bug 531915) Backed out changeset 9ec88b43d7a1 (bug 531915) Backed out changeset 5f15204ccca9 (bug 531915) Backed out changeset 14c95ef3dc44 (bug 531915)
This commit is contained in:
parent
21ef77522a
commit
538f123b07
@ -20,7 +20,6 @@ https_first_disabled = true
|
||||
skip-if =
|
||||
(os == "mac") #Bug 1570812
|
||||
os == 'linux' && bits == 64 && !debug # Bug 1570812
|
||||
[browser_math.js]
|
||||
[browser_navigator.js]
|
||||
https_first_disabled = true
|
||||
skip-if =
|
||||
|
@ -1,107 +0,0 @@
|
||||
/**
|
||||
* Bug 531915 - A test for verifying that the JS Math fingerprint is constant
|
||||
* when using fdlibm for Math.sin, Math.cos, and Math.tan.
|
||||
*/
|
||||
|
||||
async function test_math(rfp_pref, fdlibm_pref) {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
["javascript.options.use_fdlibm_for_sin_cos_tan", fdlibm_pref],
|
||||
["privacy.resistFingerprinting", rfp_pref],
|
||||
],
|
||||
});
|
||||
|
||||
let tab = await BrowserTestUtils.openNewForegroundTab(
|
||||
gBrowser,
|
||||
TEST_PATH + "file_dummy.html"
|
||||
);
|
||||
|
||||
await SpecialPowers.spawn(tab.linkedBrowser, [], async function() {
|
||||
// override is to check strict equality like we would do in a JS ref test.
|
||||
function strictly_is(a, b) {
|
||||
ok(a === b);
|
||||
}
|
||||
|
||||
//
|
||||
// Tests adapted from https://github.com/arkenfox/TZP/blob/5e3f5ff2c64b4edc7beecd8308aa4f7a3efb49e3/tests/math.html#L158-L319
|
||||
//
|
||||
strictly_is(Math.cos(1e251), -0.37419577499634155);
|
||||
strictly_is(Math.cos(1e140), -0.7854805190645291);
|
||||
strictly_is(Math.cos(1e12), 0.7914463018528902);
|
||||
strictly_is(Math.cos(1e130), -0.767224894221913);
|
||||
strictly_is(Math.cos(1e272), -0.7415825695514536);
|
||||
strictly_is(Math.cos(1), 0.5403023058681398);
|
||||
strictly_is(Math.cos(1e284), 0.7086865671674247);
|
||||
strictly_is(Math.cos(1e75), -0.7482651726250321);
|
||||
strictly_is(Math.cos(Math.PI), -1);
|
||||
strictly_is(Math.cos(-1e308), -0.8913089376870335);
|
||||
strictly_is(Math.cos(13 * Math.E), -0.7108118501064332);
|
||||
strictly_is(Math.cos(57 * Math.E), -0.536911695749024);
|
||||
strictly_is(Math.cos(21 * Math.LN2), -0.4067775970251724);
|
||||
strictly_is(Math.cos(51 * Math.LN2), -0.7017203400855446);
|
||||
strictly_is(Math.cos(21 * Math.LOG2E), 0.4362848063618998);
|
||||
strictly_is(Math.cos(25 * Math.SQRT2), -0.6982689820462377);
|
||||
strictly_is(Math.cos(50 * Math.SQRT1_2), -0.6982689820462377);
|
||||
strictly_is(Math.cos(21 * Math.SQRT1_2), -0.6534063185820198);
|
||||
strictly_is(Math.cos(17 * Math.LOG10E), 0.4537557425982784);
|
||||
strictly_is(Math.cos(2 * Math.LOG10E), 0.6459044007438142);
|
||||
|
||||
strictly_is(Math.sin(1e251), -0.9273497301314576);
|
||||
strictly_is(Math.sin(1e140), -0.6188863822787813);
|
||||
strictly_is(Math.sin(1e12), -0.6112387023768895);
|
||||
strictly_is(Math.sin(1e130), 0.6413781736901984);
|
||||
strictly_is(Math.sin(1e272), 0.6708616046081811);
|
||||
strictly_is(Math.sin(1), 0.8414709848078965);
|
||||
strictly_is(Math.sin(1e284), -0.7055234578073583);
|
||||
strictly_is(Math.sin(1e75), 0.66339975236386);
|
||||
strictly_is(Math.sin(Math.PI), 1.2246467991473532e-16);
|
||||
strictly_is(Math.sin(39 * Math.E), -0.7181630308570678);
|
||||
strictly_is(Math.sin(35 * Math.LN2), -0.765996413898051);
|
||||
strictly_is(Math.sin(110 * Math.LOG2E), 0.9989410140273757);
|
||||
strictly_is(Math.sin(7 * Math.LOG10E), 0.10135692924965616);
|
||||
strictly_is(Math.sin(35 * Math.SQRT1_2), -0.3746357547858202);
|
||||
strictly_is(Math.sin(21 * Math.SQRT2), -0.9892668187780497);
|
||||
|
||||
strictly_is(Math.tan(1e251), 2.478247463217681);
|
||||
strictly_is(Math.tan(1e140), 0.7879079967710036);
|
||||
strictly_is(Math.tan(1e12), -0.7723059681318761);
|
||||
strictly_is(Math.tan(1e130), -0.8359715365344825);
|
||||
strictly_is(Math.tan(1e272), -0.904635076595654);
|
||||
strictly_is(Math.tan(1), 1.5574077246549023);
|
||||
strictly_is(Math.tan(1e284), -0.9955366596368418);
|
||||
strictly_is(Math.tan(1e75), -0.8865837628611647);
|
||||
strictly_is(Math.tan(-1e308), 0.5086861259107568);
|
||||
strictly_is(Math.tan(Math.PI), -1.2246467991473532e-16);
|
||||
strictly_is(Math.tan(6 * Math.E), 0.6866761546452431);
|
||||
strictly_is(Math.tan(6 * Math.LN2), 1.6182817135715877);
|
||||
strictly_is(Math.tan(10 * Math.LOG2E), -3.3537128705376014);
|
||||
strictly_is(Math.tan(17 * Math.SQRT2), -1.9222955461799982);
|
||||
strictly_is(Math.tan(34 * Math.SQRT1_2), -1.9222955461799982);
|
||||
strictly_is(Math.tan(10 * Math.LOG10E), 2.5824856130712432);
|
||||
|
||||
//
|
||||
// Tests adapted from https://github.com/fingerprintjs/fingerprintjs/blob/7096a5589af495f1f46067963e13ad27d887d185/src/sources/math.ts#L32-L64
|
||||
//
|
||||
strictly_is(Math.acos(0.123124234234234242), 1.4473588658278522);
|
||||
strictly_is(Math.acosh(1e308), 709.889355822726);
|
||||
strictly_is(Math.asin(0.123124234234234242), 0.12343746096704435);
|
||||
strictly_is(Math.asinh(1), 0.881373587019543);
|
||||
strictly_is(Math.atanh(0.5), 0.5493061443340548);
|
||||
strictly_is(Math.atan(0.5), 0.4636476090008061);
|
||||
strictly_is(Math.sin(-1e300), 0.8178819121159085);
|
||||
strictly_is(Math.sinh(1), 1.1752011936438014);
|
||||
strictly_is(Math.cos(10.000000000123), -0.8390715290095377);
|
||||
strictly_is(Math.cosh(1), 1.5430806348152437);
|
||||
strictly_is(Math.tan(-1e300), -1.4214488238747245);
|
||||
strictly_is(Math.tanh(1), 0.7615941559557649);
|
||||
strictly_is(Math.exp(1), 2.718281828459045);
|
||||
strictly_is(Math.expm1(1), 1.718281828459045);
|
||||
strictly_is(Math.log1p(10), 2.3978952727983707);
|
||||
});
|
||||
|
||||
BrowserTestUtils.removeTab(tab);
|
||||
}
|
||||
|
||||
add_task(test_math.bind(null, false, true));
|
||||
add_task(test_math.bind(null, true, false));
|
||||
add_task(test_math.bind(null, true, true));
|
@ -167,8 +167,6 @@ class JS_PUBLIC_API TransitiveCompileOptions {
|
||||
uint32_t introductionOffset = 0;
|
||||
bool hasIntroductionInfo = false;
|
||||
|
||||
bool useFdlibmForSinCosTan = false;
|
||||
|
||||
protected:
|
||||
TransitiveCompileOptions() = default;
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
// |jit-test| --use-fdlibm-for-sin-cos-tan
|
||||
// Test that fdlibm is being used for sin, cos, and tan.
|
||||
|
||||
// Tests adapted from https://github.com/arkenfox/TZP/blob/master/tests/math.html#L158-L319
|
||||
assertEq(Math.cos(1e284), 0.7086865671674247);
|
||||
assertEq(Math.sin(7*Math.LOG10E), 0.10135692924965616);
|
||||
assertEq(Math.tan(6*Math.E), 0.6866761546452431);
|
@ -2329,7 +2329,6 @@ void JS::TransitiveCompileOptions::copyPODTransitiveOptions(
|
||||
classStaticBlocks = rhs.classStaticBlocks;
|
||||
useStencilXDR = rhs.useStencilXDR;
|
||||
useOffThreadParseGlobal = rhs.useOffThreadParseGlobal;
|
||||
useFdlibmForSinCosTan = rhs.useFdlibmForSinCosTan;
|
||||
};
|
||||
|
||||
void JS::ReadOnlyCompileOptions::copyPODNonTransitiveOptions(
|
||||
@ -2418,8 +2417,6 @@ JS::CompileOptions::CompileOptions(JSContext* cx) : ReadOnlyCompileOptions() {
|
||||
useStencilXDR = !UseOffThreadParseGlobal();
|
||||
useOffThreadParseGlobal = UseOffThreadParseGlobal();
|
||||
|
||||
useFdlibmForSinCosTan = math_use_fdlibm_for_sin_cos_tan();
|
||||
|
||||
sourcePragmas_ = cx->options().sourcePragmas();
|
||||
|
||||
// Certain modes of operation force strict-mode in general.
|
||||
|
@ -64,16 +64,6 @@
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
namespace JS {
|
||||
/**
|
||||
* Tell JS engine whether to use fdlibm for Math.sin, Math.cos, and Math.tan.
|
||||
* Using fdlibm ensures that we don't expose a math fingerprint.
|
||||
*/
|
||||
extern JS_PUBLIC_API void SetUseFdlibmForSinCosTan(bool value);
|
||||
} // namespace JS
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
struct JSFunctionSpec;
|
||||
struct JSPropertySpec;
|
||||
|
||||
|
@ -52,12 +52,6 @@ using mozilla::NumberEqualsInt32;
|
||||
using mozilla::PositiveInfinity;
|
||||
using mozilla::WrappingMultiply;
|
||||
|
||||
static mozilla::Atomic<bool, mozilla::Relaxed> sUseFdlibmForSinCosTan;
|
||||
|
||||
JS_PUBLIC_API void JS::SetUseFdlibmForSinCosTan(bool value) {
|
||||
sUseFdlibmForSinCosTan = value;
|
||||
}
|
||||
|
||||
template <UnaryMathFunctionType F>
|
||||
static bool math_function(JSContext* cx, HandleValue val,
|
||||
MutableHandleValue res) {
|
||||
@ -212,25 +206,13 @@ bool js::math_clz32(JSContext* cx, unsigned argc, Value* vp) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool js::math_use_fdlibm_for_sin_cos_tan() { return sUseFdlibmForSinCosTan; }
|
||||
|
||||
double js::math_cos_fdlibm_impl(double x) {
|
||||
MOZ_ASSERT(sUseFdlibmForSinCosTan);
|
||||
AutoUnsafeCallWithABI unsafe;
|
||||
return fdlibm::cos(x);
|
||||
}
|
||||
|
||||
double js::math_cos_native_impl(double x) {
|
||||
MOZ_ASSERT(!sUseFdlibmForSinCosTan);
|
||||
double js::math_cos_impl(double x) {
|
||||
AutoUnsafeCallWithABI unsafe;
|
||||
return cos(x);
|
||||
}
|
||||
|
||||
bool js::math_cos(JSContext* cx, unsigned argc, Value* vp) {
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_function<math_cos_fdlibm_impl>(cx, argc, vp);
|
||||
}
|
||||
return math_function<math_cos_native_impl>(cx, argc, vp);
|
||||
return math_function<math_cos_impl>(cx, argc, vp);
|
||||
}
|
||||
|
||||
double js::math_exp_impl(double x) {
|
||||
@ -600,31 +582,18 @@ js::math_round(JSContext* cx, unsigned argc, Value* vp) {
|
||||
return math_round_handle(cx, args[0], args.rval());
|
||||
}
|
||||
|
||||
double js::math_sin_fdlibm_impl(double x) {
|
||||
MOZ_ASSERT(sUseFdlibmForSinCosTan);
|
||||
AutoUnsafeCallWithABI unsafe;
|
||||
return fdlibm::sin(x);
|
||||
}
|
||||
|
||||
double js::math_sin_native_impl(double x) {
|
||||
MOZ_ASSERT(!sUseFdlibmForSinCosTan);
|
||||
double js::math_sin_impl(double x) {
|
||||
AutoUnsafeCallWithABI unsafe(UnsafeABIStrictness::AllowPendingExceptions);
|
||||
return sin(x);
|
||||
}
|
||||
|
||||
bool js::math_sin_handle(JSContext* cx, HandleValue val,
|
||||
MutableHandleValue res) {
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_function<math_sin_fdlibm_impl>(cx, val, res);
|
||||
}
|
||||
return math_function<math_sin_native_impl>(cx, val, res);
|
||||
return math_function<math_sin_impl>(cx, val, res);
|
||||
}
|
||||
|
||||
bool js::math_sin(JSContext* cx, unsigned argc, Value* vp) {
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_function<math_sin_fdlibm_impl>(cx, argc, vp);
|
||||
}
|
||||
return math_function<math_sin_native_impl>(cx, argc, vp);
|
||||
return math_function<math_sin_impl>(cx, argc, vp);
|
||||
}
|
||||
|
||||
double js::math_sqrt_impl(double x) {
|
||||
@ -641,23 +610,13 @@ bool js::math_sqrt(JSContext* cx, unsigned argc, Value* vp) {
|
||||
return math_function<math_sqrt_impl>(cx, argc, vp);
|
||||
}
|
||||
|
||||
double js::math_tan_fdlibm_impl(double x) {
|
||||
MOZ_ASSERT(sUseFdlibmForSinCosTan);
|
||||
AutoUnsafeCallWithABI unsafe;
|
||||
return fdlibm::tan(x);
|
||||
}
|
||||
|
||||
double js::math_tan_native_impl(double x) {
|
||||
MOZ_ASSERT(!sUseFdlibmForSinCosTan);
|
||||
double js::math_tan_impl(double x) {
|
||||
AutoUnsafeCallWithABI unsafe;
|
||||
return tan(x);
|
||||
}
|
||||
|
||||
bool js::math_tan(JSContext* cx, unsigned argc, Value* vp) {
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_function<math_tan_fdlibm_impl>(cx, argc, vp);
|
||||
}
|
||||
return math_function<math_tan_native_impl>(cx, argc, vp);
|
||||
return math_function<math_tan_impl>(cx, argc, vp);
|
||||
}
|
||||
|
||||
double js::math_log10_impl(double x) {
|
||||
@ -926,22 +885,13 @@ UnaryMathFunctionType js::GetUnaryMathFunctionPtr(UnaryMathFunction fun) {
|
||||
case UnaryMathFunction::Log:
|
||||
return math_log_impl;
|
||||
case UnaryMathFunction::Sin:
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_sin_fdlibm_impl;
|
||||
}
|
||||
return math_sin_native_impl;
|
||||
return math_sin_impl;
|
||||
case UnaryMathFunction::Cos:
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_cos_fdlibm_impl;
|
||||
}
|
||||
return math_cos_native_impl;
|
||||
return math_cos_impl;
|
||||
case UnaryMathFunction::Exp:
|
||||
return math_exp_impl;
|
||||
case UnaryMathFunction::Tan:
|
||||
if (sUseFdlibmForSinCosTan) {
|
||||
return math_tan_fdlibm_impl;
|
||||
}
|
||||
return math_tan_native_impl;
|
||||
return math_tan_impl;
|
||||
case UnaryMathFunction::ATan:
|
||||
return math_atan_impl;
|
||||
case UnaryMathFunction::ASin:
|
||||
|
@ -109,20 +109,16 @@ extern double math_log_impl(double x);
|
||||
extern bool math_log_handle(JSContext* cx, HandleValue val,
|
||||
MutableHandleValue res);
|
||||
|
||||
extern bool math_use_fdlibm_for_sin_cos_tan();
|
||||
|
||||
extern bool math_sin(JSContext* cx, unsigned argc, js::Value* vp);
|
||||
|
||||
extern double math_sin_fdlibm_impl(double x);
|
||||
extern double math_sin_native_impl(double x);
|
||||
extern double math_sin_impl(double x);
|
||||
|
||||
extern bool math_sin_handle(JSContext* cx, HandleValue val,
|
||||
MutableHandleValue res);
|
||||
|
||||
extern bool math_cos(JSContext* cx, unsigned argc, js::Value* vp);
|
||||
|
||||
extern double math_cos_fdlibm_impl(double x);
|
||||
extern double math_cos_native_impl(double x);
|
||||
extern double math_cos_impl(double x);
|
||||
|
||||
extern bool math_exp(JSContext* cx, unsigned argc, js::Value* vp);
|
||||
|
||||
@ -130,8 +126,7 @@ extern double math_exp_impl(double x);
|
||||
|
||||
extern bool math_tan(JSContext* cx, unsigned argc, js::Value* vp);
|
||||
|
||||
extern double math_tan_fdlibm_impl(double x);
|
||||
extern double math_tan_native_impl(double x);
|
||||
extern double math_tan_impl(double x);
|
||||
|
||||
extern bool math_log10(JSContext* cx, unsigned argc, js::Value* vp);
|
||||
|
||||
|
@ -638,8 +638,6 @@ bool shell::compileOnly = false;
|
||||
bool shell::disableOOMFunctions = false;
|
||||
bool shell::defaultToSameCompartment = true;
|
||||
|
||||
bool shell::useFdlibmForSinCosTan = false;
|
||||
|
||||
#ifdef DEBUG
|
||||
bool shell::dumpEntrainedVariables = false;
|
||||
bool shell::OOM_printAllocationCount = false;
|
||||
@ -11276,7 +11274,6 @@ static bool SetContextOptions(JSContext* cx, const OptionParser& op) {
|
||||
enableTopLevelAwait = op.getBoolOption("enable-top-level-await");
|
||||
enableClassStaticBlocks = op.getBoolOption("enable-class-static-blocks");
|
||||
useOffThreadParseGlobal = op.getBoolOption("off-thread-parse-global");
|
||||
useFdlibmForSinCosTan = op.getBoolOption("use-fdlibm-for-sin-cos-tan");
|
||||
|
||||
JS::ContextOptionsRef(cx)
|
||||
.setAsmJS(enableAsmJS)
|
||||
@ -11310,7 +11307,6 @@ static bool SetContextOptions(JSContext* cx, const OptionParser& op) {
|
||||
.setClassStaticBlocks(enableClassStaticBlocks);
|
||||
|
||||
JS::SetUseOffThreadParseGlobal(useOffThreadParseGlobal);
|
||||
JS::SetUseFdlibmForSinCosTan(useFdlibmForSinCosTan);
|
||||
|
||||
// Check --fast-warmup first because it sets default warm-up thresholds. These
|
||||
// thresholds can then be overridden below by --ion-eager and other flags.
|
||||
@ -12494,9 +12490,7 @@ int main(int argc, char** argv) {
|
||||
!op.addBoolOption('\0', "reprl", "Enable REPRL mode for fuzzing") ||
|
||||
#endif
|
||||
!op.addStringOption('\0', "telemetry-dir", "[directory]",
|
||||
"Output telemetry results in a directory") ||
|
||||
!op.addBoolOption('\0', "use-fdlibm-for-sin-cos-tan",
|
||||
"Use fdlibm for Math.sin, Math.cos, and Math.tan")) {
|
||||
"Output telemetry results in a directory")) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -157,8 +157,6 @@ extern bool dumpEntrainedVariables;
|
||||
extern bool OOM_printAllocationCount;
|
||||
#endif
|
||||
|
||||
extern bool useFdlibmForSinCosTan;
|
||||
|
||||
extern UniqueChars processWideModuleLoadPath;
|
||||
|
||||
// Alias the global dstName to namespaceObj.srcName. For example, if dstName is
|
||||
|
@ -1427,12 +1427,10 @@ bool wasm::NeedsBuiltinThunk(SymbolicAddress sym) {
|
||||
// Each JS builtin can have several overloads. These must all be enumerated in
|
||||
// PopulateTypedNatives() so they can be included in the process-wide thunk set.
|
||||
|
||||
#define FOR_EACH_SIN_COS_TAN_NATIVE(_) \
|
||||
_(math_sin, MathSin) \
|
||||
_(math_tan, MathTan) \
|
||||
_(math_cos, MathCos)
|
||||
|
||||
#define FOR_EACH_UNARY_NATIVE(_) \
|
||||
_(math_sin, MathSin) \
|
||||
_(math_tan, MathTan) \
|
||||
_(math_cos, MathCos) \
|
||||
_(math_exp, MathExp) \
|
||||
_(math_log, MathLog) \
|
||||
_(math_asin, MathASin) \
|
||||
@ -1457,14 +1455,6 @@ bool wasm::NeedsBuiltinThunk(SymbolicAddress sym) {
|
||||
_(ecmaHypot, MathHypot) \
|
||||
_(ecmaPow, MathPow)
|
||||
|
||||
#define DEFINE_SIN_COS_TAN_FLOAT_WRAPPER(func, _) \
|
||||
static float func##_impl_f32(float x) { \
|
||||
if (math_use_fdlibm_for_sin_cos_tan()) { \
|
||||
return float(func##_fdlibm_impl(double(x))); \
|
||||
} \
|
||||
return float(func##_native_impl(double(x))); \
|
||||
}
|
||||
|
||||
#define DEFINE_UNARY_FLOAT_WRAPPER(func, _) \
|
||||
static float func##_impl_f32(float x) { \
|
||||
return float(func##_impl(double(x))); \
|
||||
@ -1475,7 +1465,6 @@ bool wasm::NeedsBuiltinThunk(SymbolicAddress sym) {
|
||||
return float(func(double(x), double(y))); \
|
||||
}
|
||||
|
||||
FOR_EACH_SIN_COS_TAN_NATIVE(DEFINE_SIN_COS_TAN_FLOAT_WRAPPER)
|
||||
FOR_EACH_UNARY_NATIVE(DEFINE_UNARY_FLOAT_WRAPPER)
|
||||
FOR_EACH_BINARY_NATIVE(DEFINE_BINARY_FLOAT_WRAPPER)
|
||||
|
||||
@ -1507,14 +1496,6 @@ static bool PopulateTypedNatives(TypedNativeToFuncPtrMap* typedNatives) {
|
||||
FuncCast(funcName, abiType))) \
|
||||
return false;
|
||||
|
||||
#define ADD_SIN_COS_TAN_OVERLOADS(funcName, native) \
|
||||
if (math_use_fdlibm_for_sin_cos_tan()) { \
|
||||
ADD_OVERLOAD(funcName##_fdlibm_impl, native, Args_Double_Double) \
|
||||
} else { \
|
||||
ADD_OVERLOAD(funcName##_native_impl, native, Args_Double_Double) \
|
||||
} \
|
||||
ADD_OVERLOAD(funcName##_impl_f32, native, Args_Float32_Float32)
|
||||
|
||||
#define ADD_UNARY_OVERLOADS(funcName, native) \
|
||||
ADD_OVERLOAD(funcName##_impl, native, Args_Double_Double) \
|
||||
ADD_OVERLOAD(funcName##_impl_f32, native, Args_Float32_Float32)
|
||||
@ -1523,7 +1504,6 @@ static bool PopulateTypedNatives(TypedNativeToFuncPtrMap* typedNatives) {
|
||||
ADD_OVERLOAD(funcName, native, Args_Double_DoubleDouble) \
|
||||
ADD_OVERLOAD(funcName##_f32, native, Args_Float32_Float32Float32)
|
||||
|
||||
FOR_EACH_SIN_COS_TAN_NATIVE(ADD_SIN_COS_TAN_OVERLOADS)
|
||||
FOR_EACH_UNARY_NATIVE(ADD_UNARY_OVERLOADS)
|
||||
FOR_EACH_BINARY_NATIVE(ADD_BINARY_OVERLOADS)
|
||||
|
||||
|
@ -1048,10 +1048,6 @@ static void ReloadPrefsCallback(const char* pref, void* aXpccx) {
|
||||
.setErgnomicBrandChecks(ergnomicBrandChecksEnabled)
|
||||
.setTopLevelAwait(topLevelAwaitEnabled);
|
||||
|
||||
JS::SetUseFdlibmForSinCosTan(
|
||||
Preferences::GetBool(JS_OPTIONS_DOT_STR "use_fdlibm_for_sin_cos_tan") ||
|
||||
Preferences::GetBool("privacy.resistFingerprinting"));
|
||||
|
||||
nsCOMPtr<nsIXULRuntime> xr = do_GetService("@mozilla.org/xre/runtime;1");
|
||||
if (xr) {
|
||||
bool safeMode = false;
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
BASE_URL=https://raw.githubusercontent.com/freebsd/freebsd-src/"${1}"/lib/msun/src
|
||||
BASE_URL=https://raw.githubusercontent.com/freebsd/freebsd/"${1}"/lib/msun/src
|
||||
|
||||
download_source() {
|
||||
REMOTE_FILENAME=$1
|
||||
@ -46,9 +46,7 @@ download_source s_cbrt.c s_cbrt.cpp
|
||||
download_source s_ceil.c s_ceil.cpp
|
||||
download_source s_ceilf.c s_ceilf.cpp
|
||||
|
||||
# Math.cos
|
||||
download_source s_cos.c s_cos.cpp
|
||||
download_source k_cos.c k_cos.cpp
|
||||
# Math.cos (not used due to poor performance)
|
||||
|
||||
# Math.cosh
|
||||
download_source e_cosh.c e_cosh.cpp
|
||||
@ -83,18 +81,14 @@ download_source e_log2.c e_log2.cpp
|
||||
|
||||
# Math.pow (not used due to poor performance)
|
||||
|
||||
# Math.sin
|
||||
download_source s_sin.c s_sin.cpp
|
||||
download_source k_sin.c k_sin.cpp
|
||||
# Math.sin (not used due to poor performance)
|
||||
|
||||
# Math.sinh
|
||||
download_source e_sinh.c e_sinh.cpp
|
||||
|
||||
# Math.sqrt (not used due to poor performance)
|
||||
|
||||
# Math.tan
|
||||
download_source s_tan.c s_tan.cpp
|
||||
download_source k_tan.c k_tan.cpp
|
||||
# Math.tan (not used due to poor performance)
|
||||
|
||||
# Math.tanh
|
||||
download_source s_tanh.c s_tanh.cpp
|
||||
@ -104,8 +98,6 @@ download_source s_trunc.c s_trunc.cpp
|
||||
download_source s_truncf.c s_truncf.cpp
|
||||
|
||||
# dependencies
|
||||
download_source e_rem_pio2.c e_rem_pio2.cpp
|
||||
download_source k_rem_pio2.c k_rem_pio2.cpp
|
||||
download_source k_exp.c k_exp.cpp
|
||||
download_source s_copysign.c s_copysign.cpp
|
||||
download_source s_fabs.c s_fabs.cpp
|
||||
|
@ -693,172 +693,3 @@ diff --git a/modules/fdlibm/src/s_truncf.cpp b/modules/fdlibm/src/s_truncf.cpp
|
||||
truncf(float x)
|
||||
{
|
||||
int32_t i0,j0;
|
||||
diff --git a/modules/fdlibm/src/e_rem_pio2.cpp b/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
--- a/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
+++ b/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
@@ -19,17 +19,16 @@
|
||||
/* __ieee754_rem_pio2(x,y)
|
||||
*
|
||||
* return the remainder of x rem pi/2 in y[0]+y[1]
|
||||
* use __kernel_rem_pio2()
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
-#include "math.h"
|
||||
#include "math_private.h"
|
||||
|
||||
/*
|
||||
* invpio2: 53 bits of 2/pi
|
||||
* pio2_1: first 33 bit of pi/2
|
||||
* pio2_1t: pi/2 - pio2_1
|
||||
* pio2_2: second 33 bit of pi/2
|
||||
* pio2_2t: pi/2 - (pio2_1+pio2_2)
|
||||
|
||||
diff --git a/modules/fdlibm/src/k_cos.cpp b/modules/fdlibm/src/k_cos.cpp
|
||||
--- a/modules/fdlibm/src/k_cos.cpp
|
||||
+++ b/modules/fdlibm/src/k_cos.cpp
|
||||
@@ -48,17 +48,16 @@
|
||||
* and tmp having the same precision as x. If they have extra
|
||||
* precision due to compiler bugs, then the extra precision is
|
||||
* only good provided it is retained in all terms of the final
|
||||
* expression for cos(). Retention happens in all cases tested
|
||||
* under FreeBSD, so don't pessimize things by forcibly clipping
|
||||
* any extra precision in w.
|
||||
*/
|
||||
|
||||
-#include "math.h"
|
||||
#include "math_private.h"
|
||||
|
||||
static const double
|
||||
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
|
||||
C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
|
||||
C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
|
||||
C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
|
||||
C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
|
||||
diff --git a/modules/fdlibm/src/k_rem_pio2.cpp b/modules/fdlibm/src/k_rem_pio2.cpp
|
||||
--- a/modules/fdlibm/src/k_rem_pio2.cpp
|
||||
+++ b/modules/fdlibm/src/k_rem_pio2.cpp
|
||||
@@ -126,17 +126,16 @@
|
||||
* The hexadecimal values are the intended ones for the following
|
||||
* constants. The decimal values may be used, provided that the
|
||||
* compiler will convert from decimal to binary accurately enough
|
||||
* to produce the hexadecimal values shown.
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
-#include "math.h"
|
||||
#include "math_private.h"
|
||||
|
||||
static const int init_jk[] = {3,4,4,6}; /* initial value for jk */
|
||||
|
||||
/*
|
||||
* Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
|
||||
*
|
||||
* integer array, contains the (24*i)-th to (24*i+23)-th
|
||||
diff --git a/modules/fdlibm/src/k_sin.cpp b/modules/fdlibm/src/k_sin.cpp
|
||||
--- a/modules/fdlibm/src/k_sin.cpp
|
||||
+++ b/modules/fdlibm/src/k_sin.cpp
|
||||
@@ -39,17 +39,16 @@
|
||||
* ~ sin(x) + (1-x*x/2)*y
|
||||
* For better accuracy, let
|
||||
* 3 2 2 2 2
|
||||
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
|
||||
* then 3 2
|
||||
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
|
||||
*/
|
||||
|
||||
-#include "math.h"
|
||||
#include "math_private.h"
|
||||
|
||||
static const double
|
||||
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
|
||||
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
|
||||
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
|
||||
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
|
||||
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
|
||||
diff --git a/modules/fdlibm/src/k_tan.cpp b/modules/fdlibm/src/k_tan.cpp
|
||||
--- a/modules/fdlibm/src/k_tan.cpp
|
||||
+++ b/modules/fdlibm/src/k_tan.cpp
|
||||
@@ -44,17 +44,16 @@
|
||||
* 3 2
|
||||
* tan(x+y) = x + (T1*x + (x *(r+y)+y))
|
||||
*
|
||||
* 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
|
||||
* tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
|
||||
* = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
|
||||
*/
|
||||
|
||||
-#include "math.h"
|
||||
#include "math_private.h"
|
||||
static const double xxx[] = {
|
||||
3.33333333333334091986e-01, /* 3FD55555, 55555563 */
|
||||
1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */
|
||||
5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */
|
||||
2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */
|
||||
8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */
|
||||
3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */
|
||||
diff --git a/modules/fdlibm/src/s_cos.cpp b/modules/fdlibm/src/s_cos.cpp
|
||||
--- a/modules/fdlibm/src/s_cos.cpp
|
||||
+++ b/modules/fdlibm/src/s_cos.cpp
|
||||
@@ -41,17 +41,16 @@
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
-#include "math.h"
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
#include "e_rem_pio2.c"
|
||||
|
||||
double
|
||||
cos(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
diff --git a/modules/fdlibm/src/s_sin.cpp b/modules/fdlibm/src/s_sin.cpp
|
||||
--- a/modules/fdlibm/src/s_sin.cpp
|
||||
+++ b/modules/fdlibm/src/s_sin.cpp
|
||||
@@ -41,17 +41,16 @@
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
-#include "math.h"
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
#include "e_rem_pio2.c"
|
||||
|
||||
double
|
||||
sin(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
diff --git a/modules/fdlibm/src/s_tan.cpp b/modules/fdlibm/src/s_tan.cpp
|
||||
--- a/modules/fdlibm/src/s_tan.cpp
|
||||
+++ b/modules/fdlibm/src/s_tan.cpp
|
||||
@@ -40,17 +40,16 @@
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
-#include "math.h"
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
#include "e_rem_pio2.c"
|
||||
|
||||
double
|
||||
tan(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
@ -383,51 +383,3 @@ diff --git a/modules/fdlibm/src/s_trunc.cpp b/modules/fdlibm/src/s_trunc.cpp
|
||||
-#if LDBL_MANT_DIG == 53
|
||||
-__weak_reference(trunc, truncl);
|
||||
-#endif
|
||||
diff --git a/modules/fdlibm/src/s_cos.cpp b/modules/fdlibm/src/s_cos.cpp
|
||||
--- a/modules/fdlibm/src/s_cos.cpp
|
||||
+++ b/modules/fdlibm/src/s_cos.cpp
|
||||
@@ -78,12 +78,8 @@ cos(double x)
|
||||
case 0: return __kernel_cos(y[0],y[1]);
|
||||
case 1: return -__kernel_sin(y[0],y[1],1);
|
||||
case 2: return -__kernel_cos(y[0],y[1]);
|
||||
default:
|
||||
return __kernel_sin(y[0],y[1],1);
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
-#if (LDBL_MANT_DIG == 53)
|
||||
-__weak_reference(cos, cosl);
|
||||
-#endif
|
||||
diff --git a/modules/fdlibm/src/s_sin.cpp b/modules/fdlibm/src/s_sin.cpp
|
||||
--- a/modules/fdlibm/src/s_sin.cpp
|
||||
+++ b/modules/fdlibm/src/s_sin.cpp
|
||||
@@ -78,12 +78,8 @@ sin(double x)
|
||||
case 0: return __kernel_sin(y[0],y[1],1);
|
||||
case 1: return __kernel_cos(y[0],y[1]);
|
||||
case 2: return -__kernel_sin(y[0],y[1],1);
|
||||
default:
|
||||
return -__kernel_cos(y[0],y[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
-#if (LDBL_MANT_DIG == 53)
|
||||
-__weak_reference(sin, sinl);
|
||||
-#endif
|
||||
diff --git a/modules/fdlibm/src/s_tan.cpp b/modules/fdlibm/src/s_tan.cpp
|
||||
--- a/modules/fdlibm/src/s_tan.cpp
|
||||
+++ b/modules/fdlibm/src/s_tan.cpp
|
||||
@@ -72,12 +72,8 @@ tan(double x)
|
||||
|
||||
/* argument reduction needed */
|
||||
else {
|
||||
n = __ieee754_rem_pio2(x,y);
|
||||
return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even
|
||||
-1 -- n odd */
|
||||
}
|
||||
}
|
||||
-
|
||||
-#if (LDBL_MANT_DIG == 53)
|
||||
-__weak_reference(tan, tanl);
|
||||
-#endif
|
||||
|
@ -810,196 +810,3 @@ diff --git a/modules/fdlibm/src/s_truncf.cpp b/modules/fdlibm/src/s_truncf.cpp
|
||||
* Bit twiddling.
|
||||
* Exception:
|
||||
* Inexact flag raised if x not equal to truncf(x).
|
||||
diff --git a/modules/fdlibm/src/e_rem_pio2.cpp b/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
--- a/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
+++ b/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
@@ -8,18 +8,18 @@
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*
|
||||
* Optimized by Bruce D. Evans.
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* __ieee754_rem_pio2(x,y)
|
||||
*
|
||||
* return the remainder of x rem pi/2 in y[0]+y[1]
|
||||
* use __kernel_rem_pio2()
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
diff --git a/modules/fdlibm/src/k_cos.cpp b/modules/fdlibm/src/k_cos.cpp
|
||||
--- a/modules/fdlibm/src/k_cos.cpp
|
||||
+++ b/modules/fdlibm/src/k_cos.cpp
|
||||
@@ -6,18 +6,18 @@
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* __kernel_cos( x, y )
|
||||
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
*
|
||||
* Algorithm
|
||||
diff --git a/modules/fdlibm/src/k_rem_pio2.cpp b/modules/fdlibm/src/k_rem_pio2.cpp
|
||||
--- a/modules/fdlibm/src/k_rem_pio2.cpp
|
||||
+++ b/modules/fdlibm/src/k_rem_pio2.cpp
|
||||
@@ -6,18 +6,18 @@
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* __kernel_rem_pio2(x,y,e0,nx,prec)
|
||||
* double x[],y[]; int e0,nx,prec;
|
||||
*
|
||||
* __kernel_rem_pio2 return the last three digits of N with
|
||||
* y = x - N*pi/2
|
||||
* so that |y| < pi/2.
|
||||
diff --git a/modules/fdlibm/src/k_sin.cpp b/modules/fdlibm/src/k_sin.cpp
|
||||
--- a/modules/fdlibm/src/k_sin.cpp
|
||||
+++ b/modules/fdlibm/src/k_sin.cpp
|
||||
@@ -6,18 +6,18 @@
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* __kernel_sin( x, y, iy)
|
||||
* kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
|
||||
*
|
||||
* Algorithm
|
||||
diff --git a/modules/fdlibm/src/k_tan.cpp b/modules/fdlibm/src/k_tan.cpp
|
||||
--- a/modules/fdlibm/src/k_tan.cpp
|
||||
+++ b/modules/fdlibm/src/k_tan.cpp
|
||||
@@ -6,18 +6,18 @@
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
/* INDENT OFF */
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* __kernel_tan( x, y, k )
|
||||
* kernel tan function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
* Input k indicates whether tan (if k = 1) or -1/tan (if k = -1) is returned.
|
||||
*
|
||||
* Algorithm
|
||||
diff --git a/modules/fdlibm/src/s_cos.cpp b/modules/fdlibm/src/s_cos.cpp
|
||||
--- a/modules/fdlibm/src/s_cos.cpp
|
||||
+++ b/modules/fdlibm/src/s_cos.cpp
|
||||
@@ -5,18 +5,18 @@
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* cos(x)
|
||||
* Return cosine function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __kernel_sin ... sine function on [-pi/4,pi/4]
|
||||
* __kernel_cos ... cosine function on [-pi/4,pi/4]
|
||||
* __ieee754_rem_pio2 ... argument reduction routine
|
||||
diff --git a/modules/fdlibm/src/s_sin.cpp b/modules/fdlibm/src/s_sin.cpp
|
||||
--- a/modules/fdlibm/src/s_sin.cpp
|
||||
+++ b/modules/fdlibm/src/s_sin.cpp
|
||||
@@ -5,18 +5,18 @@
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* sin(x)
|
||||
* Return sine function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __kernel_sin ... sine function on [-pi/4,pi/4]
|
||||
* __kernel_cos ... cose function on [-pi/4,pi/4]
|
||||
* __ieee754_rem_pio2 ... argument reduction routine
|
||||
diff --git a/modules/fdlibm/src/s_tan.cpp b/modules/fdlibm/src/s_tan.cpp
|
||||
--- a/modules/fdlibm/src/s_tan.cpp
|
||||
+++ b/modules/fdlibm/src/s_tan.cpp
|
||||
@@ -5,18 +5,18 @@
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
-#include <sys/cdefs.h>
|
||||
-__FBSDID("$FreeBSD$");
|
||||
+//#include <sys/cdefs.h>
|
||||
+//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* tan(x)
|
||||
* Return tangent function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __kernel_tan ... tangent function on [-pi/4,pi/4]
|
||||
* __ieee754_rem_pio2 ... argument reduction routine
|
||||
*
|
@ -20,7 +20,7 @@ diff --git a/modules/fdlibm/src/math_private.h b/modules/fdlibm/src/math_private
|
||||
/* A union which permits us to convert between a long double and
|
||||
four 32 bit ints. */
|
||||
|
||||
#if MOZ_BIG_ENDIAN()
|
||||
#if MOZ_BIG_ENDIAN
|
||||
|
||||
typedef union
|
||||
{
|
||||
|
@ -1,15 +1,46 @@
|
||||
diff --git a/modules/fdlibm/src/math_private.h b/modules/fdlibm/src/math_private.h
|
||||
--- a/modules/fdlibm/src/math_private.h
|
||||
+++ b/modules/fdlibm/src/math_private.h
|
||||
@@ -617,95 +617,32 @@ rnint(double x)
|
||||
* magic number would need to be variable. Assuming that the
|
||||
* rounding precision is always the default is too fragile. This
|
||||
* and many other complications will move when the default is
|
||||
* changed to FP_PE.
|
||||
*/
|
||||
return ((double)(x + 0x1.8p52) - 0x1.8p52);
|
||||
@@ -586,126 +586,16 @@ CMPLXL(long double x, long double y)
|
||||
REALPART(z) = x;
|
||||
IMAGPART(z) = y;
|
||||
return (z.f);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _COMPLEX_H */
|
||||
|
||||
-/*
|
||||
- * The rnint() family rounds to the nearest integer for a restricted range
|
||||
- * range of args (up to about 2**MANT_DIG). We assume that the current
|
||||
- * rounding mode is FE_TONEAREST so that this can be done efficiently.
|
||||
- * Extra precision causes more problems in practice, and we only centralize
|
||||
- * this here to reduce those problems, and have not solved the efficiency
|
||||
- * problems. The exp2() family uses a more delicate version of this that
|
||||
- * requires extracting bits from the intermediate value, so it is not
|
||||
- * centralized here and should copy any solution of the efficiency problems.
|
||||
- */
|
||||
-
|
||||
-static inline double
|
||||
-rnint(__double_t x)
|
||||
-{
|
||||
- /*
|
||||
- * This casts to double to kill any extra precision. This depends
|
||||
- * on the cast being applied to a double_t to avoid compiler bugs
|
||||
- * (this is a cleaner version of STRICT_ASSIGN()). This is
|
||||
- * inefficient if there actually is extra precision, but is hard
|
||||
- * to improve on. We use double_t in the API to minimise conversions
|
||||
- * for just calling here. Note that we cannot easily change the
|
||||
- * magic number to the one that works directly with double_t, since
|
||||
- * the rounding precision is variable at runtime on x86 so the
|
||||
- * magic number would need to be variable. Assuming that the
|
||||
- * rounding precision is always the default is too fragile. This
|
||||
- * and many other complications will move when the default is
|
||||
- * changed to FP_PE.
|
||||
- */
|
||||
- return ((double)(x + 0x1.8p52) - 0x1.8p52);
|
||||
-}
|
||||
-
|
||||
-static inline float
|
||||
-rnintf(__float_t x)
|
||||
-{
|
||||
@ -40,22 +71,22 @@ diff --git a/modules/fdlibm/src/math_private.h b/modules/fdlibm/src/math_private
|
||||
-}
|
||||
-#endif /* LDBL_MANT_DIG */
|
||||
-
|
||||
/*
|
||||
* irint() and i64rint() give the same result as casting to their integer
|
||||
* return type provided their arg is a floating point integer. They can
|
||||
* sometimes be more efficient because no rounding is required.
|
||||
*/
|
||||
#if (defined(amd64) || defined(__i386__)) && defined(__GNUCLIKE_ASM)
|
||||
#define irint(x) \
|
||||
(sizeof(x) == sizeof(float) && \
|
||||
sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
|
||||
sizeof(x) == sizeof(double) && \
|
||||
sizeof(__double_t) == sizeof(long double) ? irintd(x) : \
|
||||
sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
|
||||
#else
|
||||
#define irint(x) ((int)(x))
|
||||
#endif
|
||||
|
||||
-/*
|
||||
- * irint() and i64rint() give the same result as casting to their integer
|
||||
- * return type provided their arg is a floating point integer. They can
|
||||
- * sometimes be more efficient because no rounding is required.
|
||||
- */
|
||||
-#if (defined(amd64) || defined(__i386__)) && defined(__GNUCLIKE_ASM)
|
||||
-#define irint(x) \
|
||||
- (sizeof(x) == sizeof(float) && \
|
||||
- sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
|
||||
- sizeof(x) == sizeof(double) && \
|
||||
- sizeof(__double_t) == sizeof(long double) ? irintd(x) : \
|
||||
- sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
|
||||
-#else
|
||||
-#define irint(x) ((int)(x))
|
||||
-#endif
|
||||
-
|
||||
-#define i64rint(x) ((int64_t)(x)) /* only needed for ld128 so not opt. */
|
||||
-
|
||||
-#if defined(__i386__) && defined(__GNUCLIKE_ASM)
|
||||
|
@ -1,32 +0,0 @@
|
||||
diff --git a/modules/fdlibm/src/math_private.h b/modules/fdlibm/src/math_private.h
|
||||
--- a/modules/fdlibm/src/math_private.h
|
||||
+++ b/modules/fdlibm/src/math_private.h
|
||||
@@ -21,16 +21,28 @@
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "fdlibm.h"
|
||||
|
||||
#include "mozilla/EndianUtils.h"
|
||||
|
||||
/*
|
||||
+ * Emulate FreeBSD internal double types.
|
||||
+ * Adapted from https://github.com/freebsd/freebsd-src/search?q=__double_t
|
||||
+ */
|
||||
+
|
||||
+#if defined(__i386__)
|
||||
+typedef long double __double_t;
|
||||
+#else
|
||||
+typedef double __double_t;
|
||||
+#endif
|
||||
+typedef __double_t double_t;
|
||||
+
|
||||
+/*
|
||||
* The original fdlibm code used statements like:
|
||||
* n0 = ((*(int*)&one)>>29)^1; * index of high word *
|
||||
* ix0 = *(n0+(int*)&x); * high word of x *
|
||||
* ix1 = *((1-n0)+(int*)&x); * low word of x *
|
||||
* to dig two 32 bit words out of the 64 bit IEEE floating point
|
||||
* value. That is non-ANSI, and, moreover, the gcc instruction
|
||||
* scheduler gets it wrong. We instead use the following macros.
|
||||
* Unlike the original code, we determine the endianness at compile
|
@ -1,88 +0,0 @@
|
||||
diff --git a/modules/fdlibm/src/e_rem_pio2.cpp b/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
--- a/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
+++ b/modules/fdlibm/src/e_rem_pio2.cpp
|
||||
@@ -43,17 +43,17 @@ invpio2 = 6.36619772367581382433e-01, /
|
||||
pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
|
||||
pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
|
||||
pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
|
||||
pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
|
||||
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
|
||||
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
|
||||
|
||||
#ifdef INLINE_REM_PIO2
|
||||
-static __inline __always_inline
|
||||
+static inline
|
||||
#endif
|
||||
int
|
||||
__ieee754_rem_pio2(double x, double *y)
|
||||
{
|
||||
double z,w,t,r,fn;
|
||||
double tx[3],ty[2];
|
||||
int32_t e0,i,j,nx,n,ix,hx;
|
||||
u_int32_t low;
|
||||
diff --git a/modules/fdlibm/src/s_cos.cpp b/modules/fdlibm/src/s_cos.cpp
|
||||
--- a/modules/fdlibm/src/s_cos.cpp
|
||||
+++ b/modules/fdlibm/src/s_cos.cpp
|
||||
@@ -43,17 +43,17 @@
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
-#include "e_rem_pio2.c"
|
||||
+#include "e_rem_pio2.cpp"
|
||||
|
||||
double
|
||||
cos(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
int32_t n, ix;
|
||||
|
||||
/* High word of x. */
|
||||
diff --git a/modules/fdlibm/src/s_sin.cpp b/modules/fdlibm/src/s_sin.cpp
|
||||
--- a/modules/fdlibm/src/s_sin.cpp
|
||||
+++ b/modules/fdlibm/src/s_sin.cpp
|
||||
@@ -43,17 +43,17 @@
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
-#include "e_rem_pio2.c"
|
||||
+#include "e_rem_pio2.cpp"
|
||||
|
||||
double
|
||||
sin(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
int32_t n, ix;
|
||||
|
||||
/* High word of x. */
|
||||
diff --git a/modules/fdlibm/src/s_tan.cpp b/modules/fdlibm/src/s_tan.cpp
|
||||
--- a/modules/fdlibm/src/s_tan.cpp
|
||||
+++ b/modules/fdlibm/src/s_tan.cpp
|
||||
@@ -42,17 +42,17 @@
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
-#include "e_rem_pio2.c"
|
||||
+#include "e_rem_pio2.cpp"
|
||||
|
||||
double
|
||||
tan(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
int32_t n, ix;
|
||||
|
||||
/* High word of x. */
|
@ -1,47 +0,0 @@
|
||||
diff --git a/modules/fdlibm/src/fdlibm.h b/modules/fdlibm/src/fdlibm.h
|
||||
--- a/modules/fdlibm/src/fdlibm.h
|
||||
+++ b/modules/fdlibm/src/fdlibm.h
|
||||
@@ -19,16 +19,20 @@
|
||||
|
||||
namespace fdlibm {
|
||||
|
||||
double acos(double);
|
||||
double asin(double);
|
||||
double atan(double);
|
||||
double atan2(double, double);
|
||||
|
||||
+double cos(double);
|
||||
+double sin(double);
|
||||
+double tan(double);
|
||||
+
|
||||
double cosh(double);
|
||||
double sinh(double);
|
||||
double tanh(double);
|
||||
|
||||
double exp(double);
|
||||
double log(double);
|
||||
double log10(double);
|
||||
|
||||
diff --git a/modules/fdlibm/src/math_private.h b/modules/fdlibm/src/math_private.h
|
||||
--- a/modules/fdlibm/src/math_private.h
|
||||
+++ b/modules/fdlibm/src/math_private.h
|
||||
@@ -832,16 +832,19 @@ rnint(double_t x)
|
||||
#define __ieee754_ynf ynf
|
||||
#define __ieee754_remainderf remainderf
|
||||
#define __ieee754_scalbf scalbf
|
||||
|
||||
#define acos fdlibm::acos
|
||||
#define asin fdlibm::asin
|
||||
#define atan fdlibm::atan
|
||||
#define atan2 fdlibm::atan2
|
||||
+#define cos fdlibm::cos
|
||||
+#define sin fdlibm::sin
|
||||
+#define tan fdlibm::tan
|
||||
#define cosh fdlibm::cosh
|
||||
#define sinh fdlibm::sinh
|
||||
#define tanh fdlibm::tanh
|
||||
#define exp fdlibm::exp
|
||||
#define log fdlibm::log
|
||||
#define log10 fdlibm::log10
|
||||
#define pow fdlibm::pow
|
||||
#define ceil fdlibm::ceil
|
@ -1,179 +0,0 @@
|
||||
|
||||
/* @(#)e_rem_pio2.c 1.4 95/01/18 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*
|
||||
* Optimized by Bruce D. Evans.
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* __ieee754_rem_pio2(x,y)
|
||||
*
|
||||
* return the remainder of x rem pi/2 in y[0]+y[1]
|
||||
* use __kernel_rem_pio2()
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#include "math_private.h"
|
||||
|
||||
/*
|
||||
* invpio2: 53 bits of 2/pi
|
||||
* pio2_1: first 33 bit of pi/2
|
||||
* pio2_1t: pi/2 - pio2_1
|
||||
* pio2_2: second 33 bit of pi/2
|
||||
* pio2_2t: pi/2 - (pio2_1+pio2_2)
|
||||
* pio2_3: third 33 bit of pi/2
|
||||
* pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
|
||||
*/
|
||||
|
||||
static const double
|
||||
zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
|
||||
two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
|
||||
invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
|
||||
pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
|
||||
pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
|
||||
pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
|
||||
pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
|
||||
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
|
||||
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
|
||||
|
||||
#ifdef INLINE_REM_PIO2
|
||||
static inline
|
||||
#endif
|
||||
int
|
||||
__ieee754_rem_pio2(double x, double *y)
|
||||
{
|
||||
double z,w,t,r,fn;
|
||||
double tx[3],ty[2];
|
||||
int32_t e0,i,j,nx,n,ix,hx;
|
||||
u_int32_t low;
|
||||
|
||||
GET_HIGH_WORD(hx,x); /* high word of x */
|
||||
ix = hx&0x7fffffff;
|
||||
#if 0 /* Must be handled in caller. */
|
||||
if(ix<=0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */
|
||||
{y[0] = x; y[1] = 0; return 0;}
|
||||
#endif
|
||||
if (ix <= 0x400f6a7a) { /* |x| ~<= 5pi/4 */
|
||||
if ((ix & 0xfffff) == 0x921fb) /* |x| ~= pi/2 or 2pi/2 */
|
||||
goto medium; /* cancellation -- use medium case */
|
||||
if (ix <= 0x4002d97c) { /* |x| ~<= 3pi/4 */
|
||||
if (hx > 0) {
|
||||
z = x - pio2_1; /* one round good to 85 bits */
|
||||
y[0] = z - pio2_1t;
|
||||
y[1] = (z-y[0])-pio2_1t;
|
||||
return 1;
|
||||
} else {
|
||||
z = x + pio2_1;
|
||||
y[0] = z + pio2_1t;
|
||||
y[1] = (z-y[0])+pio2_1t;
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (hx > 0) {
|
||||
z = x - 2*pio2_1;
|
||||
y[0] = z - 2*pio2_1t;
|
||||
y[1] = (z-y[0])-2*pio2_1t;
|
||||
return 2;
|
||||
} else {
|
||||
z = x + 2*pio2_1;
|
||||
y[0] = z + 2*pio2_1t;
|
||||
y[1] = (z-y[0])+2*pio2_1t;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ix <= 0x401c463b) { /* |x| ~<= 9pi/4 */
|
||||
if (ix <= 0x4015fdbc) { /* |x| ~<= 7pi/4 */
|
||||
if (ix == 0x4012d97c) /* |x| ~= 3pi/2 */
|
||||
goto medium;
|
||||
if (hx > 0) {
|
||||
z = x - 3*pio2_1;
|
||||
y[0] = z - 3*pio2_1t;
|
||||
y[1] = (z-y[0])-3*pio2_1t;
|
||||
return 3;
|
||||
} else {
|
||||
z = x + 3*pio2_1;
|
||||
y[0] = z + 3*pio2_1t;
|
||||
y[1] = (z-y[0])+3*pio2_1t;
|
||||
return -3;
|
||||
}
|
||||
} else {
|
||||
if (ix == 0x401921fb) /* |x| ~= 4pi/2 */
|
||||
goto medium;
|
||||
if (hx > 0) {
|
||||
z = x - 4*pio2_1;
|
||||
y[0] = z - 4*pio2_1t;
|
||||
y[1] = (z-y[0])-4*pio2_1t;
|
||||
return 4;
|
||||
} else {
|
||||
z = x + 4*pio2_1;
|
||||
y[0] = z + 4*pio2_1t;
|
||||
y[1] = (z-y[0])+4*pio2_1t;
|
||||
return -4;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(ix<0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */
|
||||
medium:
|
||||
fn = rnint((double_t)x*invpio2);
|
||||
n = irint(fn);
|
||||
r = x-fn*pio2_1;
|
||||
w = fn*pio2_1t; /* 1st round good to 85 bit */
|
||||
{
|
||||
u_int32_t high;
|
||||
j = ix>>20;
|
||||
y[0] = r-w;
|
||||
GET_HIGH_WORD(high,y[0]);
|
||||
i = j-((high>>20)&0x7ff);
|
||||
if(i>16) { /* 2nd iteration needed, good to 118 */
|
||||
t = r;
|
||||
w = fn*pio2_2;
|
||||
r = t-w;
|
||||
w = fn*pio2_2t-((t-r)-w);
|
||||
y[0] = r-w;
|
||||
GET_HIGH_WORD(high,y[0]);
|
||||
i = j-((high>>20)&0x7ff);
|
||||
if(i>49) { /* 3rd iteration need, 151 bits acc */
|
||||
t = r; /* will cover all possible cases */
|
||||
w = fn*pio2_3;
|
||||
r = t-w;
|
||||
w = fn*pio2_3t-((t-r)-w);
|
||||
y[0] = r-w;
|
||||
}
|
||||
}
|
||||
}
|
||||
y[1] = (r-y[0])-w;
|
||||
return n;
|
||||
}
|
||||
/*
|
||||
* all other (large) arguments
|
||||
*/
|
||||
if(ix>=0x7ff00000) { /* x is inf or NaN */
|
||||
y[0]=y[1]=x-x; return 0;
|
||||
}
|
||||
/* set z = scalbn(|x|,ilogb(x)-23) */
|
||||
GET_LOW_WORD(low,x);
|
||||
e0 = (ix>>20)-1046; /* e0 = ilogb(z)-23; */
|
||||
INSERT_WORDS(z, ix - ((int32_t)(e0<<20)), low);
|
||||
for(i=0;i<2;i++) {
|
||||
tx[i] = (double)((int32_t)(z));
|
||||
z = (z-tx[i])*two24;
|
||||
}
|
||||
tx[2] = z;
|
||||
nx = 3;
|
||||
while(tx[nx-1]==zero) nx--; /* skip zero term */
|
||||
n = __kernel_rem_pio2(tx,ty,e0,nx,1);
|
||||
if(hx<0) {y[0] = -ty[0]; y[1] = -ty[1]; return -n;}
|
||||
y[0] = ty[0]; y[1] = ty[1]; return n;
|
||||
}
|
@ -24,10 +24,6 @@ double asin(double);
|
||||
double atan(double);
|
||||
double atan2(double, double);
|
||||
|
||||
double cos(double);
|
||||
double sin(double);
|
||||
double tan(double);
|
||||
|
||||
double cosh(double);
|
||||
double sinh(double);
|
||||
double tanh(double);
|
||||
|
@ -1,78 +0,0 @@
|
||||
|
||||
/* @(#)k_cos.c 1.3 95/01/18 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* __kernel_cos( x, y )
|
||||
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
*
|
||||
* Algorithm
|
||||
* 1. Since cos(-x) = cos(x), we need only to consider positive x.
|
||||
* 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
|
||||
* 3. cos(x) is approximated by a polynomial of degree 14 on
|
||||
* [0,pi/4]
|
||||
* 4 14
|
||||
* cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
|
||||
* where the remez error is
|
||||
*
|
||||
* | 2 4 6 8 10 12 14 | -58
|
||||
* |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
|
||||
* | |
|
||||
*
|
||||
* 4 6 8 10 12 14
|
||||
* 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
|
||||
* cos(x) ~ 1 - x*x/2 + r
|
||||
* since cos(x+y) ~ cos(x) - sin(x)*y
|
||||
* ~ cos(x) - x*y,
|
||||
* a correction term is necessary in cos(x) and hence
|
||||
* cos(x+y) = 1 - (x*x/2 - (r - x*y))
|
||||
* For better accuracy, rearrange to
|
||||
* cos(x+y) ~ w + (tmp + (r-x*y))
|
||||
* where w = 1 - x*x/2 and tmp is a tiny correction term
|
||||
* (1 - x*x/2 == w + tmp exactly in infinite precision).
|
||||
* The exactness of w + tmp in infinite precision depends on w
|
||||
* and tmp having the same precision as x. If they have extra
|
||||
* precision due to compiler bugs, then the extra precision is
|
||||
* only good provided it is retained in all terms of the final
|
||||
* expression for cos(). Retention happens in all cases tested
|
||||
* under FreeBSD, so don't pessimize things by forcibly clipping
|
||||
* any extra precision in w.
|
||||
*/
|
||||
|
||||
#include "math_private.h"
|
||||
|
||||
static const double
|
||||
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
|
||||
C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
|
||||
C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
|
||||
C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
|
||||
C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
|
||||
C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
|
||||
C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
|
||||
|
||||
double
|
||||
__kernel_cos(double x, double y)
|
||||
{
|
||||
double hz,z,r,w;
|
||||
|
||||
z = x*x;
|
||||
w = z*z;
|
||||
r = z*(C1+z*(C2+z*C3)) + w*w*(C4+z*(C5+z*C6));
|
||||
hz = 0.5*z;
|
||||
w = one-hz;
|
||||
return w + (((one-w)-hz) + (z*r-x*y));
|
||||
}
|
@ -1,442 +0,0 @@
|
||||
|
||||
/* @(#)k_rem_pio2.c 1.3 95/01/18 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* __kernel_rem_pio2(x,y,e0,nx,prec)
|
||||
* double x[],y[]; int e0,nx,prec;
|
||||
*
|
||||
* __kernel_rem_pio2 return the last three digits of N with
|
||||
* y = x - N*pi/2
|
||||
* so that |y| < pi/2.
|
||||
*
|
||||
* The method is to compute the integer (mod 8) and fraction parts of
|
||||
* (2/pi)*x without doing the full multiplication. In general we
|
||||
* skip the part of the product that are known to be a huge integer (
|
||||
* more accurately, = 0 mod 8 ). Thus the number of operations are
|
||||
* independent of the exponent of the input.
|
||||
*
|
||||
* (2/pi) is represented by an array of 24-bit integers in ipio2[].
|
||||
*
|
||||
* Input parameters:
|
||||
* x[] The input value (must be positive) is broken into nx
|
||||
* pieces of 24-bit integers in double precision format.
|
||||
* x[i] will be the i-th 24 bit of x. The scaled exponent
|
||||
* of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
|
||||
* match x's up to 24 bits.
|
||||
*
|
||||
* Example of breaking a double positive z into x[0]+x[1]+x[2]:
|
||||
* e0 = ilogb(z)-23
|
||||
* z = scalbn(z,-e0)
|
||||
* for i = 0,1,2
|
||||
* x[i] = floor(z)
|
||||
* z = (z-x[i])*2**24
|
||||
*
|
||||
*
|
||||
* y[] output result in an array of double precision numbers.
|
||||
* The dimension of y[] is:
|
||||
* 24-bit precision 1
|
||||
* 53-bit precision 2
|
||||
* 64-bit precision 2
|
||||
* 113-bit precision 3
|
||||
* The actual value is the sum of them. Thus for 113-bit
|
||||
* precision, one may have to do something like:
|
||||
*
|
||||
* long double t,w,r_head, r_tail;
|
||||
* t = (long double)y[2] + (long double)y[1];
|
||||
* w = (long double)y[0];
|
||||
* r_head = t+w;
|
||||
* r_tail = w - (r_head - t);
|
||||
*
|
||||
* e0 The exponent of x[0]. Must be <= 16360 or you need to
|
||||
* expand the ipio2 table.
|
||||
*
|
||||
* nx dimension of x[]
|
||||
*
|
||||
* prec an integer indicating the precision:
|
||||
* 0 24 bits (single)
|
||||
* 1 53 bits (double)
|
||||
* 2 64 bits (extended)
|
||||
* 3 113 bits (quad)
|
||||
*
|
||||
* External function:
|
||||
* double scalbn(), floor();
|
||||
*
|
||||
*
|
||||
* Here is the description of some local variables:
|
||||
*
|
||||
* jk jk+1 is the initial number of terms of ipio2[] needed
|
||||
* in the computation. The minimum and recommended value
|
||||
* for jk is 3,4,4,6 for single, double, extended, and quad.
|
||||
* jk+1 must be 2 larger than you might expect so that our
|
||||
* recomputation test works. (Up to 24 bits in the integer
|
||||
* part (the 24 bits of it that we compute) and 23 bits in
|
||||
* the fraction part may be lost to cancellation before we
|
||||
* recompute.)
|
||||
*
|
||||
* jz local integer variable indicating the number of
|
||||
* terms of ipio2[] used.
|
||||
*
|
||||
* jx nx - 1
|
||||
*
|
||||
* jv index for pointing to the suitable ipio2[] for the
|
||||
* computation. In general, we want
|
||||
* ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
|
||||
* is an integer. Thus
|
||||
* e0-3-24*jv >= 0 or (e0-3)/24 >= jv
|
||||
* Hence jv = max(0,(e0-3)/24).
|
||||
*
|
||||
* jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
|
||||
*
|
||||
* q[] double array with integral value, representing the
|
||||
* 24-bits chunk of the product of x and 2/pi.
|
||||
*
|
||||
* q0 the corresponding exponent of q[0]. Note that the
|
||||
* exponent for q[i] would be q0-24*i.
|
||||
*
|
||||
* PIo2[] double precision array, obtained by cutting pi/2
|
||||
* into 24 bits chunks.
|
||||
*
|
||||
* f[] ipio2[] in floating point
|
||||
*
|
||||
* iq[] integer array by breaking up q[] in 24-bits chunk.
|
||||
*
|
||||
* fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
|
||||
*
|
||||
* ih integer. If >0 it indicates q[] is >= 0.5, hence
|
||||
* it also indicates the *sign* of the result.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Constants:
|
||||
* The hexadecimal values are the intended ones for the following
|
||||
* constants. The decimal values may be used, provided that the
|
||||
* compiler will convert from decimal to binary accurately enough
|
||||
* to produce the hexadecimal values shown.
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#include "math_private.h"
|
||||
|
||||
static const int init_jk[] = {3,4,4,6}; /* initial value for jk */
|
||||
|
||||
/*
|
||||
* Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
|
||||
*
|
||||
* integer array, contains the (24*i)-th to (24*i+23)-th
|
||||
* bit of 2/pi after binary point. The corresponding
|
||||
* floating value is
|
||||
*
|
||||
* ipio2[i] * 2^(-24(i+1)).
|
||||
*
|
||||
* NB: This table must have at least (e0-3)/24 + jk terms.
|
||||
* For quad precision (e0 <= 16360, jk = 6), this is 686.
|
||||
*/
|
||||
static const int32_t ipio2[] = {
|
||||
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
|
||||
0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
|
||||
0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
|
||||
0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
|
||||
0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
|
||||
0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
|
||||
0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
|
||||
0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
|
||||
0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
|
||||
0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
|
||||
0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
|
||||
|
||||
#if LDBL_MAX_EXP > 1024
|
||||
#if LDBL_MAX_EXP > 16384
|
||||
#error "ipio2 table needs to be expanded"
|
||||
#endif
|
||||
0x47C419, 0xC367CD, 0xDCE809, 0x2A8359, 0xC4768B, 0x961CA6,
|
||||
0xDDAF44, 0xD15719, 0x053EA5, 0xFF0705, 0x3F7E33, 0xE832C2,
|
||||
0xDE4F98, 0x327DBB, 0xC33D26, 0xEF6B1E, 0x5EF89F, 0x3A1F35,
|
||||
0xCAF27F, 0x1D87F1, 0x21907C, 0x7C246A, 0xFA6ED5, 0x772D30,
|
||||
0x433B15, 0xC614B5, 0x9D19C3, 0xC2C4AD, 0x414D2C, 0x5D000C,
|
||||
0x467D86, 0x2D71E3, 0x9AC69B, 0x006233, 0x7CD2B4, 0x97A7B4,
|
||||
0xD55537, 0xF63ED7, 0x1810A3, 0xFC764D, 0x2A9D64, 0xABD770,
|
||||
0xF87C63, 0x57B07A, 0xE71517, 0x5649C0, 0xD9D63B, 0x3884A7,
|
||||
0xCB2324, 0x778AD6, 0x23545A, 0xB91F00, 0x1B0AF1, 0xDFCE19,
|
||||
0xFF319F, 0x6A1E66, 0x615799, 0x47FBAC, 0xD87F7E, 0xB76522,
|
||||
0x89E832, 0x60BFE6, 0xCDC4EF, 0x09366C, 0xD43F5D, 0xD7DE16,
|
||||
0xDE3B58, 0x929BDE, 0x2822D2, 0xE88628, 0x4D58E2, 0x32CAC6,
|
||||
0x16E308, 0xCB7DE0, 0x50C017, 0xA71DF3, 0x5BE018, 0x34132E,
|
||||
0x621283, 0x014883, 0x5B8EF5, 0x7FB0AD, 0xF2E91E, 0x434A48,
|
||||
0xD36710, 0xD8DDAA, 0x425FAE, 0xCE616A, 0xA4280A, 0xB499D3,
|
||||
0xF2A606, 0x7F775C, 0x83C2A3, 0x883C61, 0x78738A, 0x5A8CAF,
|
||||
0xBDD76F, 0x63A62D, 0xCBBFF4, 0xEF818D, 0x67C126, 0x45CA55,
|
||||
0x36D9CA, 0xD2A828, 0x8D61C2, 0x77C912, 0x142604, 0x9B4612,
|
||||
0xC459C4, 0x44C5C8, 0x91B24D, 0xF31700, 0xAD43D4, 0xE54929,
|
||||
0x10D5FD, 0xFCBE00, 0xCC941E, 0xEECE70, 0xF53E13, 0x80F1EC,
|
||||
0xC3E7B3, 0x28F8C7, 0x940593, 0x3E71C1, 0xB3092E, 0xF3450B,
|
||||
0x9C1288, 0x7B20AB, 0x9FB52E, 0xC29247, 0x2F327B, 0x6D550C,
|
||||
0x90A772, 0x1FE76B, 0x96CB31, 0x4A1679, 0xE27941, 0x89DFF4,
|
||||
0x9794E8, 0x84E6E2, 0x973199, 0x6BED88, 0x365F5F, 0x0EFDBB,
|
||||
0xB49A48, 0x6CA467, 0x427271, 0x325D8D, 0xB8159F, 0x09E5BC,
|
||||
0x25318D, 0x3974F7, 0x1C0530, 0x010C0D, 0x68084B, 0x58EE2C,
|
||||
0x90AA47, 0x02E774, 0x24D6BD, 0xA67DF7, 0x72486E, 0xEF169F,
|
||||
0xA6948E, 0xF691B4, 0x5153D1, 0xF20ACF, 0x339820, 0x7E4BF5,
|
||||
0x6863B2, 0x5F3EDD, 0x035D40, 0x7F8985, 0x295255, 0xC06437,
|
||||
0x10D86D, 0x324832, 0x754C5B, 0xD4714E, 0x6E5445, 0xC1090B,
|
||||
0x69F52A, 0xD56614, 0x9D0727, 0x50045D, 0xDB3BB4, 0xC576EA,
|
||||
0x17F987, 0x7D6B49, 0xBA271D, 0x296996, 0xACCCC6, 0x5414AD,
|
||||
0x6AE290, 0x89D988, 0x50722C, 0xBEA404, 0x940777, 0x7030F3,
|
||||
0x27FC00, 0xA871EA, 0x49C266, 0x3DE064, 0x83DD97, 0x973FA3,
|
||||
0xFD9443, 0x8C860D, 0xDE4131, 0x9D3992, 0x8C70DD, 0xE7B717,
|
||||
0x3BDF08, 0x2B3715, 0xA0805C, 0x93805A, 0x921110, 0xD8E80F,
|
||||
0xAF806C, 0x4BFFDB, 0x0F9038, 0x761859, 0x15A562, 0xBBCB61,
|
||||
0xB989C7, 0xBD4010, 0x04F2D2, 0x277549, 0xF6B6EB, 0xBB22DB,
|
||||
0xAA140A, 0x2F2689, 0x768364, 0x333B09, 0x1A940E, 0xAA3A51,
|
||||
0xC2A31D, 0xAEEDAF, 0x12265C, 0x4DC26D, 0x9C7A2D, 0x9756C0,
|
||||
0x833F03, 0xF6F009, 0x8C402B, 0x99316D, 0x07B439, 0x15200C,
|
||||
0x5BC3D8, 0xC492F5, 0x4BADC6, 0xA5CA4E, 0xCD37A7, 0x36A9E6,
|
||||
0x9492AB, 0x6842DD, 0xDE6319, 0xEF8C76, 0x528B68, 0x37DBFC,
|
||||
0xABA1AE, 0x3115DF, 0xA1AE00, 0xDAFB0C, 0x664D64, 0xB705ED,
|
||||
0x306529, 0xBF5657, 0x3AFF47, 0xB9F96A, 0xF3BE75, 0xDF9328,
|
||||
0x3080AB, 0xF68C66, 0x15CB04, 0x0622FA, 0x1DE4D9, 0xA4B33D,
|
||||
0x8F1B57, 0x09CD36, 0xE9424E, 0xA4BE13, 0xB52333, 0x1AAAF0,
|
||||
0xA8654F, 0xA5C1D2, 0x0F3F0B, 0xCD785B, 0x76F923, 0x048B7B,
|
||||
0x721789, 0x53A6C6, 0xE26E6F, 0x00EBEF, 0x584A9B, 0xB7DAC4,
|
||||
0xBA66AA, 0xCFCF76, 0x1D02D1, 0x2DF1B1, 0xC1998C, 0x77ADC3,
|
||||
0xDA4886, 0xA05DF7, 0xF480C6, 0x2FF0AC, 0x9AECDD, 0xBC5C3F,
|
||||
0x6DDED0, 0x1FC790, 0xB6DB2A, 0x3A25A3, 0x9AAF00, 0x9353AD,
|
||||
0x0457B6, 0xB42D29, 0x7E804B, 0xA707DA, 0x0EAA76, 0xA1597B,
|
||||
0x2A1216, 0x2DB7DC, 0xFDE5FA, 0xFEDB89, 0xFDBE89, 0x6C76E4,
|
||||
0xFCA906, 0x70803E, 0x156E85, 0xFF87FD, 0x073E28, 0x336761,
|
||||
0x86182A, 0xEABD4D, 0xAFE7B3, 0x6E6D8F, 0x396795, 0x5BBF31,
|
||||
0x48D784, 0x16DF30, 0x432DC7, 0x356125, 0xCE70C9, 0xB8CB30,
|
||||
0xFD6CBF, 0xA200A4, 0xE46C05, 0xA0DD5A, 0x476F21, 0xD21262,
|
||||
0x845CB9, 0x496170, 0xE0566B, 0x015299, 0x375550, 0xB7D51E,
|
||||
0xC4F133, 0x5F6E13, 0xE4305D, 0xA92E85, 0xC3B21D, 0x3632A1,
|
||||
0xA4B708, 0xD4B1EA, 0x21F716, 0xE4698F, 0x77FF27, 0x80030C,
|
||||
0x2D408D, 0xA0CD4F, 0x99A520, 0xD3A2B3, 0x0A5D2F, 0x42F9B4,
|
||||
0xCBDA11, 0xD0BE7D, 0xC1DB9B, 0xBD17AB, 0x81A2CA, 0x5C6A08,
|
||||
0x17552E, 0x550027, 0xF0147F, 0x8607E1, 0x640B14, 0x8D4196,
|
||||
0xDEBE87, 0x2AFDDA, 0xB6256B, 0x34897B, 0xFEF305, 0x9EBFB9,
|
||||
0x4F6A68, 0xA82A4A, 0x5AC44F, 0xBCF82D, 0x985AD7, 0x95C7F4,
|
||||
0x8D4D0D, 0xA63A20, 0x5F57A4, 0xB13F14, 0x953880, 0x0120CC,
|
||||
0x86DD71, 0xB6DEC9, 0xF560BF, 0x11654D, 0x6B0701, 0xACB08C,
|
||||
0xD0C0B2, 0x485551, 0x0EFB1E, 0xC37295, 0x3B06A3, 0x3540C0,
|
||||
0x7BDC06, 0xCC45E0, 0xFA294E, 0xC8CAD6, 0x41F3E8, 0xDE647C,
|
||||
0xD8649B, 0x31BED9, 0xC397A4, 0xD45877, 0xC5E369, 0x13DAF0,
|
||||
0x3C3ABA, 0x461846, 0x5F7555, 0xF5BDD2, 0xC6926E, 0x5D2EAC,
|
||||
0xED440E, 0x423E1C, 0x87C461, 0xE9FD29, 0xF3D6E7, 0xCA7C22,
|
||||
0x35916F, 0xC5E008, 0x8DD7FF, 0xE26A6E, 0xC6FDB0, 0xC10893,
|
||||
0x745D7C, 0xB2AD6B, 0x9D6ECD, 0x7B723E, 0x6A11C6, 0xA9CFF7,
|
||||
0xDF7329, 0xBAC9B5, 0x5100B7, 0x0DB2E2, 0x24BA74, 0x607DE5,
|
||||
0x8AD874, 0x2C150D, 0x0C1881, 0x94667E, 0x162901, 0x767A9F,
|
||||
0xBEFDFD, 0xEF4556, 0x367ED9, 0x13D9EC, 0xB9BA8B, 0xFC97C4,
|
||||
0x27A831, 0xC36EF1, 0x36C594, 0x56A8D8, 0xB5A8B4, 0x0ECCCF,
|
||||
0x2D8912, 0x34576F, 0x89562C, 0xE3CE99, 0xB920D6, 0xAA5E6B,
|
||||
0x9C2A3E, 0xCC5F11, 0x4A0BFD, 0xFBF4E1, 0x6D3B8E, 0x2C86E2,
|
||||
0x84D4E9, 0xA9B4FC, 0xD1EEEF, 0xC9352E, 0x61392F, 0x442138,
|
||||
0xC8D91B, 0x0AFC81, 0x6A4AFB, 0xD81C2F, 0x84B453, 0x8C994E,
|
||||
0xCC2254, 0xDC552A, 0xD6C6C0, 0x96190B, 0xB8701A, 0x649569,
|
||||
0x605A26, 0xEE523F, 0x0F117F, 0x11B5F4, 0xF5CBFC, 0x2DBC34,
|
||||
0xEEBC34, 0xCC5DE8, 0x605EDD, 0x9B8E67, 0xEF3392, 0xB817C9,
|
||||
0x9B5861, 0xBC57E1, 0xC68351, 0x103ED8, 0x4871DD, 0xDD1C2D,
|
||||
0xA118AF, 0x462C21, 0xD7F359, 0x987AD9, 0xC0549E, 0xFA864F,
|
||||
0xFC0656, 0xAE79E5, 0x362289, 0x22AD38, 0xDC9367, 0xAAE855,
|
||||
0x382682, 0x9BE7CA, 0xA40D51, 0xB13399, 0x0ED7A9, 0x480569,
|
||||
0xF0B265, 0xA7887F, 0x974C88, 0x36D1F9, 0xB39221, 0x4A827B,
|
||||
0x21CF98, 0xDC9F40, 0x5547DC, 0x3A74E1, 0x42EB67, 0xDF9DFE,
|
||||
0x5FD45E, 0xA4677B, 0x7AACBA, 0xA2F655, 0x23882B, 0x55BA41,
|
||||
0x086E59, 0x862A21, 0x834739, 0xE6E389, 0xD49EE5, 0x40FB49,
|
||||
0xE956FF, 0xCA0F1C, 0x8A59C5, 0x2BFA94, 0xC5C1D3, 0xCFC50F,
|
||||
0xAE5ADB, 0x86C547, 0x624385, 0x3B8621, 0x94792C, 0x876110,
|
||||
0x7B4C2A, 0x1A2C80, 0x12BF43, 0x902688, 0x893C78, 0xE4C4A8,
|
||||
0x7BDBE5, 0xC23AC4, 0xEAF426, 0x8A67F7, 0xBF920D, 0x2BA365,
|
||||
0xB1933D, 0x0B7CBD, 0xDC51A4, 0x63DD27, 0xDDE169, 0x19949A,
|
||||
0x9529A8, 0x28CE68, 0xB4ED09, 0x209F44, 0xCA984E, 0x638270,
|
||||
0x237C7E, 0x32B90F, 0x8EF5A7, 0xE75614, 0x08F121, 0x2A9DB5,
|
||||
0x4D7E6F, 0x5119A5, 0xABF9B5, 0xD6DF82, 0x61DD96, 0x023616,
|
||||
0x9F3AC4, 0xA1A283, 0x6DED72, 0x7A8D39, 0xA9B882, 0x5C326B,
|
||||
0x5B2746, 0xED3400, 0x7700D2, 0x55F4FC, 0x4D5901, 0x8071E0,
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
static const double PIo2[] = {
|
||||
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
|
||||
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
|
||||
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
|
||||
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
|
||||
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
|
||||
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
|
||||
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
|
||||
2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
|
||||
};
|
||||
|
||||
static const double
|
||||
zero = 0.0,
|
||||
one = 1.0,
|
||||
two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
|
||||
twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
|
||||
|
||||
int
|
||||
__kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec)
|
||||
{
|
||||
int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
|
||||
double z,fw,f[20],fq[20],q[20];
|
||||
|
||||
/* initialize jk*/
|
||||
jk = init_jk[prec];
|
||||
jp = jk;
|
||||
|
||||
/* determine jx,jv,q0, note that 3>q0 */
|
||||
jx = nx-1;
|
||||
jv = (e0-3)/24; if(jv<0) jv=0;
|
||||
q0 = e0-24*(jv+1);
|
||||
|
||||
/* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
|
||||
j = jv-jx; m = jx+jk;
|
||||
for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j];
|
||||
|
||||
/* compute q[0],q[1],...q[jk] */
|
||||
for (i=0;i<=jk;i++) {
|
||||
for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw;
|
||||
}
|
||||
|
||||
jz = jk;
|
||||
recompute:
|
||||
/* distill q[] into iq[] reversingly */
|
||||
for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
|
||||
fw = (double)((int32_t)(twon24* z));
|
||||
iq[i] = (int32_t)(z-two24*fw);
|
||||
z = q[j-1]+fw;
|
||||
}
|
||||
|
||||
/* compute n */
|
||||
z = scalbn(z,q0); /* actual value of z */
|
||||
z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
|
||||
n = (int32_t) z;
|
||||
z -= (double)n;
|
||||
ih = 0;
|
||||
if(q0>0) { /* need iq[jz-1] to determine n */
|
||||
i = (iq[jz-1]>>(24-q0)); n += i;
|
||||
iq[jz-1] -= i<<(24-q0);
|
||||
ih = iq[jz-1]>>(23-q0);
|
||||
}
|
||||
else if(q0==0) ih = iq[jz-1]>>23;
|
||||
else if(z>=0.5) ih=2;
|
||||
|
||||
if(ih>0) { /* q > 0.5 */
|
||||
n += 1; carry = 0;
|
||||
for(i=0;i<jz ;i++) { /* compute 1-q */
|
||||
j = iq[i];
|
||||
if(carry==0) {
|
||||
if(j!=0) {
|
||||
carry = 1; iq[i] = 0x1000000- j;
|
||||
}
|
||||
} else iq[i] = 0xffffff - j;
|
||||
}
|
||||
if(q0>0) { /* rare case: chance is 1 in 12 */
|
||||
switch(q0) {
|
||||
case 1:
|
||||
iq[jz-1] &= 0x7fffff; break;
|
||||
case 2:
|
||||
iq[jz-1] &= 0x3fffff; break;
|
||||
}
|
||||
}
|
||||
if(ih==2) {
|
||||
z = one - z;
|
||||
if(carry!=0) z -= scalbn(one,q0);
|
||||
}
|
||||
}
|
||||
|
||||
/* check if recomputation is needed */
|
||||
if(z==zero) {
|
||||
j = 0;
|
||||
for (i=jz-1;i>=jk;i--) j |= iq[i];
|
||||
if(j==0) { /* need recomputation */
|
||||
for(k=1;iq[jk-k]==0;k++); /* k = no. of terms needed */
|
||||
|
||||
for(i=jz+1;i<=jz+k;i++) { /* add q[jz+1] to q[jz+k] */
|
||||
f[jx+i] = (double) ipio2[jv+i];
|
||||
for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
|
||||
q[i] = fw;
|
||||
}
|
||||
jz += k;
|
||||
goto recompute;
|
||||
}
|
||||
}
|
||||
|
||||
/* chop off zero terms */
|
||||
if(z==0.0) {
|
||||
jz -= 1; q0 -= 24;
|
||||
while(iq[jz]==0) { jz--; q0-=24;}
|
||||
} else { /* break z into 24-bit if necessary */
|
||||
z = scalbn(z,-q0);
|
||||
if(z>=two24) {
|
||||
fw = (double)((int32_t)(twon24*z));
|
||||
iq[jz] = (int32_t)(z-two24*fw);
|
||||
jz += 1; q0 += 24;
|
||||
iq[jz] = (int32_t) fw;
|
||||
} else iq[jz] = (int32_t) z ;
|
||||
}
|
||||
|
||||
/* convert integer "bit" chunk to floating-point value */
|
||||
fw = scalbn(one,q0);
|
||||
for(i=jz;i>=0;i--) {
|
||||
q[i] = fw*(double)iq[i]; fw*=twon24;
|
||||
}
|
||||
|
||||
/* compute PIo2[0,...,jp]*q[jz,...,0] */
|
||||
for(i=jz;i>=0;i--) {
|
||||
for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
|
||||
fq[jz-i] = fw;
|
||||
}
|
||||
|
||||
/* compress fq[] into y[] */
|
||||
switch(prec) {
|
||||
case 0:
|
||||
fw = 0.0;
|
||||
for (i=jz;i>=0;i--) fw += fq[i];
|
||||
y[0] = (ih==0)? fw: -fw;
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
fw = 0.0;
|
||||
for (i=jz;i>=0;i--) fw += fq[i];
|
||||
STRICT_ASSIGN(double,fw,fw);
|
||||
y[0] = (ih==0)? fw: -fw;
|
||||
fw = fq[0]-fw;
|
||||
for (i=1;i<=jz;i++) fw += fq[i];
|
||||
y[1] = (ih==0)? fw: -fw;
|
||||
break;
|
||||
case 3: /* painful */
|
||||
for (i=jz;i>0;i--) {
|
||||
fw = fq[i-1]+fq[i];
|
||||
fq[i] += fq[i-1]-fw;
|
||||
fq[i-1] = fw;
|
||||
}
|
||||
for (i=jz;i>1;i--) {
|
||||
fw = fq[i-1]+fq[i];
|
||||
fq[i] += fq[i-1]-fw;
|
||||
fq[i-1] = fw;
|
||||
}
|
||||
for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
|
||||
if(ih==0) {
|
||||
y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
|
||||
} else {
|
||||
y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
|
||||
}
|
||||
}
|
||||
return n&7;
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
|
||||
/* @(#)k_sin.c 1.3 95/01/18 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* __kernel_sin( x, y, iy)
|
||||
* kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
|
||||
*
|
||||
* Algorithm
|
||||
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
|
||||
* 2. Callers must return sin(-0) = -0 without calling here since our
|
||||
* odd polynomial is not evaluated in a way that preserves -0.
|
||||
* Callers may do the optimization sin(x) ~ x for tiny x.
|
||||
* 3. sin(x) is approximated by a polynomial of degree 13 on
|
||||
* [0,pi/4]
|
||||
* 3 13
|
||||
* sin(x) ~ x + S1*x + ... + S6*x
|
||||
* where
|
||||
*
|
||||
* |sin(x) 2 4 6 8 10 12 | -58
|
||||
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
|
||||
* | x |
|
||||
*
|
||||
* 4. sin(x+y) = sin(x) + sin'(x')*y
|
||||
* ~ sin(x) + (1-x*x/2)*y
|
||||
* For better accuracy, let
|
||||
* 3 2 2 2 2
|
||||
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
|
||||
* then 3 2
|
||||
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
|
||||
*/
|
||||
|
||||
#include "math_private.h"
|
||||
|
||||
static const double
|
||||
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
|
||||
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
|
||||
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
|
||||
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
|
||||
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
|
||||
S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
|
||||
S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
|
||||
|
||||
double
|
||||
__kernel_sin(double x, double y, int iy)
|
||||
{
|
||||
double z,r,v,w;
|
||||
|
||||
z = x*x;
|
||||
w = z*z;
|
||||
r = S2+z*(S3+z*S4) + z*w*(S5+z*S6);
|
||||
v = z*x;
|
||||
if(iy==0) return x+v*(S1+z*r);
|
||||
else return x-((z*(half*y-v*r)-y)-v*S1);
|
||||
}
|
@ -1,131 +0,0 @@
|
||||
/* @(#)k_tan.c 1.5 04/04/22 SMI */
|
||||
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
/* INDENT OFF */
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* __kernel_tan( x, y, k )
|
||||
* kernel tan function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
* Input k indicates whether tan (if k = 1) or -1/tan (if k = -1) is returned.
|
||||
*
|
||||
* Algorithm
|
||||
* 1. Since tan(-x) = -tan(x), we need only to consider positive x.
|
||||
* 2. Callers must return tan(-0) = -0 without calling here since our
|
||||
* odd polynomial is not evaluated in a way that preserves -0.
|
||||
* Callers may do the optimization tan(x) ~ x for tiny x.
|
||||
* 3. tan(x) is approximated by a odd polynomial of degree 27 on
|
||||
* [0,0.67434]
|
||||
* 3 27
|
||||
* tan(x) ~ x + T1*x + ... + T13*x
|
||||
* where
|
||||
*
|
||||
* |tan(x) 2 4 26 | -59.2
|
||||
* |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2
|
||||
* | x |
|
||||
*
|
||||
* Note: tan(x+y) = tan(x) + tan'(x)*y
|
||||
* ~ tan(x) + (1+x*x)*y
|
||||
* Therefore, for better accuracy in computing tan(x+y), let
|
||||
* 3 2 2 2 2
|
||||
* r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
|
||||
* then
|
||||
* 3 2
|
||||
* tan(x+y) = x + (T1*x + (x *(r+y)+y))
|
||||
*
|
||||
* 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
|
||||
* tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
|
||||
* = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
|
||||
*/
|
||||
|
||||
#include "math_private.h"
|
||||
static const double xxx[] = {
|
||||
3.33333333333334091986e-01, /* 3FD55555, 55555563 */
|
||||
1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */
|
||||
5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */
|
||||
2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */
|
||||
8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */
|
||||
3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */
|
||||
1.45620945432529025516e-03, /* 3F57DBC8, FEE08315 */
|
||||
5.88041240820264096874e-04, /* 3F4344D8, F2F26501 */
|
||||
2.46463134818469906812e-04, /* 3F3026F7, 1A8D1068 */
|
||||
7.81794442939557092300e-05, /* 3F147E88, A03792A6 */
|
||||
7.14072491382608190305e-05, /* 3F12B80F, 32F0A7E9 */
|
||||
-1.85586374855275456654e-05, /* BEF375CB, DB605373 */
|
||||
2.59073051863633712884e-05, /* 3EFB2A70, 74BF7AD4 */
|
||||
/* one */ 1.00000000000000000000e+00, /* 3FF00000, 00000000 */
|
||||
/* pio4 */ 7.85398163397448278999e-01, /* 3FE921FB, 54442D18 */
|
||||
/* pio4lo */ 3.06161699786838301793e-17 /* 3C81A626, 33145C07 */
|
||||
};
|
||||
#define one xxx[13]
|
||||
#define pio4 xxx[14]
|
||||
#define pio4lo xxx[15]
|
||||
#define T xxx
|
||||
/* INDENT ON */
|
||||
|
||||
double
|
||||
__kernel_tan(double x, double y, int iy) {
|
||||
double z, r, v, w, s;
|
||||
int32_t ix, hx;
|
||||
|
||||
GET_HIGH_WORD(hx,x);
|
||||
ix = hx & 0x7fffffff; /* high word of |x| */
|
||||
if (ix >= 0x3FE59428) { /* |x| >= 0.6744 */
|
||||
if (hx < 0) {
|
||||
x = -x;
|
||||
y = -y;
|
||||
}
|
||||
z = pio4 - x;
|
||||
w = pio4lo - y;
|
||||
x = z + w;
|
||||
y = 0.0;
|
||||
}
|
||||
z = x * x;
|
||||
w = z * z;
|
||||
/*
|
||||
* Break x^5*(T[1]+x^2*T[2]+...) into
|
||||
* x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
|
||||
* x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
|
||||
*/
|
||||
r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] +
|
||||
w * T[11]))));
|
||||
v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] +
|
||||
w * T[12])))));
|
||||
s = z * x;
|
||||
r = y + z * (s * (r + v) + y);
|
||||
r += T[0] * s;
|
||||
w = x + r;
|
||||
if (ix >= 0x3FE59428) {
|
||||
v = (double) iy;
|
||||
return (double) (1 - ((hx >> 30) & 2)) *
|
||||
(v - 2.0 * (x - (w * w / (w + v) - r)));
|
||||
}
|
||||
if (iy == 1)
|
||||
return w;
|
||||
else {
|
||||
/*
|
||||
* if allow error up to 2 ulp, simply return
|
||||
* -1.0 / (x+r) here
|
||||
*/
|
||||
/* compute -1.0 / (x+r) accurately */
|
||||
double a, t;
|
||||
z = w;
|
||||
SET_LOW_WORD(z,0);
|
||||
v = r - (z - x); /* z+v = r+x */
|
||||
t = a = -1.0 / w; /* a = -1.0/w */
|
||||
SET_LOW_WORD(t,0);
|
||||
s = 1.0 + t * z;
|
||||
return t + a * (s + t * v);
|
||||
}
|
||||
}
|
@ -25,18 +25,6 @@
|
||||
|
||||
#include "mozilla/EndianUtils.h"
|
||||
|
||||
/*
|
||||
* Emulate FreeBSD internal double types.
|
||||
* Adapted from https://github.com/freebsd/freebsd-src/search?q=__double_t
|
||||
*/
|
||||
|
||||
#if defined(__i386__)
|
||||
typedef long double __double_t;
|
||||
#else
|
||||
typedef double __double_t;
|
||||
#endif
|
||||
typedef __double_t double_t;
|
||||
|
||||
/*
|
||||
* The original fdlibm code used statements like:
|
||||
* n0 = ((*(int*)&one)>>29)^1; * index of high word *
|
||||
@ -603,56 +591,11 @@ CMPLXL(long double x, long double y)
|
||||
|
||||
#endif /* _COMPLEX_H */
|
||||
|
||||
/*
|
||||
* The rnint() family rounds to the nearest integer for a restricted range
|
||||
* range of args (up to about 2**MANT_DIG). We assume that the current
|
||||
* rounding mode is FE_TONEAREST so that this can be done efficiently.
|
||||
* Extra precision causes more problems in practice, and we only centralize
|
||||
* this here to reduce those problems, and have not solved the efficiency
|
||||
* problems. The exp2() family uses a more delicate version of this that
|
||||
* requires extracting bits from the intermediate value, so it is not
|
||||
* centralized here and should copy any solution of the efficiency problems.
|
||||
*/
|
||||
|
||||
static inline double
|
||||
rnint(__double_t x)
|
||||
{
|
||||
/*
|
||||
* This casts to double to kill any extra precision. This depends
|
||||
* on the cast being applied to a double_t to avoid compiler bugs
|
||||
* (this is a cleaner version of STRICT_ASSIGN()). This is
|
||||
* inefficient if there actually is extra precision, but is hard
|
||||
* to improve on. We use double_t in the API to minimise conversions
|
||||
* for just calling here. Note that we cannot easily change the
|
||||
* magic number to the one that works directly with double_t, since
|
||||
* the rounding precision is variable at runtime on x86 so the
|
||||
* magic number would need to be variable. Assuming that the
|
||||
* rounding precision is always the default is too fragile. This
|
||||
* and many other complications will move when the default is
|
||||
* changed to FP_PE.
|
||||
*/
|
||||
return ((double)(x + 0x1.8p52) - 0x1.8p52);
|
||||
}
|
||||
|
||||
/*
|
||||
* irint() and i64rint() give the same result as casting to their integer
|
||||
* return type provided their arg is a floating point integer. They can
|
||||
* sometimes be more efficient because no rounding is required.
|
||||
*/
|
||||
#if (defined(amd64) || defined(__i386__)) && defined(__GNUCLIKE_ASM)
|
||||
#define irint(x) \
|
||||
(sizeof(x) == sizeof(float) && \
|
||||
sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
|
||||
sizeof(x) == sizeof(double) && \
|
||||
sizeof(__double_t) == sizeof(long double) ? irintd(x) : \
|
||||
sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
|
||||
#else
|
||||
#define irint(x) ((int)(x))
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#if defined(__amd64__) || defined(__i386__)
|
||||
#define breakpoint() asm("int $3")
|
||||
#elif defined(__wasi__)
|
||||
#define breakpoint() __builtin_trap()
|
||||
#else
|
||||
#include <signal.h>
|
||||
|
||||
@ -849,9 +792,6 @@ rnint(__double_t x)
|
||||
#define asin fdlibm::asin
|
||||
#define atan fdlibm::atan
|
||||
#define atan2 fdlibm::atan2
|
||||
#define cos fdlibm::cos
|
||||
#define sin fdlibm::sin
|
||||
#define tan fdlibm::tan
|
||||
#define cosh fdlibm::cosh
|
||||
#define sinh fdlibm::sinh
|
||||
#define tanh fdlibm::tanh
|
||||
|
@ -46,18 +46,13 @@ SOURCES += [
|
||||
'e_log2.cpp',
|
||||
'e_pow.cpp',
|
||||
'e_sinh.cpp',
|
||||
'k_cos.cpp',
|
||||
'k_exp.cpp',
|
||||
'k_rem_pio2.cpp',
|
||||
'k_sin.cpp',
|
||||
'k_tan.cpp',
|
||||
's_asinh.cpp',
|
||||
's_atan.cpp',
|
||||
's_cbrt.cpp',
|
||||
's_ceil.cpp',
|
||||
's_ceilf.cpp',
|
||||
's_copysign.cpp',
|
||||
's_cos.cpp',
|
||||
's_expm1.cpp',
|
||||
's_fabs.cpp',
|
||||
's_floor.cpp',
|
||||
@ -67,8 +62,6 @@ SOURCES += [
|
||||
's_rint.cpp',
|
||||
's_rintf.cpp',
|
||||
's_scalbn.cpp',
|
||||
's_sin.cpp',
|
||||
's_tan.cpp',
|
||||
's_tanh.cpp',
|
||||
's_trunc.cpp',
|
||||
's_truncf.cpp',
|
||||
|
@ -1,84 +0,0 @@
|
||||
/* @(#)s_cos.c 5.1 93/09/24 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* cos(x)
|
||||
* Return cosine function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __kernel_sin ... sine function on [-pi/4,pi/4]
|
||||
* __kernel_cos ... cosine function on [-pi/4,pi/4]
|
||||
* __ieee754_rem_pio2 ... argument reduction routine
|
||||
*
|
||||
* Method.
|
||||
* Let S,C and T denote the sin, cos and tan respectively on
|
||||
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
|
||||
* in [-pi/4 , +pi/4], and let n = k mod 4.
|
||||
* We have
|
||||
*
|
||||
* n sin(x) cos(x) tan(x)
|
||||
* ----------------------------------------------------------
|
||||
* 0 S C T
|
||||
* 1 C -S -1/T
|
||||
* 2 -S -C T
|
||||
* 3 -C S -1/T
|
||||
* ----------------------------------------------------------
|
||||
*
|
||||
* Special cases:
|
||||
* Let trig be any of sin, cos, or tan.
|
||||
* trig(+-INF) is NaN, with signals;
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
#include "e_rem_pio2.cpp"
|
||||
|
||||
double
|
||||
cos(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
int32_t n, ix;
|
||||
|
||||
/* High word of x. */
|
||||
GET_HIGH_WORD(ix,x);
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
ix &= 0x7fffffff;
|
||||
if(ix <= 0x3fe921fb) {
|
||||
if(ix<0x3e46a09e) /* if x < 2**-27 * sqrt(2) */
|
||||
if(((int)x)==0) return 1.0; /* generate inexact */
|
||||
return __kernel_cos(x,z);
|
||||
}
|
||||
|
||||
/* cos(Inf or NaN) is NaN */
|
||||
else if (ix>=0x7ff00000) return x-x;
|
||||
|
||||
/* argument reduction needed */
|
||||
else {
|
||||
n = __ieee754_rem_pio2(x,y);
|
||||
switch(n&3) {
|
||||
case 0: return __kernel_cos(y[0],y[1]);
|
||||
case 1: return -__kernel_sin(y[0],y[1],1);
|
||||
case 2: return -__kernel_cos(y[0],y[1]);
|
||||
default:
|
||||
return __kernel_sin(y[0],y[1],1);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
/* @(#)s_sin.c 5.1 93/09/24 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* sin(x)
|
||||
* Return sine function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __kernel_sin ... sine function on [-pi/4,pi/4]
|
||||
* __kernel_cos ... cose function on [-pi/4,pi/4]
|
||||
* __ieee754_rem_pio2 ... argument reduction routine
|
||||
*
|
||||
* Method.
|
||||
* Let S,C and T denote the sin, cos and tan respectively on
|
||||
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
|
||||
* in [-pi/4 , +pi/4], and let n = k mod 4.
|
||||
* We have
|
||||
*
|
||||
* n sin(x) cos(x) tan(x)
|
||||
* ----------------------------------------------------------
|
||||
* 0 S C T
|
||||
* 1 C -S -1/T
|
||||
* 2 -S -C T
|
||||
* 3 -C S -1/T
|
||||
* ----------------------------------------------------------
|
||||
*
|
||||
* Special cases:
|
||||
* Let trig be any of sin, cos, or tan.
|
||||
* trig(+-INF) is NaN, with signals;
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
#include "e_rem_pio2.cpp"
|
||||
|
||||
double
|
||||
sin(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
int32_t n, ix;
|
||||
|
||||
/* High word of x. */
|
||||
GET_HIGH_WORD(ix,x);
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
ix &= 0x7fffffff;
|
||||
if(ix <= 0x3fe921fb) {
|
||||
if(ix<0x3e500000) /* |x| < 2**-26 */
|
||||
{if((int)x==0) return x;} /* generate inexact */
|
||||
return __kernel_sin(x,z,0);
|
||||
}
|
||||
|
||||
/* sin(Inf or NaN) is NaN */
|
||||
else if (ix>=0x7ff00000) return x-x;
|
||||
|
||||
/* argument reduction needed */
|
||||
else {
|
||||
n = __ieee754_rem_pio2(x,y);
|
||||
switch(n&3) {
|
||||
case 0: return __kernel_sin(y[0],y[1],1);
|
||||
case 1: return __kernel_cos(y[0],y[1]);
|
||||
case 2: return -__kernel_sin(y[0],y[1],1);
|
||||
default:
|
||||
return -__kernel_cos(y[0],y[1]);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
/* @(#)s_tan.c 5.1 93/09/24 */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
//#include <sys/cdefs.h>
|
||||
//__FBSDID("$FreeBSD$");
|
||||
|
||||
/* tan(x)
|
||||
* Return tangent function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __kernel_tan ... tangent function on [-pi/4,pi/4]
|
||||
* __ieee754_rem_pio2 ... argument reduction routine
|
||||
*
|
||||
* Method.
|
||||
* Let S,C and T denote the sin, cos and tan respectively on
|
||||
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
|
||||
* in [-pi/4 , +pi/4], and let n = k mod 4.
|
||||
* We have
|
||||
*
|
||||
* n sin(x) cos(x) tan(x)
|
||||
* ----------------------------------------------------------
|
||||
* 0 S C T
|
||||
* 1 C -S -1/T
|
||||
* 2 -S -C T
|
||||
* 3 -C S -1/T
|
||||
* ----------------------------------------------------------
|
||||
*
|
||||
* Special cases:
|
||||
* Let trig be any of sin, cos, or tan.
|
||||
* trig(+-INF) is NaN, with signals;
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define INLINE_REM_PIO2
|
||||
#include "math_private.h"
|
||||
#include "e_rem_pio2.cpp"
|
||||
|
||||
double
|
||||
tan(double x)
|
||||
{
|
||||
double y[2],z=0.0;
|
||||
int32_t n, ix;
|
||||
|
||||
/* High word of x. */
|
||||
GET_HIGH_WORD(ix,x);
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
ix &= 0x7fffffff;
|
||||
if(ix <= 0x3fe921fb) {
|
||||
if(ix<0x3e400000) /* x < 2**-27 */
|
||||
if((int)x==0) return x; /* generate inexact */
|
||||
return __kernel_tan(x,z,1);
|
||||
}
|
||||
|
||||
/* tan(Inf or NaN) is NaN */
|
||||
else if (ix>=0x7ff00000) return x-x; /* NaN */
|
||||
|
||||
/* argument reduction needed */
|
||||
else {
|
||||
n = __ieee754_rem_pio2(x,y);
|
||||
return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even
|
||||
-1 -- n odd */
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
API_BASE_URL=https://api.github.com/repos/freebsd/freebsd-src
|
||||
API_BASE_URL=https://api.github.com/repos/freebsd/freebsd
|
||||
|
||||
get_commit() {
|
||||
curl -s "${API_BASE_URL}/commits?path=lib/msun/src&per_page=1" \
|
||||
|
@ -6150,14 +6150,6 @@
|
||||
mirror: always
|
||||
do_not_use_directly: true
|
||||
|
||||
# Whether to use fdlibm for Math.sin, Math.cos, and Math.tan. When
|
||||
# privacy.resistFingerprinting is true, this pref is ignored and fdlibm is used
|
||||
# anyway.
|
||||
- name: javascript.options.use_fdlibm_for_sin_cos_tan
|
||||
type: bool
|
||||
value: false
|
||||
mirror: always
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Prefs starting with "layers."
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include "mozilla/RefPtr.h"
|
||||
#include "mozilla/Services.h"
|
||||
#include "mozilla/StaticMutex.h"
|
||||
#include "mozilla/StaticPrefs_javascript.h"
|
||||
#include "mozilla/StaticPrefs_privacy.h"
|
||||
#include "mozilla/StaticPtr.h"
|
||||
#include "mozilla/TextEvents.h"
|
||||
@ -717,12 +716,6 @@ void nsRFPService::UpdateRFPPref() {
|
||||
|
||||
bool privacyResistFingerprinting =
|
||||
StaticPrefs::privacy_resistFingerprinting();
|
||||
|
||||
// set fdlibm pref
|
||||
JS::SetUseFdlibmForSinCosTan(
|
||||
StaticPrefs::javascript_options_use_fdlibm_for_sin_cos_tan() ||
|
||||
privacyResistFingerprinting);
|
||||
|
||||
if (privacyResistFingerprinting) {
|
||||
PR_SetEnv("TZ=UTC");
|
||||
} else if (sInitialized) {
|
||||
|
Loading…
Reference in New Issue
Block a user