Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 987319 of SIMD

  • Revision slug: Web/JavaScript/Reference/Global_Objects/SIMD
  • Revision title: SIMD
  • Revision id: 987319
  • Created:
  • Creator: fscholz
  • Is current revision? No
  • Comment Add shiftRightByScalar, addSaturate, subSaturate

Revision Content

{{JSRef}} {{es7}}

{{Glossary("SIMD")}} (pronounced "sim-dee") is short for Single Instruction/Multiple Data which is one classification of computer architectures. SIMD operations perform the same computation on multiple data points resulting in data level parallelism and thus performance gains, for example for 3D graphics and video processing, physics simulations or cryptography, and other domains.

This page and sub pages are the SIMD API reference documentation. See also SIMD types for an article that describes SIMD in JavaScript more generally.

Description

The JavaScript SIMD API consists of several new types and operations. Browsers provide highly optimized implementations of this API depending on the underlying hardware of the user. Currently, SIMD is especially modeled for ARMv7 platforms with NEON and x86 platforms with SSE.

The SIMD API types are installed on a SIMD module. Unlike the other global objects, SIMD is not a constructor. You can not use it with a new operator or invoke the SIMD object as a function. All properties and methods of SIMD are static (as is the case with the {{jsxref("Math")}} object).

Overview

A SIMD value has multiple lanes. For a vector of length 4, the lanes are named x, y, z, and w. Now, instead of having to perform 4 separate operations on each of these lanes, SIMD allows you to perform the operation on all 4 lanes simultaneously. This requires fewer operations, which leads to performance improvements and better energy efficiency compared to scalar operations ({{Glossary("SISD")}}). Note that SIMD operations cannot be used to process multiple data in different ways. In the following figure, there is only a single instruction (addition) and thus it could be operated with SIMD:

SISD SIMD

Figures 1 and 2: SISD and SIMD compared.

Simple addition arithmetic

The JavaScript code for a simple SIMD operation like in figure 2 looks like this:

var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var c = SIMD.Float32x4.add(a,b); // Float32x4[6,8,10,12]

Data types

All SIMD data types are immutable. You can not alter them directly. Instead, you perform operations that create new immutable SIMD data types.

The following figure shows the different SIMD data types in a 128-bit SIMD register. The current SIMD JavaScript API has 12 different types with lane lengths of either 2, 4, 8 or 16.

Lanes per type in a 128-bit SIMD register

(TO BE UPDATED) Figure 3: Lanes per type in a 128-bit SIMD register.

SIMD boolean types

{{jsxref("Bool8x16", "SIMD.Bool8x16")}}
128-bits divided into 16 lanes storing boolean values.
{{jsxref("Bool16x8", "SIMD.Bool16x8")}}
128-bits divided into 8 lanes storing boolean values.
{{jsxref("Bool32x4", "SIMD.Bool32x4")}}
128-bits divided into 4 lanes storing boolean values.
{{jsxref("Bool64x2", "SIMD.Bool64x2")}}
128-bits divided into 2 lanes storing boolean values.

SIMD signed integer types

{{jsxref("Int8x16", "SIMD.Int8x16")}}
128-bits divided into 16 lanes storing 8-bit signed integer values.
{{jsxref("Int16x8", "SIMD.Int16x8")}}
128-bits divided into 8 lanes storing 16-bit signed integer values.
{{jsxref("Int32x4", "SIMD.Int32x4")}}
128-bits divided into 4 lanes storing 32-bit signed integer values.

SIMD unsigned integer types

{{jsxref("Uint8x16", "SIMD.Uint8x16")}}
128-bits divided into 16 lanes storing 8-bit unsigned integer values.
{{jsxref("Uint16x8", "SIMD.Uint16x8")}}
128-bits divided into 8 lanes storing 16-bit unsigned integer values.
{{jsxref("Uint32x4", "SIMD.Uint32x4")}}
128-bits divided into 4 lanes storing 32-bit unsigned integer values.

SIMD floating-point types

{{jsxref("Float32x4", "SIMD.Float32x4")}}
128-bits divided into 4 lanes storing single precision floating point values.
{{jsxref("Float64x2", "SIMD.Float64x2")}}
128-bits divided into 2 lanes storing double precision floating point values.

Constructor functions

In addition to the simple creator functions (e.g. SIMD.Int32x4(1,2,3,4)), the SIMD API provides the following constructor functions:

{{jsxref("SIMD.splat", "SIMD.%type%.splat()")}}
Creates SIMD data type with all lanes set to a given value.

You can also convert from one SIMD data type to another.

Note: SIMD types don't work with new, as SIMD values are no "boxed" objects (comparable to String(s) vs. new String(s), which creates a String object).

var v = new SIMD.Float32x4(0,1,2,3);
// TypeError: SIMD.Float32x4 is not a constructor

Instead, you just write:

var v = SIMD.Float32x4(0,1,2,3);

Operations

To actually do something with SIMD types, SIMD operations are needed that work on SIMD data types.

Note: Not all SIMD operations are available on all SIMD types, see the individual reference pages for details and availability.

Checking SIMD types

{{jsxref("SIMD.check", "SIMD.%type%.check()")}}
Returns a new instance if the parameter is a valid SIMD data type and the same as %type%. Throws a {{jsxref("TypeError")}} otherwise.

Accessing and mutating lanes

{{jsxref("SIMD.extractLane", "SIMD.%type%.extractLane()")}}
Returns the value of the given lane.
{{jsxref("SIMD.replaceLane", "SIMD.%type%.replaceLane()")}}
Returns a new instance with the given lane value replaced.
{{jsxref("SIMD.select", "SIMD.%type%.select()")}}
Returns a new instance with the lane values being a mix of the lanes depending on the selector mask.

Loading from and storing into typed arrays

{{jsxref("SIMD.load", "SIMD.%type%.load()")}}
Returns a new instance with the lane values loaded from a typed array.
{{jsxref("SIMD.store", "SIMD.%type%.store()")}}
Store a SIMD data type into a typed array.

Arithmetic operations

{{jsxref("SIMD.abs", "SIMD.%type%.abs()")}}
Returns a new instance with the absolute lane values.
{{jsxref("SIMD.add", "SIMD.%type%.add()")}}
Returns a new instance with the lane values added (a + b).
{{jsxref("SIMD.addSaturate", "SIMD.%type%.addSaturate()")}}
Returns a new instance with the lane values added (a + b) and saturating behavior on overflow.
{{jsxref("SIMD.div", "SIMD.%type%.div()")}}
Returns a new instance with the lane values divided (a / b).
{{jsxref("SIMD.mul", "SIMD.%type%.mul()")}}
Returns a new instance with the lane values multiplied (a * b).
{{jsxref("SIMD.neg", "SIMD.%type%.neg()")}}
Returns a new instance with the negated lane values.
{{jsxref("SIMD.reciprocalApproximation", "SIMD.%type%.reciprocalApproximation()")}}
Returns a new instance with an approximation of the reciprocal lane values.
{{jsxref("SIMD.reciprocalSqrtApproximation", "SIMD.%type%.reciprocalSqrtApproximation()")}}
Returns a new instance with an approximation of the reciprocal square root lane values.
{{jsxref("SIMD.sub", "SIMD.%type%.sub()")}}
Returns a new instance with the lane values subtracted (a - b).
{{jsxref("SIMD.subSaturate", "SIMD.%type%.subSaturate()")}}
Returns a new instance with the lane values subtracted (a - b) and saturating behavior on overflow.
{{jsxref("SIMD.sqrt", "SIMD.%type%.sqrt()")}}
Returns a new instance with the square root of the lane values.

Shuffling and swizzling

{{jsxref("SIMD.shuffle", "SIMD.%type%.shuffle()")}}
Returns a new instance with the lane values shuffled.
{{jsxref("SIMD.swizzle", "SIMD.%type%.swizzle()")}}
Returns a new instance with the lane values swizzled.

Min and max values

{{jsxref("SIMD.max", "SIMD.%type%.max()")}}
Returns a new instance with the maximum of the lane values.
{{jsxref("SIMD.maxNum", "SIMD.%type%.maxNum()")}}
Returns a new instance with the maximum of the lane values, preferring numbers over {{jsxref("NaN")}}.
{{jsxref("SIMD.min", "SIMD.%type%.min()")}}
Returns a new instance with the minimum of the lane values.
{{jsxref("SIMD.minNum", "SIMD.%type%.minNum()")}}
Returns a new instance with the minimum of the lane values, preferring numbers over {{jsxref("NaN")}}.

Comparisons

{{jsxref("SIMD.equal", "SIMD.%type%.equal()")}}
Returns a selection mask depending on a == b.
{{jsxref("SIMD.notEqual", "SIMD.%type%.notEqual()")}}
Returns a selection mask depending on a != b.
{{jsxref("SIMD.lessThan", "SIMD.%type%.lessThan()")}}
Returns a selection mask depending on a < b.
{{jsxref("SIMD.lessThanOrEqual", "SIMD.%type%.lessThanOrEqual()")}}
Returns selection mask depending on a <= b.
{{jsxref("SIMD.greaterThan", "SIMD.%type%.greaterThan()")}}
Returns a selection mask depending on a > b.
{{jsxref("SIMD.greaterThanOrEqual", "SIMD.%type%.greaterThanOrEqual()")}}
Returns a selection mask depending on a >= b.

Bitwise logical operations

{{jsxref("SIMD.and", "SIMD.%type%.and()")}}
Returns a new instance with the logical AND of the lane values (a & b).
{{jsxref("SIMD.or", "SIMD.%type%.or()")}}
Returns a new instance with the logical OR of the lane values (a | b).
{{jsxref("SIMD.xor", "SIMD.%type%.xor()")}}
Returns a new instance with the logical XOR of the lane values (a ^ b).
{{jsxref("SIMD.not", "SIMD.%type%.not()")}}
Returns a new instance with the logical NOT of the lane values (~a).

Bitwise shift operations

{{jsxref("SIMD.shiftLeftByScalar", "SIMD.%type%.shiftLeftByScalar()")}}
Returns a new instance with the lane values shifted left by a given bit count (a << bits).
{{jsxref("SIMD.shiftRightByScalar", "SIMD.%type%.shiftRightByScalar()")}}
Returns a new instance with the lane values shifted right. Behavior depends on whether the underlying type is signed or unsigned.
{{jsxref("SIMD.shiftRightArithmeticByScalar", "SIMD.%type%.shiftRightArithmeticByScalar()")}}
Returns a new instance with the lane values shifted right (arithmetic) by a given bit count (a >> bits).
{{jsxref("SIMD.shiftRightLogicalByScalar", "SIMD.%type%.shiftRightLogicalByScalar()")}}
Returns a new instance with the lane values shifted right (logical) by a given bit count (a >>> bits).

Data conversions

{{jsxref("SIMD.fromFloat32x4", "SIMD.%type%.fromFloat32x4()")}}
Creates a new SIMD data type with a float conversion from a Float32x4.
{{jsxref("SIMD.fromFloat32x4Bits", "SIMD.%type%.fromFloat32x4Bits()")}}
Creates a new SIMD data type with a bit-wise copy from a Float32x4.
{{jsxref("SIMD.fromFloat64x2Bits", "SIMD.%type%.fromFloat64x2Bits()")}}
Creates a new SIMD data type with a bit-wise copy from a Float64x2.
{{jsxref("SIMD.fromInt32x4", "SIMD.%type%.fromInt32x4()")}}
Creates a new SIMD data type with an integer conversion from a in32x4.
{{jsxref("SIMD.fromInt32x4Bits", "SIMD.%type%.fromInt32x4Bits()")}}
Creates a new SIMD data type with a bit-wise copy from an Int32x4.
{{jsxref("SIMD.fromInt16x8Bits", "SIMD.%type%.fromInt16x8Bits()")}}
Creates a new SIMD data type with a bit-wise copy from an Int16x8.
{{jsxref("SIMD.fromInt8x16Bits", "SIMD.%type%.fromInt8x16Bits()")}}
Creates a new SIMD data type with a bit-wise copy from an Int8x16.

SIMD prototype

The following methods and properties are installed on the SIMD.%type%.prototype.

SIMD.%type%.prototype.constructor
Specifies the function that creates a SIMD object's prototype.
{{jsxref("SIMD.toLocaleString", "SIMD.%type%.prototype.toLocaleString()")}}
Returns a localized string representing the SIMD type and its elements. Overrides the {{jsxref("Object.prototype.toLocaleString()")}} method.
{{jsxref("SIMD.toString", "SIMD.%type%.prototype.toString()")}}
Returns a string representing the SIMD type and its elements. Overrides the {{jsxref("Object.prototype.toString()")}} method.
{{jsxref("SIMD.valueOf", "SIMD.%type%.prototype.valueOf()")}}
Returns the primitive value of a SIMD object.
{{jsxref("SIMD.toSource", "SIMD.%type%.prototype.toSource()")}} {{non-standard_inline}}
Returns a string representing the source code of the object. Overrides the {{jsxref("Object.prototype.toSource()")}} method.

Polyfill

A Polyfill implementation based on typed arrays, is available at the ecmascript_simd GitHub repository.

Specifications

Specification Status Comment
{{SpecName('SIMD', '#simd', 'SIMD')}} {{Spec2('SIMD')}} Initial definition.

Browser compatibility

{{CompatibilityTable}}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Float32x4", "SIMD.Float32x4")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Float64x2", "SIMD.Float64x2")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Int8x16", "SIMD.Int8x16")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Int16x8", "SIMD.Int16x8")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Int32x4", "SIMD.Int32x4")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Uint8x16", "SIMD.Uint8x16")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Uint16x8", "SIMD.Uint16x8")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Uint32x4", "SIMD.Uint32x4")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool8x16", "SIMD.Bool8x16")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool16x8", "SIMD.Bool16x8")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool32x4", "SIMD.Bool32x4")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool64x2", "SIMD.Bool64x2")}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Float32x4", "SIMD.Float32x4")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Float64x2", "SIMD.Float64x2")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Int8x16", "SIMD.Int8x16")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Int16x8", "SIMD.Int16x8")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Int32x4", "SIMD.Int32x4")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Uint8x16", "SIMD.Uint8x16")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Uint16x8", "SIMD.Uint16x8")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Uint32x4", "SIMD.Uint32x4")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool8x16", "SIMD.Bool8x16")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool16x8", "SIMD.Bool16x8")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool32x4", "SIMD.Bool32x4")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
{{jsxref("Bool64x2", "SIMD.Bool64x2")}} {{CompatNo}} {{CompatNo}} {{CompatNightly("firefox")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}

Status notes

See also

Revision Source

<div>{{JSRef}} {{es7}}</div>

<p>{{Glossary("SIMD")}} (pronounced "sim-dee") is short for <strong>Single Instruction/Multiple Data</strong> which is one <a href="https://en.wikipedia.org/wiki/Flynn's_taxonomy">classification of computer architectures</a>. SIMD operations perform the same computation on multiple data points resulting in data level parallelism and thus performance gains, for example for 3D graphics and video processing, physics simulations or cryptography, and other domains.</p>

<p>This page and sub pages are the SIMD API reference documentation. See also <a href="/en-US/docs/Web/JavaScript/SIMD_types">SIMD types</a> for an article that describes SIMD in JavaScript more generally.</p>

<h2 id="Description">Description</h2>

<p>The JavaScript SIMD API consists of several new types and operations. Browsers provide highly optimized implementations of this API depending on the underlying hardware of the user. Currently, SIMD is especially modeled for <a href="https://en.wikipedia.org/wiki/ARM_architecture#Advanced_SIMD_(NEON)">ARMv7 platforms with NEON</a> and <a href="https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions">x86 platforms with SSE</a>.</p>

<p>The SIMD API types are installed on a <code>SIMD</code> module. Unlike the other global objects, <code>SIMD</code> is not a constructor. You can not use it with a <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new"><code>new</code> operator</a> or invoke the <code>SIMD</code> object as a function. All properties and methods of <code>SIMD</code> are static (as is the case with the {{jsxref("Math")}} object).</p>

<h3 id="Overview">Overview</h3>

<p>A SIMD value has multiple lanes. For a vector of length 4, the lanes are named <code>x</code>, <code>y</code>, <code>z</code>, and <code>w</code>. Now, instead of having to perform 4 separate operations on each of these lanes, SIMD allows you to perform the operation on all 4 lanes simultaneously. This requires fewer operations, which leads to performance improvements and better energy efficiency compared to scalar operations ({{Glossary("SISD")}}). Note that SIMD operations cannot be used to process multiple data in different ways. In the following figure, there is only a single instruction (addition) and thus it could be operated with SIMD:</p>

<div><img alt="SISD" src="https://mdn.mozillademos.org/files/10509/SISD.png" style="width:337px" /> <img alt="SIMD" src="https://mdn.mozillademos.org/files/10507/SIMD.png" style="width:337px" /></div>

<p>Figures 1 and 2: SISD and SIMD compared.</p>

<h3 id="Simple_addition_arithmetic">Simple addition arithmetic</h3>

<p>The JavaScript code for a simple SIMD operation like in figure 2 looks like this:</p>

<pre class="brush: js">
var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var c = SIMD.Float32x4.add(a,b); // Float32x4[6,8,10,12]
</pre>

<h2 id="Data_types">Data types</h2>

<p>All SIMD data types are <em>immutable</em>. You can not alter them directly. Instead, you perform operations that create new immutable SIMD data types.</p>

<p>The following figure shows the different SIMD data types in a 128-bit SIMD register. The current SIMD JavaScript API has 12 different types with lane lengths of either 2, 4, 8 or 16.</p>

<div><img alt="Lanes per type in a 128-bit SIMD register" src="https://mdn.mozillademos.org/files/11259/simd_register_drawio%281%29.png" /></div>

<p><strong>(TO BE UPDATED)</strong> Figure 3: Lanes per type in a 128-bit SIMD register.</p>

<h3 id="SIMD_boolean_types">SIMD boolean types</h3>

<dl>
 <dt>{{jsxref("Bool8x16", "SIMD.Bool8x16")}}</dt>
 <dd>128-bits divided into 16 lanes storing boolean values.</dd>
 <dt>{{jsxref("Bool16x8", "SIMD.Bool16x8")}}</dt>
 <dd>128-bits divided into 8 lanes storing boolean values.</dd>
 <dt>{{jsxref("Bool32x4", "SIMD.Bool32x4")}}</dt>
 <dd>128-bits divided into 4 lanes storing boolean values.</dd>
 <dt>{{jsxref("Bool64x2", "SIMD.Bool64x2")}}</dt>
 <dd>128-bits divided into 2 lanes storing boolean values.</dd>
</dl>

<h3 id="SIMD_signed_integer_types">SIMD signed integer types</h3>

<dl>
 <dt>{{jsxref("Int8x16", "SIMD.Int8x16")}}</dt>
 <dd>128-bits divided into 16 lanes storing 8-bit signed integer values.</dd>
 <dt>{{jsxref("Int16x8", "SIMD.Int16x8")}}</dt>
 <dd>128-bits divided into 8 lanes storing 16-bit signed&nbsp;integer values.</dd>
 <dt>{{jsxref("Int32x4", "SIMD.Int32x4")}}</dt>
 <dd>128-bits divided into 4 lanes storing 32-bit signed integer values.</dd>
</dl>

<h3 id="SIMD_unsigned_integer_types">SIMD unsigned integer types</h3>

<dl>
 <dt>{{jsxref("Uint8x16", "SIMD.Uint8x16")}}</dt>
 <dd>128-bits divided into 16 lanes storing 8-bit unsigned integer values.</dd>
 <dt>{{jsxref("Uint16x8", "SIMD.Uint16x8")}}</dt>
 <dd>128-bits divided into 8 lanes storing 16-bit&nbsp;unsigned integer values.</dd>
 <dt>{{jsxref("Uint32x4", "SIMD.Uint32x4")}}</dt>
 <dd>128-bits divided into 4 lanes storing 32-bit&nbsp;unsigned integer values.</dd>
</dl>

<h3 id="SIMD_floating-point_types">SIMD floating-point types</h3>

<dl>
 <dt>{{jsxref("Float32x4", "SIMD.Float32x4")}}</dt>
 <dd>128-bits divided into 4 lanes storing single precision floating point values.</dd>
 <dt>{{jsxref("Float64x2", "SIMD.Float64x2")}}</dt>
 <dd>128-bits divided into 2 lanes storing double precision floating point values.</dd>
</dl>

<h2 id="Constructor_functions">Constructor functions</h2>

<p>In addition to the simple creator functions (e.g. <code>SIMD.Int32x4(1,2,3,4)</code>), the SIMD API provides the following constructor functions:</p>

<dl>
 <dt>{{jsxref("SIMD.splat", "SIMD.%type%.splat()")}}</dt>
 <dd>Creates SIMD data type with all lanes set to a given value.</dd>
</dl>

<p>You can also <a href="#Data_conversions">convert from one SIMD data type to another</a>.</p>

<div class="note">
<p><strong>Note:</strong> SIMD types don't work with <code>new</code>, as SIMD values are no "boxed" objects (comparable to <code>String(s)</code> vs. <code>new String(s)</code>, which creates a String object).</p>

<pre class="brush: js example-bad">
var v = new SIMD.Float32x4(0,1,2,3);
// TypeError: SIMD.Float32x4 is not a constructor</pre>

<p>Instead, you just write:</p>

<pre class="brush: js example-good">
var v = SIMD.Float32x4(0,1,2,3);</pre>
</div>

<h2 id="Operations">Operations</h2>

<p>To actually do something with SIMD types, SIMD operations are needed that work on SIMD data types.</p>

<div class="note">
<p><strong>Note:</strong> Not all SIMD operations are available on all SIMD types, see the individual reference pages for details and availability.</p>
</div>

<h3 id="Checking_SIMD_types">Checking SIMD types</h3>

<dl>
 <dt>{{jsxref("SIMD.check", "SIMD.%type%.check()")}}</dt>
 <dd>Returns a new instance if the parameter is a valid SIMD data type and the same as <code>%type%</code>. Throws a {{jsxref("TypeError")}} otherwise.</dd>
</dl>

<h3 id="Accessing_and_mutating_lanes">Accessing and mutating lanes</h3>

<dl>
 <dt>{{jsxref("SIMD.extractLane", "SIMD.%type%.extractLane()")}}</dt>
 <dd>Returns the value of the given lane.</dd>
 <dt>{{jsxref("SIMD.replaceLane", "SIMD.%type%.replaceLane()")}}</dt>
 <dd>Returns a new instance with the given lane value replaced.</dd>
 <dt>{{jsxref("SIMD.select", "SIMD.%type%.select()")}}</dt>
 <dd>Returns a new instance with the lane values being a mix of the lanes depending on the selector mask.</dd>
</dl>

<h3 id="Loading_from_and_storing_into_typed_arrays">Loading from and storing into typed arrays</h3>

<dl>
 <dt>{{jsxref("SIMD.load", "SIMD.%type%.load()")}}</dt>
 <dd>Returns a new instance with the lane values loaded from a <a href="/en-US/docs/Web/JavaScript/Typed_arrays">typed array</a>.</dd>
 <dt>{{jsxref("SIMD.store", "SIMD.%type%.store()")}}</dt>
 <dd>Store a SIMD data type into a <a href="/en-US/docs/Web/JavaScript/Typed_arrays">typed array</a>.</dd>
</dl>

<h3 id="Arithmetic_operations">Arithmetic operations</h3>

<dl>
 <dt>{{jsxref("SIMD.abs", "SIMD.%type%.abs()")}}</dt>
 <dd>Returns a new instance with the absolute lane values.</dd>
 <dt>{{jsxref("SIMD.add", "SIMD.%type%.add()")}}</dt>
 <dd>Returns a new instance with the lane values added (<code>a + b</code>).</dd>
 <dt>{{jsxref("SIMD.addSaturate", "SIMD.%type%.addSaturate()")}}</dt>
 <dd>Returns a new instance with the lane values added (<code>a + b</code>) and saturating behavior on overflow.</dd>
 <dt>{{jsxref("SIMD.div", "SIMD.%type%.div()")}}</dt>
 <dd>Returns a new instance with the lane values divided (<code>a / b</code>).</dd>
 <dt>{{jsxref("SIMD.mul", "SIMD.%type%.mul()")}}</dt>
 <dd>Returns a new instance with the lane values multiplied (<code>a * b</code>).</dd>
 <dt>{{jsxref("SIMD.neg", "SIMD.%type%.neg()")}}</dt>
 <dd>Returns a new instance with the negated lane values.</dd>
 <dt>{{jsxref("SIMD.reciprocalApproximation", "SIMD.%type%.reciprocalApproximation()")}}</dt>
 <dd>Returns a new instance with an approximation of the reciprocal lane values.</dd>
 <dt>{{jsxref("SIMD.reciprocalSqrtApproximation", "SIMD.%type%.reciprocalSqrtApproximation()")}}</dt>
 <dd>Returns a new instance with an approximation of the reciprocal square root lane values.</dd>
 <dt>{{jsxref("SIMD.sub", "SIMD.%type%.sub()")}}</dt>
 <dd>Returns a new instance with the lane values subtracted (<code>a - b</code>).</dd>
 <dt>{{jsxref("SIMD.subSaturate", "SIMD.%type%.subSaturate()")}}</dt>
 <dd>Returns a new instance with the lane values subtracted (<code>a - b</code>) and&nbsp;saturating behavior on overflow.</dd>
 <dt>{{jsxref("SIMD.sqrt", "SIMD.%type%.sqrt()")}}</dt>
 <dd>Returns a new instance with the square root of the lane values.</dd>
</dl>

<h3 id="Shuffling_and_swizzling">Shuffling and swizzling</h3>

<dl>
 <dt>{{jsxref("SIMD.shuffle", "SIMD.%type%.shuffle()")}}</dt>
 <dd>Returns a new instance with the lane values shuffled.</dd>
 <dt>{{jsxref("SIMD.swizzle", "SIMD.%type%.swizzle()")}}</dt>
 <dd>Returns a new instance with the lane values swizzled.</dd>
</dl>

<h3 id="Min_and_max_values">Min and max values</h3>

<dl>
 <dt>{{jsxref("SIMD.max", "SIMD.%type%.max()")}}</dt>
 <dd>Returns a new instance with the maximum of the lane values.</dd>
 <dt>{{jsxref("SIMD.maxNum", "SIMD.%type%.maxNum()")}}</dt>
 <dd>Returns a new instance with the maximum of the lane values, preferring numbers over {{jsxref("NaN")}}.</dd>
 <dt>{{jsxref("SIMD.min", "SIMD.%type%.min()")}}</dt>
 <dd>Returns a new instance with the minimum of the lane values.</dd>
 <dt>{{jsxref("SIMD.minNum", "SIMD.%type%.minNum()")}}</dt>
 <dd>Returns a new instance with the minimum of the lane values, preferring numbers over {{jsxref("NaN")}}.</dd>
</dl>

<h3 id="Comparisons">Comparisons</h3>

<dl>
 <dt>{{jsxref("SIMD.equal", "SIMD.%type%.equal()")}}</dt>
 <dd>Returns a selection mask depending on <code>a == b</code>.</dd>
 <dt>{{jsxref("SIMD.notEqual", "SIMD.%type%.notEqual()")}}</dt>
 <dd>Returns a selection mask depending on <code>a != b</code>.</dd>
 <dt>{{jsxref("SIMD.lessThan", "SIMD.%type%.lessThan()")}}</dt>
 <dd>Returns a selection mask depending on <code>a &lt; b</code>.</dd>
 <dt>{{jsxref("SIMD.lessThanOrEqual", "SIMD.%type%.lessThanOrEqual()")}}</dt>
 <dd>Returns selection mask depending on <code>a &lt;= b</code>.</dd>
 <dt>{{jsxref("SIMD.greaterThan", "SIMD.%type%.greaterThan()")}}</dt>
 <dd>Returns a selection mask depending on <code>a &gt; b</code>.</dd>
 <dt>{{jsxref("SIMD.greaterThanOrEqual", "SIMD.%type%.greaterThanOrEqual()")}}</dt>
 <dd>Returns a selection mask depending on <code>a &gt;= b</code>.</dd>
</dl>

<h3 id="Bitwise_logical_operations">Bitwise logical operations</h3>

<dl>
 <dt>{{jsxref("SIMD.and", "SIMD.%type%.and()")}}</dt>
 <dd>Returns a new instance with the logical AND of the lane values (<code>a &amp; b</code>).</dd>
 <dt>{{jsxref("SIMD.or", "SIMD.%type%.or()")}}</dt>
 <dd>Returns a new instance with the logical OR of the lane values (<code>a | b</code>).</dd>
 <dt>{{jsxref("SIMD.xor", "SIMD.%type%.xor()")}}</dt>
 <dd>Returns a new instance with the logical XOR of the lane values (<code>a ^ b</code>).</dd>
 <dt>{{jsxref("SIMD.not", "SIMD.%type%.not()")}}</dt>
 <dd>Returns a new instance with the logical NOT of the lane values (<code>~a</code>).</dd>
</dl>

<h3 id="Bitwise_shift_operations">Bitwise shift operations</h3>

<dl>
 <dt>{{jsxref("SIMD.shiftLeftByScalar", "SIMD.%type%.shiftLeftByScalar()")}}</dt>
 <dd>Returns a new instance with the lane values shifted left by a given bit count (<code>a &lt;&lt; bits</code>).</dd>
 <dt>{{jsxref("SIMD.shiftRightByScalar", "SIMD.%type%.shiftRightByScalar()")}}</dt>
 <dd>Returns a new instance with the lane values shifted right. Behavior depends on whether the underlying type is signed or unsigned.</dd>
 <dt>{{jsxref("SIMD.shiftRightArithmeticByScalar", "SIMD.%type%.shiftRightArithmeticByScalar()")}}</dt>
 <dd>Returns a new instance with the lane values shifted right (arithmetic) by a given bit count (<code>a &gt;&gt; bits</code>).</dd>
 <dt>{{jsxref("SIMD.shiftRightLogicalByScalar", "SIMD.%type%.shiftRightLogicalByScalar()")}}</dt>
 <dd>Returns a new instance with the lane values shifted right (logical) by a given bit count (<code>a &gt;&gt;&gt; bits</code>).</dd>
</dl>

<h3 id="Data_conversions">Data conversions</h3>

<dl>
 <dt>{{jsxref("SIMD.fromFloat32x4", "SIMD.%type%.fromFloat32x4()")}}</dt>
 <dd>Creates a new SIMD data type with a float conversion from a Float32x4.</dd>
 <dt>{{jsxref("SIMD.fromFloat32x4Bits", "SIMD.%type%.fromFloat32x4Bits()")}}</dt>
 <dd>Creates a new SIMD data type with a bit-wise copy from a Float32x4.</dd>
 <dt>{{jsxref("SIMD.fromFloat64x2Bits", "SIMD.%type%.fromFloat64x2Bits()")}}</dt>
 <dd>Creates a new SIMD data type with a bit-wise copy from a Float64x2.</dd>
 <dt>{{jsxref("SIMD.fromInt32x4", "SIMD.%type%.fromInt32x4()")}}</dt>
 <dd>Creates a new SIMD data type with an integer conversion from a in32x4.</dd>
 <dt>{{jsxref("SIMD.fromInt32x4Bits", "SIMD.%type%.fromInt32x4Bits()")}}</dt>
 <dd>Creates a new SIMD data type with a bit-wise copy from an Int32x4.</dd>
 <dt>{{jsxref("SIMD.fromInt16x8Bits", "SIMD.%type%.fromInt16x8Bits()")}}</dt>
 <dd>Creates a new SIMD data type with a bit-wise copy from an Int16x8.</dd>
 <dt>{{jsxref("SIMD.fromInt8x16Bits", "SIMD.%type%.fromInt8x16Bits()")}}</dt>
 <dd>Creates a new SIMD data type with a bit-wise copy from an Int8x16.</dd>
</dl>

<h2 id="SIMD_prototype">SIMD prototype</h2>

<p>The following methods and properties are installed on the <code>SIMD.%type%.prototype</code>.</p>

<dl>
 <dt><code>SIMD.%type%.prototype.constructor</code></dt>
 <dd>Specifies the function that creates a SIMD object's prototype.</dd>
 <dt>{{jsxref("SIMD.toLocaleString", "SIMD.%type%.prototype.toLocaleString()")}}</dt>
 <dd>Returns a localized string representing the SIMD type and its elements. Overrides the {{jsxref("Object.prototype.toLocaleString()")}} method.</dd>
 <dt>{{jsxref("SIMD.toString", "SIMD.%type%.prototype.toString()")}}</dt>
 <dd>Returns a string representing the SIMD type and its elements. Overrides the {{jsxref("Object.prototype.toString()")}} method.</dd>
 <dt>{{jsxref("SIMD.valueOf", "SIMD.%type%.prototype.valueOf()")}}</dt>
 <dd>Returns the primitive value of a SIMD object.</dd>
 <dt>{{jsxref("SIMD.toSource", "SIMD.%type%.prototype.toSource()")}} {{non-standard_inline}}</dt>
 <dd>Returns a string representing the source code of the object. Overrides the {{jsxref("Object.prototype.toSource()")}} method.</dd>
</dl>

<h2 id="Polyfill">Polyfill</h2>

<p>A Polyfill implementation based on <a href="/en-US/docs/Web/JavaScript/Typed_arrays">typed arrays</a>, is available at the <a href="https://github.com/tc39/ecmascript_simd">ecmascript_simd</a> GitHub repository.</p>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('SIMD', '#simd', 'SIMD')}}</td>
   <td>{{Spec2('SIMD')}}</td>
   <td>Initial definition.</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility">Browser compatibility</h2>

<p>{{CompatibilityTable}}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Float32x4", "SIMD.Float32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Float64x2", "SIMD.Float64x2")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Int8x16", "SIMD.Int8x16")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Int16x8", "SIMD.Int16x8")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Int32x4", "SIMD.Int32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Uint8x16", "SIMD.Uint8x16")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Uint16x8", "SIMD.Uint16x8")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Uint32x4", "SIMD.Uint32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool8x16", "SIMD.Bool8x16")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool16x8", "SIMD.Bool16x8")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool32x4", "SIMD.Bool32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool64x2", "SIMD.Bool64x2")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Float32x4", "SIMD.Float32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Float64x2", "SIMD.Float64x2")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Int8x16", "SIMD.Int8x16")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Int16x8", "SIMD.Int16x8")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Int32x4", "SIMD.Int32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Uint8x16", "SIMD.Uint8x16")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Uint16x8", "SIMD.Uint16x8")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Uint32x4", "SIMD.Uint32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool8x16", "SIMD.Bool8x16")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool16x8", "SIMD.Bool16x8")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool32x4", "SIMD.Bool32x4")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
  <tr>
   <td>{{jsxref("Bool64x2", "SIMD.Bool64x2")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNightly("firefox")}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
 </tbody>
</table>
</div>

<h2 id="Status_notes">Status notes</h2>

<ul>
 <li><a href="https://status.modern.ie/simdes7">"In development" in Microsoft Edge</a></li>
 <li><a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/2PIOEJG_aYY">"Intent to implement" in Blink/Chromium</a></li>
</ul>

<h2 id="See_also">See also</h2>

<ul>
 <li><a href="/en-US/docs/Glossary/SIMD">Glossary: SIMD</a></li>
 <li><a href="/en-US/docs/Web/JavaScript/SIMD_types">SIMD types</a></li>
 <li><a href="/en-US/docs/Web/JavaScript/Data_structures">Data types and data structures</a></li>
 <li><a href="/en-US/docs/Web/JavaScript/Typed_arrays">JavaScript typed arrays</a></li>
 <li><a href="https://www.youtube.com/watch?v=CbMXkbqQBcQ">SIMD Programming in JavaScript</a>, talk by Peter Jensen, Intel.</li>
 <li><a href="https://peterjensen.github.io/mandelbrot/js/mandelbrot-ww-asm.html">Mandelbrot animation using SIMD,</a> demo by Peter Jensen, Intel.</li>
 <li><a href="https://blog.mozilla.org/javascript/2015/03/10/state-of-simd-js-performance-in-firefox/">The state of SIMD.js performance in Firefox</a>, blog post by Benjamin Bouvier, Mozilla.</li>
</ul>
Revert to this revision