src/cpu/x86/vm/stubGenerator_x86_64.cpp

changeset 840
2649e5276dd7
parent 797
f8199438385b
child 947
db4caa99ef11
     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);

mercurial