11303 %{ |
11303 %{ |
11304 match(Set result (PartialSubtypeCheck sub super)); |
11304 match(Set result (PartialSubtypeCheck sub super)); |
11305 effect(KILL rcx, KILL cr); |
11305 effect(KILL rcx, KILL cr); |
11306 |
11306 |
11307 ins_cost(1100); // slightly larger than the next version |
11307 ins_cost(1100); // slightly larger than the next version |
11308 format %{ "movq rdi, [$sub + (sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes())]\n\t" |
11308 format %{ "movq rdi, [$sub + in_bytes(Klass::secondary_supers_offset())]\n\t" |
11309 "movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t" |
11309 "movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t" |
11310 "addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t" |
11310 "addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t" |
11311 "repne scasq\t# Scan *rdi++ for a match with rax while rcx--\n\t" |
11311 "repne scasq\t# Scan *rdi++ for a match with rax while rcx--\n\t" |
11312 "jne,s miss\t\t# Missed: rdi not-zero\n\t" |
11312 "jne,s miss\t\t# Missed: rdi not-zero\n\t" |
11313 "movq [$sub + (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes())], $super\t# Hit: update cache\n\t" |
11313 "movq [$sub + in_bytes(Klass::secondary_super_cache_offset())], $super\t# Hit: update cache\n\t" |
11314 "xorq $result, $result\t\t Hit: rdi zero\n\t" |
11314 "xorq $result, $result\t\t Hit: rdi zero\n\t" |
11315 "miss:\t" %} |
11315 "miss:\t" %} |
11316 |
11316 |
11317 opcode(0x1); // Force a XOR of RDI |
11317 opcode(0x1); // Force a XOR of RDI |
11318 ins_encode(enc_PartialSubtypeCheck()); |
11318 ins_encode(enc_PartialSubtypeCheck()); |
11326 %{ |
11326 %{ |
11327 match(Set cr (CmpP (PartialSubtypeCheck sub super) zero)); |
11327 match(Set cr (CmpP (PartialSubtypeCheck sub super) zero)); |
11328 effect(KILL rcx, KILL result); |
11328 effect(KILL rcx, KILL result); |
11329 |
11329 |
11330 ins_cost(1000); |
11330 ins_cost(1000); |
11331 format %{ "movq rdi, [$sub + (sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes())]\n\t" |
11331 format %{ "movq rdi, [$sub + in_bytes(Klass::secondary_supers_offset())]\n\t" |
11332 "movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t" |
11332 "movl rcx, [rdi + arrayOopDesc::length_offset_in_bytes()]\t# length to scan\n\t" |
11333 "addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t" |
11333 "addq rdi, arrayOopDex::base_offset_in_bytes(T_OBJECT)\t# Skip to start of data; set NZ in case count is zero\n\t" |
11334 "repne scasq\t# Scan *rdi++ for a match with rax while cx-- != 0\n\t" |
11334 "repne scasq\t# Scan *rdi++ for a match with rax while cx-- != 0\n\t" |
11335 "jne,s miss\t\t# Missed: flags nz\n\t" |
11335 "jne,s miss\t\t# Missed: flags nz\n\t" |
11336 "movq [$sub + (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes())], $super\t# Hit: update cache\n\t" |
11336 "movq [$sub + in_bytes(Klass::secondary_super_cache_offset())], $super\t# Hit: update cache\n\t" |
11337 "miss:\t" %} |
11337 "miss:\t" %} |
11338 |
11338 |
11339 opcode(0x0); // No need to XOR RDI |
11339 opcode(0x0); // No need to XOR RDI |
11340 ins_encode(enc_PartialSubtypeCheck()); |
11340 ins_encode(enc_PartialSubtypeCheck()); |
11341 ins_pipe(pipe_slow); |
11341 ins_pipe(pipe_slow); |