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