domenic at domenicdenicola.com (2013-11-03T22:16:53.303Z)
There are algorithms that require 64-bit arithmetic, however currently
JavaScript does not provide any efficient way to perform it.
Similar to `Math.imul` which was added for the purposes of efficient
32-bit multiplication I propose extending Math object with a family of
operations `Math.<s>64<op>` where `<s>` is one of {`i`, `u`} and `<op>` is one of { `sub`, `add`, `mul`, `div`, `neg` }
These functions are specified as follows for `<op>` in { `sub`, `add`, `mul`, `div` }:
# `Math.<s>64<op>`
1. accepts 4 arguments `al`, `ah`, `bl`, `bh`
2. `x' = ToUint32(x)`, for `x` in {`al`, `ah`, `bl`, `bh` }
3. pairs (`al'`, `ah'`) and (`bl'`, `bh'`) are interpreted as 64-bit signed (if `<s>` == `i`) or unsigned (if `<s>` == `u`) integer values with first member of the pair containing low bits and second - high bits.
4. Result is computed as a standard overflowing operation on 64-bit values and is decomposed into two int32 values (`cl'`, `ch'`) = (`al'`, `ah'`) `<op>` (`bl'`, `bh'`)
5. A one shot property `Math.H` is created that returns `ch'` on the first
access and deletes itself.
6. Return `cl'`
Unary operation is specified in a similar straightforward fashion.
Here is addition of three unsigned 64bit integers using described functions:
```js
var al, ah, bl, bh, cl, ch, dl, dh;
dl = Math.u64add(Math.u64add(al, ah, bl, bh), Math.H, cl, ch);
dh = Math.H;
```
This API is designed purposefully to allow good optimizations of the
resulting code, e.g. optimizing compiler knowing one shot semantics of
`H` property can eradicate any memory traffic and keep things in
registers even collocating (`dl`, `dh`) to a single 64-bit register on
64-bit platform.
I think such API has many advantages:
- can greatly improve performance of numeric algorithms relying on 64-bit math;
- easily polyfillable in the current JavaScript;
- does not depend on any complicated language changes (e.g. value objects);
- simple to implement and optimize on any platform (including 32bit ones);
Hi, There are algorithms that require 64-bit arithmetic, however currently JavaScript does not provide any efficient way to perform it. Similar to Math.imul which was added for the purposes of efficient 32-bit multiplication I propose extending Math object with a family of operations Math.<s>64<op> where <s> is one of {i, u} and <op> is one of { sub, add, mul, div, neg } These functions are specified as follows for <op> in { sub, add, mul, div }: Math.<s>64<op> 1. accepts 4 arguments al, ah, bl, bh 2. x' = ToUint32(x), for x in {al, ah, bl, bh } 3. pairs (al', ah') and (bl', bh') are interpreted as 64-bit signed (if <s> == i) or unsigned (if <s> == u) integer values with first member of the pair containing low bits and second - high bits. 4. Result is computed as a standard overflowing operation on 64-bit values and is decomposed into two int32 values (cl', ch') = (al', ah') <op> (bl', bh') 5. A one shot property Math.H is created that returns ch' on the first access and deletes itself. 6. Return cl' Unary operation is specified in a similar straightforward fashion. Here is addition of three unsigned 64bit integers using described functions: var al, ah, bl, bh, cl, ch, dl, dh; dl = Math.u64add(Math.u64add(al, ah, bl, bh), Math.H, cl, ch); dh = Math.H; This API is designed purposefully to allow good optimizations of the resulting code, e.g. optimizing compiler knowing one shot semantics of H property can eradicate any memory traffic and keep things in registers even collocating (dl, dh) to a single 64-bit register on 64-bit platform. I think such API has many advantages: - can greatly improve performance of numeric algorithms relying on 64-bit math; - easily polyfillable in the current JavaScript; - does not depend on any complicated language changes (e.g. value objects); - simple to implement and optimize on any platform (including 32bit ones); -- Vyacheslav Egorov