comparison src/cpu/x86/vm/x86_32.ad @ 644:c517646eef23

6813212: factor duplicated assembly code for general subclass check (for 6655638) Summary: Code in interp_masm, stubGenerator, c1_LIRAssembler, and AD files moved into MacroAssembler. Reviewed-by: kvn
author jrose
date Fri, 13 Mar 2009 18:39:22 -0700
parents c771b7f43bbf
children bd441136a5ce
comparison
equal deleted inserted replaced
643:c771b7f43bbf 644:c517646eef23
1690 enc_class enc_PartialSubtypeCheck( ) %{ 1690 enc_class enc_PartialSubtypeCheck( ) %{
1691 Register Redi = as_Register(EDI_enc); // result register 1691 Register Redi = as_Register(EDI_enc); // result register
1692 Register Reax = as_Register(EAX_enc); // super class 1692 Register Reax = as_Register(EAX_enc); // super class
1693 Register Recx = as_Register(ECX_enc); // killed 1693 Register Recx = as_Register(ECX_enc); // killed
1694 Register Resi = as_Register(ESI_enc); // sub class 1694 Register Resi = as_Register(ESI_enc); // sub class
1695 Label hit, miss; 1695 Label miss;
1696 1696
1697 MacroAssembler _masm(&cbuf); 1697 MacroAssembler _masm(&cbuf);
1698 // Compare super with sub directly, since super is not in its own SSA. 1698 __ check_klass_subtype_slow_path(Resi, Reax, Recx, Redi,
1699 // The compiler used to emit this test, but we fold it in here, 1699 NULL, &miss,
1700 // to allow platform-specific tweaking on sparc. 1700 /*set_cond_codes:*/ true);
1701 __ cmpptr(Reax, Resi); 1701 if ($primary) {
1702 __ jcc(Assembler::equal, hit); 1702 __ xorptr(Redi, Redi);
1703 #ifndef PRODUCT 1703 }
1704 __ incrementl(ExternalAddress((address)&SharedRuntime::_partial_subtype_ctr));
1705 #endif //PRODUCT
1706 __ movptr(Redi,Address(Resi,sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes()));
1707 __ movl(Recx,Address(Redi,arrayOopDesc::length_offset_in_bytes()));
1708 __ addptr(Redi,arrayOopDesc::base_offset_in_bytes(T_OBJECT));
1709 __ repne_scan();
1710 __ jcc(Assembler::notEqual, miss);
1711 __ movptr(Address(Resi,sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes()),Reax);
1712 __ bind(hit);
1713 if( $primary )
1714 __ xorptr(Redi,Redi);
1715 __ bind(miss); 1704 __ bind(miss);
1716 %} 1705 %}
1717 1706
1718 enc_class FFree_Float_Stack_All %{ // Free_Float_Stack_All 1707 enc_class FFree_Float_Stack_All %{ // Free_Float_Stack_All
1719 MacroAssembler masm(&cbuf); 1708 MacroAssembler masm(&cbuf);
12564 instruct partialSubtypeCheck( eDIRegP result, eSIRegP sub, eAXRegP super, eCXRegI rcx, eFlagsReg cr ) %{ 12553 instruct partialSubtypeCheck( eDIRegP result, eSIRegP sub, eAXRegP super, eCXRegI rcx, eFlagsReg cr ) %{
12565 match(Set result (PartialSubtypeCheck sub super)); 12554 match(Set result (PartialSubtypeCheck sub super));
12566 effect( KILL rcx, KILL cr ); 12555 effect( KILL rcx, KILL cr );
12567 12556
12568 ins_cost(1100); // slightly larger than the next version 12557 ins_cost(1100); // slightly larger than the next version
12569 format %{ "CMPL EAX,ESI\n\t" 12558 format %{ "MOV EDI,[$sub+Klass::secondary_supers]\n\t"
12570 "JEQ,s hit\n\t"
12571 "MOV EDI,[$sub+Klass::secondary_supers]\n\t"
12572 "MOV ECX,[EDI+arrayKlass::length]\t# length to scan\n\t" 12559 "MOV ECX,[EDI+arrayKlass::length]\t# length to scan\n\t"
12573 "ADD EDI,arrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t" 12560 "ADD EDI,arrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
12574 "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t" 12561 "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t"
12575 "JNE,s miss\t\t# Missed: EDI not-zero\n\t" 12562 "JNE,s miss\t\t# Missed: EDI not-zero\n\t"
12576 "MOV [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache\n\t" 12563 "MOV [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache\n\t"
12577 "hit:\n\t"
12578 "XOR $result,$result\t\t Hit: EDI zero\n\t" 12564 "XOR $result,$result\t\t Hit: EDI zero\n\t"
12579 "miss:\t" %} 12565 "miss:\t" %}
12580 12566
12581 opcode(0x1); // Force a XOR of EDI 12567 opcode(0x1); // Force a XOR of EDI
12582 ins_encode( enc_PartialSubtypeCheck() ); 12568 ins_encode( enc_PartialSubtypeCheck() );
12586 instruct partialSubtypeCheck_vs_Zero( eFlagsReg cr, eSIRegP sub, eAXRegP super, eCXRegI rcx, eDIRegP result, immP0 zero ) %{ 12572 instruct partialSubtypeCheck_vs_Zero( eFlagsReg cr, eSIRegP sub, eAXRegP super, eCXRegI rcx, eDIRegP result, immP0 zero ) %{
12587 match(Set cr (CmpP (PartialSubtypeCheck sub super) zero)); 12573 match(Set cr (CmpP (PartialSubtypeCheck sub super) zero));
12588 effect( KILL rcx, KILL result ); 12574 effect( KILL rcx, KILL result );
12589 12575
12590 ins_cost(1000); 12576 ins_cost(1000);
12591 format %{ "CMPL EAX,ESI\n\t" 12577 format %{ "MOV EDI,[$sub+Klass::secondary_supers]\n\t"
12592 "JEQ,s miss\t# Actually a hit; we are done.\n\t"
12593 "MOV EDI,[$sub+Klass::secondary_supers]\n\t"
12594 "MOV ECX,[EDI+arrayKlass::length]\t# length to scan\n\t" 12578 "MOV ECX,[EDI+arrayKlass::length]\t# length to scan\n\t"
12595 "ADD EDI,arrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t" 12579 "ADD EDI,arrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
12596 "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t" 12580 "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t"
12597 "JNE,s miss\t\t# Missed: flags NZ\n\t" 12581 "JNE,s miss\t\t# Missed: flags NZ\n\t"
12598 "MOV [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache, flags Z\n\t" 12582 "MOV [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache, flags Z\n\t"