comparison src/cpu/sparc/vm/interp_masm_sparc.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
857 add(LcpoolCache, tmp, cache); 857 add(LcpoolCache, tmp, cache);
858 } 858 }
859 859
860 860
861 // Generate a subtype check: branch to ok_is_subtype if sub_klass is 861 // Generate a subtype check: branch to ok_is_subtype if sub_klass is
862 // a subtype of super_klass. Blows registers Rsub_klass, tmp1, tmp2. 862 // a subtype of super_klass. Blows registers Rsuper_klass, Rsub_klass, tmp1, tmp2.
863 void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, 863 void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
864 Register Rsuper_klass, 864 Register Rsuper_klass,
865 Register Rtmp1, 865 Register Rtmp1,
866 Register Rtmp2, 866 Register Rtmp2,
867 Register Rtmp3, 867 Register Rtmp3,
889 brx( Assembler::equal, false, Assembler::pt, ok_is_subtype ); 889 brx( Assembler::equal, false, Assembler::pt, ok_is_subtype );
890 890
891 // Now do a linear scan of the secondary super-klass chain. 891 // Now do a linear scan of the secondary super-klass chain.
892 delayed()->ld_ptr( Rsub_klass, sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes(), Rtmp2 ); 892 delayed()->ld_ptr( Rsub_klass, sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes(), Rtmp2 );
893 893
894 // compress superclass
895 if (UseCompressedOops) encode_heap_oop(Rsuper_klass);
896
894 // Rtmp2 holds the objArrayOop of secondary supers. 897 // Rtmp2 holds the objArrayOop of secondary supers.
895 ld( Rtmp2, arrayOopDesc::length_offset_in_bytes(), Rtmp1 );// Load the array length 898 ld( Rtmp2, arrayOopDesc::length_offset_in_bytes(), Rtmp1 );// Load the array length
896 // Check for empty secondary super list 899 // Check for empty secondary super list
897 tst(Rtmp1); 900 tst(Rtmp1);
898 901
899 // Top of search loop 902 // Top of search loop
900 bind( loop ); 903 bind( loop );
901 br( Assembler::equal, false, Assembler::pn, not_subtype ); 904 br( Assembler::equal, false, Assembler::pn, not_subtype );
902 delayed()->nop(); 905 delayed()->nop();
906
903 // load next super to check 907 // load next super to check
904 ld_ptr( Rtmp2, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Rtmp3 ); 908 if (UseCompressedOops) {
905 909 ld( Rtmp2, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Rtmp3);
906 // Bump array pointer forward one oop 910 // Bump array pointer forward one oop
907 add( Rtmp2, wordSize, Rtmp2 ); 911 add( Rtmp2, 4, Rtmp2 );
912 } else {
913 ld_ptr( Rtmp2, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Rtmp3);
914 // Bump array pointer forward one oop
915 add( Rtmp2, wordSize, Rtmp2);
916 }
908 // Look for Rsuper_klass on Rsub_klass's secondary super-class-overflow list 917 // Look for Rsuper_klass on Rsub_klass's secondary super-class-overflow list
909 cmp( Rtmp3, Rsuper_klass ); 918 cmp( Rtmp3, Rsuper_klass );
910 // A miss means we are NOT a subtype and need to keep looping 919 // A miss means we are NOT a subtype and need to keep looping
911 brx( Assembler::notEqual, false, Assembler::pt, loop ); 920 brx( Assembler::notEqual, false, Assembler::pt, loop );
912 delayed()->deccc( Rtmp1 ); // dec trip counter in delay slot 921 delayed()->deccc( Rtmp1 ); // dec trip counter in delay slot
913 // Falling out the bottom means we found a hit; we ARE a subtype 922 // Falling out the bottom means we found a hit; we ARE a subtype
923 if (UseCompressedOops) decode_heap_oop(Rsuper_klass);
914 br( Assembler::always, false, Assembler::pt, ok_is_subtype ); 924 br( Assembler::always, false, Assembler::pt, ok_is_subtype );
915 // Update the cache 925 // Update the cache
916 delayed()->st_ptr( Rsuper_klass, Rsub_klass, sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() ); 926 delayed()->st_ptr( Rsuper_klass, Rsub_klass,
927 sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() );
917 928
918 bind(not_subtype); 929 bind(not_subtype);
919 profile_typecheck_failed(Rtmp1); 930 profile_typecheck_failed(Rtmp1);
920 } 931 }
921 932