src/cpu/x86/vm/x86_32.ad

changeset 4410
00af3a3a8df4
parent 4164
d804e148cff8
child 4479
b30b3c2a0cf2
     1.1 --- a/src/cpu/x86/vm/x86_32.ad	Sun Dec 23 17:08:22 2012 +0100
     1.2 +++ b/src/cpu/x86/vm/x86_32.ad	Thu Jan 03 15:09:55 2013 -0800
     1.3 @@ -11572,15 +11572,28 @@
     1.4  // =======================================================================
     1.5  // fast clearing of an array
     1.6  instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
     1.7 +  predicate(!UseFastStosb);
     1.8    match(Set dummy (ClearArray cnt base));
     1.9    effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
    1.10 -  format %{ "SHL    ECX,1\t# Convert doublewords to words\n\t"
    1.11 -            "XOR    EAX,EAX\n\t"
    1.12 +  format %{ "XOR    EAX,EAX\t# ClearArray:\n\t"
    1.13 +            "SHL    ECX,1\t# Convert doublewords to words\n\t"
    1.14              "REP STOS\t# store EAX into [EDI++] while ECX--" %}
    1.15 -  opcode(0,0x4);
    1.16 -  ins_encode( Opcode(0xD1), RegOpc(ECX),
    1.17 -              OpcRegReg(0x33,EAX,EAX),
    1.18 -              Opcode(0xF3), Opcode(0xAB) );
    1.19 +  ins_encode %{ 
    1.20 +    __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
    1.21 +  %}
    1.22 +  ins_pipe( pipe_slow );
    1.23 +%}
    1.24 +
    1.25 +instruct rep_fast_stosb(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
    1.26 +  predicate(UseFastStosb);
    1.27 +  match(Set dummy (ClearArray cnt base));
    1.28 +  effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
    1.29 +  format %{ "XOR    EAX,EAX\t# ClearArray:\n\t"
    1.30 +            "SHL    ECX,3\t# Convert doublewords to bytes\n\t"
    1.31 +            "REP STOSB\t# store EAX into [EDI++] while ECX--" %}
    1.32 +  ins_encode %{ 
    1.33 +    __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
    1.34 +  %}
    1.35    ins_pipe( pipe_slow );
    1.36  %}
    1.37  

mercurial