Mercurial > hg > truffle
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" |