function gcopy( N, x, strideX, y, strideY ) {
	var ix;
	var iy;
	var ox;
	var oy;
	var m;
	var i;

	if ( N <= 0 ) {
		return y;
	}
	ox = arraylike2object( x );
	oy = arraylike2object( y );
	if ( ox.accessorProtocol || oy.accessorProtocol ) {
		if ( strideX < 0 ) {
			ix = (1-N) * strideX;
		} else {
			ix = 0;
		}
		if ( strideY < 0 ) {
			iy = (1-N) * strideY;
		} else {
			iy = 0;
		}
		accessors( N, ox, strideX, ix, oy, strideY, iy );
		return oy.data;
	}
	// Use unrolled loops if both strides are equal to `1`...
	if ( strideX === 1 && strideY === 1 ) {
		m = N % M;

		// If we have a remainder, run a clean-up loop...
		if ( m > 0 ) {
			for ( i = 0; i < m; i++ ) {
				y[ i ] = x[ i ];
			}
		}
		if ( N < M ) {
			return y;
		}
		for ( i = m; i < N; i += M ) {
			y[ i ] = x[ i ];
			y[ i+1 ] = x[ i+1 ];
			y[ i+2 ] = x[ i+2 ];
			y[ i+3 ] = x[ i+3 ];
			y[ i+4 ] = x[ i+4 ];
			y[ i+5 ] = x[ i+5 ];
			y[ i+6 ] = x[ i+6 ];
			y[ i+7 ] = x[ i+7 ];
		}
		return y;
	}
	if ( strideX < 0 ) {
		ix = (1-N) * strideX;
	} else {
		ix = 0;
	}
	if ( strideY < 0 ) {
		iy = (1-N) * strideY;
	} else {
		iy = 0;
	}
	for ( i = 0; i < N; i++ ) {
		y[ iy ] = x[ ix ];
		ix += strideX;
		iy += strideY;
	}
	return y;
}
Copies values from `x` into `y`.

@param {PositiveInteger} N - number of indexed elements
@param {Collection} x - input array
@param {integer} strideX - `x` stride length
@param {Collection} y - output array
@param {integer} strideY - `y` stride length
@returns {Collection} output array

@example
var x = [ 1.0, 2.0, 3.0, 4.0, 5.0 ];
var y = [ 6.0, 7.0, 8.0, 9.0, 10.0 ];

gcopy( x.length, x, 1, y, 1 );
// y => [ 1.0, 2.0, 3.0, 4.0, 5.0 ]