diff -r c6c141c46516 src/cpu/x86/vm/stubGenerator_x86_64.cpp --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Mon Feb 29 13:02:10 2016 +0100 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Mon Feb 29 22:09:53 2016 +0300 @@ -2147,6 +2147,22 @@ __ lea(end_from, Address(from, qword_count, Address::times_8, -8)); __ lea(end_to, Address(to, qword_count, Address::times_8, -8)); __ negptr(qword_count); + + // Pre-loop to align destination + if (UseNewCode) { + Label L_preloop; + __ BIND(L_preloop); + __ movq(rax, Address(end_from, qword_count, Address::times_8, 8)); + __ movq(Address(end_to, qword_count, Address::times_8, 8), rax); + + __ lea(rax, Address(end_to, qword_count, Address::times_8, 8)); + __ testptr(rax, 63); + __ jcc(Assembler::zero, L_copy_bytes); + + __ increment(qword_count); + __ jcc(Assembler::lessEqual, L_preloop); + } + __ jmp(L_copy_bytes); // Copy trailing qwords