< 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 >