x64: Provide a backwards version of memcpy

This patch provides a backwards version of memcpy. It works all the same, but
will start the copy from dst + n <= src + n, instead of dst <= src. That is
needed for memmove when the source and destination operands overlap.

Being a nonstandard interface, I've just named it "memcpy_backwards"

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
string: implement memmove using memcpy

The current implementation of memmove is a PITA (I mean the bread, of course)
to decode if a fault happens. We have very little control of where exactly in
the code the fault happens, therefore it is difficult to reason about it. This
patch implements memmove in terms of memcpy + memcpy_backwards.

For those, we can have specific fixups in the possible fault sites, that will
allow us to decode the faults with ease.

Note that originally, the only reason why the first branch was not a memcpy is
that we would like to handle alignment. Since our implementation of memcpy is
fast enough, we can just ignore that and we will end up being even faster.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>