Vyacheslav Egorov (2013-10-30T15:43:35.000Z)
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);