< prev index next >

src/cpu/x86/vm/x86_32.ad

Print this page

        

*** 1418,1430 **** } // The ecx parameter to rep stos for the ClearArray node is in dwords. const bool Matcher::init_array_count_is_in_bytes = false; - // Threshold size for cleararray. - const int Matcher::init_array_short_size = 8 * BytesPerLong; - // Needs 2 CMOV's for longs. const int Matcher::long_cmove_cost() { return 1; } // No CMOVF/CMOVD with SSE/SSE2 const int Matcher::float_cmove_cost() { return (UseSSE>=1) ? ConditionalMoveLimit : 0; } --- 1418,1427 ----
*** 11367,11397 **** // ======================================================================= // fast clearing of an array instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ ! predicate(!UseFastStosb); match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); format %{ "XOR EAX,EAX\t# ClearArray:\n\t" "SHL ECX,1\t# Convert doublewords to words\n\t" "REP STOS\t# store EAX into [EDI++] while ECX--" %} ins_encode %{ ! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); %} ins_pipe( pipe_slow ); %} instruct rep_fast_stosb(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ ! predicate(UseFastStosb); match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); format %{ "XOR EAX,EAX\t# ClearArray:\n\t" "SHL ECX,3\t# Convert doublewords to bytes\n\t" "REP STOSB\t# store EAX into [EDI++] while ECX--" %} ins_encode %{ ! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); %} ins_pipe( pipe_slow ); %} instruct string_compareL(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2, --- 11364,11420 ---- // ======================================================================= // fast clearing of an array instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ ! predicate(!UseFastStosb && !((ClearArrayNode*)n)->is_large()); ! match(Set dummy (ClearArray cnt base)); ! effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); ! format %{ "XOR EAX,EAX\t# ClearArray:\n\t" ! "SHL ECX,1\t# Convert doublewords to words\n\t" ! "REP STOS\t# store EAX into [EDI++] while ECX--" %} ! ins_encode %{ ! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, false); ! %} ! ins_pipe( pipe_slow ); ! %} ! ! instruct rep_stos_large(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ ! predicate(!UseFastStosb && ((ClearArrayNode*)n)->is_large()); match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); format %{ "XOR EAX,EAX\t# ClearArray:\n\t" "SHL ECX,1\t# Convert doublewords to words\n\t" "REP STOS\t# store EAX into [EDI++] while ECX--" %} ins_encode %{ ! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, true); %} ins_pipe( pipe_slow ); %} instruct rep_fast_stosb(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ ! predicate(UseFastStosb && !((ClearArrayNode*)n)->is_large()); ! match(Set dummy (ClearArray cnt base)); ! effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); ! format %{ "XOR EAX,EAX\t# ClearArray:\n\t" ! "SHL ECX,3\t# Convert doublewords to bytes\n\t" ! "REP STOSB\t# store EAX into [EDI++] while ECX--" %} ! ins_encode %{ ! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, false); ! %} ! ins_pipe( pipe_slow ); ! %} ! ! instruct rep_fast_stosb_large(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{ ! predicate(UseFastStosb && ((ClearArrayNode*)n)->is_large()); match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr); format %{ "XOR EAX,EAX\t# ClearArray:\n\t" "SHL ECX,3\t# Convert doublewords to bytes\n\t" "REP STOSB\t# store EAX into [EDI++] while ECX--" %} ins_encode %{ ! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, true); %} ins_pipe( pipe_slow ); %} instruct string_compareL(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2,
< prev index next >