Mercurial > hg > graal-jvmci-8
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 |