hotspot/src/cpu/x86/vm/x86_64.ad
changeset 11430 718fc06da49a
parent 11429 e894217a5d94
child 11431 5ca3a19e559a
equal deleted inserted replaced
11429:e894217a5d94 11430:718fc06da49a
 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);