function imuldw( a, b, out, stride, offset ) {
	var w1;
	var w2;
	var w3;
	var ha;
	var hb;
	var la;
	var lb;
	var t;
	var k;

	if ( isnan( a ) || isnan( b ) ) {
		out[ offset ] = NaN;
		out[ offset + stride ] = NaN;
		return out;
	}
	a |= 0; // asm type annotation
	b |= 0; // asm type annotation

	ha = ( a >> 16 ) | 0;
	la = ( a & LOW_WORD_MASK ) >>> 0;

	hb = ( b >> 16 ) | 0;
	lb = ( b & LOW_WORD_MASK ) >>> 0;

	t = ( la*lb ) >>> 0;
	w3 = ( t & LOW_WORD_MASK ) >>> 0;
	k = ( t >>> 16 ) >>> 0;

	t = ( ( ha*lb ) + k ) >>> 0;
	w2 = ( t & LOW_WORD_MASK ) >>> 0;
	w1 = ( t >> 16 ) >>> 0;

	t = ( ( la*hb ) + w2 ) >>> 0;
	k = ( t >> 16 ) >>> 0;

	out[ offset ] = ( ( ha*hb ) + w1 + k ) | 0; // compute the higher 32 bits and cast to a signed 32-bit integer
	out[ offset + stride ] = ( ( t << 16 ) + w3 ) | 0; // compute the lower 32 bits and cast to a signed 32-bit integer

	return out;
}
Performs multiplication of two signed 32-bit integers and returns an array of two signed 32-bit integers which represents the signed 64-bit integer product.

@param {uinteger32} a - integer
@param {uinteger32} b - integer
@param {Collection} out - output array
@param {integer} stride - output array stride
@param {NonNegativeInteger} offset - output array index offset
@returns {Collection} output array

@example
var v = imuldw( 0xAAAAAAAA, 0x55555555, [ 0, 0 ], 1, 0 );
// returns [ -477218589, 1908874354 ]