src/cpu/x86/vm/x86_64.ad
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
7118863 Cdiff src/cpu/x86/vm/x86_64.ad
src/cpu/x86/vm/x86_64.ad
Print this page
*** 12160,12175 ****
%{
match(Set result (PartialSubtypeCheck sub super));
effect(KILL rcx, KILL cr);
ins_cost(1100); // slightly larger than the next version
! format %{ "movq rdi, [$sub + (sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes())]\n\t"
"movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t"
"addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t"
"repne scasq\t# Scan *rdi++ for a match with rax while rcx--\n\t"
"jne,s miss\t\t# Missed: rdi not-zero\n\t"
! "movq [$sub + (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes())], $super\t# Hit: update cache\n\t"
"xorq $result, $result\t\t Hit: rdi zero\n\t"
"miss:\t" %}
opcode(0x1); // Force a XOR of RDI
ins_encode(enc_PartialSubtypeCheck());
--- 12160,12175 ----
%{
match(Set result (PartialSubtypeCheck sub super));
effect(KILL rcx, KILL cr);
ins_cost(1100); // slightly larger than the next version
! format %{ "movq rdi, [$sub + Klass::secondary_supers_offset_in_bytes()]\n\t"
"movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t"
"addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t"
"repne scasq\t# Scan *rdi++ for a match with rax while rcx--\n\t"
"jne,s miss\t\t# Missed: rdi not-zero\n\t"
! "movq [$sub + Klass::secondary_super_cache_offset_in_bytes()], $super\t# Hit: update cache\n\t"
"xorq $result, $result\t\t Hit: rdi zero\n\t"
"miss:\t" %}
opcode(0x1); // Force a XOR of RDI
ins_encode(enc_PartialSubtypeCheck());
*** 12183,12198 ****
%{
match(Set cr (CmpP (PartialSubtypeCheck sub super) zero));
effect(KILL rcx, KILL result);
ins_cost(1000);
! format %{ "movq rdi, [$sub + (sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes())]\n\t"
"movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t"
"addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t"
"repne scasq\t# Scan *rdi++ for a match with rax while cx-- != 0\n\t"
"jne,s miss\t\t# Missed: flags nz\n\t"
! "movq [$sub + (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes())], $super\t# Hit: update cache\n\t"
"miss:\t" %}
opcode(0x0); // No need to XOR RDI
ins_encode(enc_PartialSubtypeCheck());
ins_pipe(pipe_slow);
--- 12183,12198 ----
%{
match(Set cr (CmpP (PartialSubtypeCheck sub super) zero));
effect(KILL rcx, KILL result);
ins_cost(1000);
! format %{ "movq rdi, [$sub + Klass::secondary_supers_offset_in_bytes()]\n\t"
"movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t"
"addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t"
"repne scasq\t# Scan *rdi++ for a match with rax while cx-- != 0\n\t"
"jne,s miss\t\t# Missed: flags nz\n\t"
! "movq [$sub + Klass::secondary_super_cache_offset_in_bytes()], $super\t# Hit: update cache\n\t"
"miss:\t" %}
opcode(0x0); // No need to XOR RDI
ins_encode(enc_PartialSubtypeCheck());
ins_pipe(pipe_slow);
src/cpu/x86/vm/x86_64.ad
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File