/* Note the ordering to try to avoid load (and address generation) latencies.  */
static void __memcpy_aligned_up(unsigned long d, unsigned long s, long n)
/* Note the ordering to try to avoid load (and address generation) latencies.  */
static void __memcpy_aligned_up(unsigned long d, unsigned long s, long n)
{
	ALIGN_DEST_TO8_UP(d,s,n);
	n -= 8;
	while (n >= 0) {
		unsigned long tmp;
		__asm__("ldq %0,%1":"=r" (tmp):"m" (*(unsigned long *) s));
		n -= 8;
		s += 8;
		*(unsigned long *) d = tmp;
		d += 8;
	}
	n += 8;
	DO_REST_ALIGNED_UP(d,s,n);
}