1.1 --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Oct 14 06:58:58 2008 -0700 1.2 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Oct 14 15:10:26 2008 -0700 1.3 @@ -1251,6 +1251,7 @@ 1.4 } 1.5 } 1.6 1.7 + 1.8 // Copy big chunks forward 1.9 // 1.10 // Inputs: 1.11 @@ -1268,14 +1269,22 @@ 1.12 Label L_loop; 1.13 __ align(16); 1.14 __ BIND(L_loop); 1.15 - __ movq(to, Address(end_from, qword_count, Address::times_8, -24)); 1.16 - __ movq(Address(end_to, qword_count, Address::times_8, -24), to); 1.17 - __ movq(to, Address(end_from, qword_count, Address::times_8, -16)); 1.18 - __ movq(Address(end_to, qword_count, Address::times_8, -16), to); 1.19 - __ movq(to, Address(end_from, qword_count, Address::times_8, - 8)); 1.20 - __ movq(Address(end_to, qword_count, Address::times_8, - 8), to); 1.21 - __ movq(to, Address(end_from, qword_count, Address::times_8, - 0)); 1.22 - __ movq(Address(end_to, qword_count, Address::times_8, - 0), to); 1.23 + if(UseUnalignedLoadStores) { 1.24 + __ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -24)); 1.25 + __ movdqu(Address(end_to, qword_count, Address::times_8, -24), xmm0); 1.26 + __ movdqu(xmm1, Address(end_from, qword_count, Address::times_8, - 8)); 1.27 + __ movdqu(Address(end_to, qword_count, Address::times_8, - 8), xmm1); 1.28 + 1.29 + } else { 1.30 + __ movq(to, Address(end_from, qword_count, Address::times_8, -24)); 1.31 + __ movq(Address(end_to, qword_count, Address::times_8, -24), to); 1.32 + __ movq(to, Address(end_from, qword_count, Address::times_8, -16)); 1.33 + __ movq(Address(end_to, qword_count, Address::times_8, -16), to); 1.34 + __ movq(to, Address(end_from, qword_count, Address::times_8, - 8)); 1.35 + __ movq(Address(end_to, qword_count, Address::times_8, - 8), to); 1.36 + __ movq(to, Address(end_from, qword_count, Address::times_8, - 0)); 1.37 + __ movq(Address(end_to, qword_count, Address::times_8, - 0), to); 1.38 + } 1.39 __ BIND(L_copy_32_bytes); 1.40 __ addptr(qword_count, 4); 1.41 __ jcc(Assembler::lessEqual, L_loop); 1.42 @@ -1301,14 +1310,22 @@ 1.43 Label L_loop; 1.44 __ align(16); 1.45 __ BIND(L_loop); 1.46 - __ movq(to, Address(from, qword_count, Address::times_8, 24)); 1.47 - __ movq(Address(dest, qword_count, Address::times_8, 24), to); 1.48 - __ movq(to, Address(from, qword_count, Address::times_8, 16)); 1.49 - __ movq(Address(dest, qword_count, Address::times_8, 16), to); 1.50 - __ movq(to, Address(from, qword_count, Address::times_8, 8)); 1.51 - __ movq(Address(dest, qword_count, Address::times_8, 8), to); 1.52 - __ movq(to, Address(from, qword_count, Address::times_8, 0)); 1.53 - __ movq(Address(dest, qword_count, Address::times_8, 0), to); 1.54 + if(UseUnalignedLoadStores) { 1.55 + __ movdqu(xmm0, Address(from, qword_count, Address::times_8, 16)); 1.56 + __ movdqu(Address(dest, qword_count, Address::times_8, 16), xmm0); 1.57 + __ movdqu(xmm1, Address(from, qword_count, Address::times_8, 0)); 1.58 + __ movdqu(Address(dest, qword_count, Address::times_8, 0), xmm1); 1.59 + 1.60 + } else { 1.61 + __ movq(to, Address(from, qword_count, Address::times_8, 24)); 1.62 + __ movq(Address(dest, qword_count, Address::times_8, 24), to); 1.63 + __ movq(to, Address(from, qword_count, Address::times_8, 16)); 1.64 + __ movq(Address(dest, qword_count, Address::times_8, 16), to); 1.65 + __ movq(to, Address(from, qword_count, Address::times_8, 8)); 1.66 + __ movq(Address(dest, qword_count, Address::times_8, 8), to); 1.67 + __ movq(to, Address(from, qword_count, Address::times_8, 0)); 1.68 + __ movq(Address(dest, qword_count, Address::times_8, 0), to); 1.69 + } 1.70 __ BIND(L_copy_32_bytes); 1.71 __ subptr(qword_count, 4); 1.72 __ jcc(Assembler::greaterEqual, L_loop);