Skip to content

Commit

Permalink
Add Math.signbit (AssemblyScript#333)
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxGraey authored and Willem Wyndham committed Dec 26, 2018
1 parent c0706e3 commit c496345
Show file tree
Hide file tree
Showing 7 changed files with 4,779 additions and 4,283 deletions.
2 changes: 2 additions & 0 deletions std/assembly/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -908,6 +908,8 @@ interface IMath<T> {
round(x: T): T;
/** Returns the sign of `x`, indicating whether the number is positive, negative or zero. */
sign(x: T): T;
/** Returns whether the sign bit of `x` is set */
signbit(x: T): bool;
/** Returns the sine of `x`. */
sin(x: T): T;
/** Returns the hyperbolic sine of `x`. */
Expand Down
12 changes: 12 additions & 0 deletions std/assembly/math.ts
Original file line number Diff line number Diff line change
Expand Up @@ -992,6 +992,13 @@ export namespace NativeMath {
}
}

@inline
export function signbit(x: f64): bool {
// In ECMAScript all NaN values are indistinguishable from each other
// so we need handle NaN and negative NaN in similar way
return <bool>(<i32>(reinterpret<u64>(x) >>> 63) & (x == x));
}

export function sin(x: f64): f64 { // TODO
unreachable();
return 0;
Expand Down Expand Up @@ -2046,6 +2053,11 @@ export namespace NativeMathf {
}
}

@inline
export function signbit(x: f32): bool {
return <bool>((reinterpret<u32>(x) >>> 31) & (x == x));
}

export function sin(x: f32): f32 { // TODO
unreachable();
return 0;
Expand Down
1 change: 1 addition & 0 deletions std/portable/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ interface IMath {
random(): f64;
round(x: f64): f64;
sign(x: f64): f64;
signbit(x: f64): bool;
sin(x: f64): f64;
sinh(x: f64): f64;
sqrt(x: f64): f64;
Expand Down
8 changes: 7 additions & 1 deletion std/portable/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ var globalScope = typeof window !== "undefined" && window || typeof global !== "

globalScope.ASC_TARGET = 0;

var F64 = new Float64Array(1);
var U64 = new Uint32Array(F64.buffer);

Object.defineProperties(
globalScope["i8"] = function i8(value) { return value << 24 >> 24; }
, {
Expand Down Expand Up @@ -210,7 +213,7 @@ globalScope["isString"] = function isString(arg) {

globalScope["isArray"] = Array.isArray;

globalScope["unchecked"] = function(expr) {
globalScope["unchecked"] = function unchecked(expr) {
return expr;
};

Expand All @@ -223,6 +226,9 @@ globalScope["fmodf"] = function fmodf(x, y) {
};

globalScope["JSMath"] = Math;
globalScope["JSMath"].signbit = function signbit(x) {
F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));
}

globalScope["memory"] = (() => {
var HEAP = new Uint8Array(0);
Expand Down
Loading

0 comments on commit c496345

Please sign in to comment.