Mercurial > hg > truffle
comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 727:6b2273dd6fa9
6822110: Add AddressLiteral class on SPARC
Summary: The Address class on SPARC currently handles both, addresses and address literals, what makes the Address class more complicated than it has to be.
Reviewed-by: never, kvn
author | twisti |
---|---|
date | Tue, 21 Apr 2009 11:16:30 -0700 |
parents | e5b0439ef4ae |
children | 315a5d70b295 |
comparison
equal
deleted
inserted
replaced
725:928912ce8438 | 727:6b2273dd6fa9 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #include "incls/_precompiled.incl" | 25 #include "incls/_precompiled.incl" |
26 #include "incls/_assembler_sparc.cpp.incl" | 26 #include "incls/_assembler_sparc.cpp.incl" |
27 | 27 |
28 // Implementation of Address | 28 // Convert the raw encoding form into the form expected by the |
29 | 29 // constructor for Address. |
30 Address::Address( addr_type t, int which ) { | 30 Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) { |
31 switch (t) { | 31 assert(scale == 0, "not supported"); |
32 case extra_in_argument: | 32 RelocationHolder rspec; |
33 case extra_out_argument: | 33 if (disp_is_oop) { |
34 _base = t == extra_in_argument ? FP : SP; | 34 rspec = Relocation::spec_simple(relocInfo::oop_type); |
35 _hi = 0; | 35 } |
36 // Warning: In LP64 mode, _disp will occupy more than 10 bits. | 36 |
37 // This is inconsistent with the other constructors but op | 37 Register rindex = as_Register(index); |
38 // codes such as ld or ldx, only access disp() to get their | 38 if (rindex != G0) { |
39 // simm13 argument. | 39 Address madr(as_Register(base), rindex); |
40 _disp = ((which - Argument::n_register_parameters + frame::memory_parameter_word_sp_offset) * BytesPerWord) + STACK_BIAS; | 40 madr._rspec = rspec; |
41 break; | 41 return madr; |
42 default: | 42 } else { |
43 ShouldNotReachHere(); | 43 Address madr(as_Register(base), disp); |
44 break; | 44 madr._rspec = rspec; |
45 } | 45 return madr; |
46 } | |
47 } | |
48 | |
49 Address Argument::address_in_frame() const { | |
50 // Warning: In LP64 mode disp will occupy more than 10 bits, but | |
51 // op codes such as ld or ldx, only access disp() to get | |
52 // their simm13 argument. | |
53 int disp = ((_number - Argument::n_register_parameters + frame::memory_parameter_word_sp_offset) * BytesPerWord) + STACK_BIAS; | |
54 if (is_in()) | |
55 return Address(FP, disp); // In argument. | |
56 else | |
57 return Address(SP, disp); // Out argument. | |
46 } | 58 } |
47 | 59 |
48 static const char* argumentNames[][2] = { | 60 static const char* argumentNames[][2] = { |
49 {"A0","P0"}, {"A1","P1"}, {"A2","P2"}, {"A3","P3"}, {"A4","P4"}, | 61 {"A0","P0"}, {"A1","P1"}, {"A2","P2"}, {"A3","P3"}, {"A4","P4"}, |
50 {"A5","P5"}, {"A6","P6"}, {"A7","P7"}, {"A8","P8"}, {"A9","P9"}, | 62 {"A5","P5"}, {"A6","P6"}, {"A7","P7"}, {"A8","P8"}, {"A9","P9"}, |
612 } | 624 } |
613 jmp(r1, offset); | 625 jmp(r1, offset); |
614 } | 626 } |
615 | 627 |
616 // This code sequence is relocatable to any address, even on LP64. | 628 // This code sequence is relocatable to any address, even on LP64. |
617 void MacroAssembler::jumpl( Address& a, Register d, int offset, const char* file, int line ) { | 629 void MacroAssembler::jumpl(AddressLiteral& addrlit, Register temp, Register d, int offset, const char* file, int line) { |
618 assert_not_delayed(); | 630 assert_not_delayed(); |
619 // Force fixed length sethi because NativeJump and NativeFarCall don't handle | 631 // Force fixed length sethi because NativeJump and NativeFarCall don't handle |
620 // variable length instruction streams. | 632 // variable length instruction streams. |
621 sethi(a, /*ForceRelocatable=*/ true); | 633 patchable_sethi(addrlit, temp); |
634 Address a(temp, addrlit.low10() + offset); // Add the offset to the displacement. | |
622 if (TraceJumps) { | 635 if (TraceJumps) { |
623 #ifndef PRODUCT | 636 #ifndef PRODUCT |
624 // Must do the add here so relocation can find the remainder of the | 637 // Must do the add here so relocation can find the remainder of the |
625 // value to be relocated. | 638 // value to be relocated. |
626 add(a.base(), a.disp() + offset, a.base(), a.rspec(offset)); | 639 add(a.base(), a.disp(), a.base(), addrlit.rspec(offset)); |
627 save_frame(0); | 640 save_frame(0); |
628 verify_thread(); | 641 verify_thread(); |
629 ld(G2_thread, in_bytes(JavaThread::jmp_ring_index_offset()), O0); | 642 ld(G2_thread, in_bytes(JavaThread::jmp_ring_index_offset()), O0); |
630 add(G2_thread, in_bytes(JavaThread::jmp_ring_offset()), O1); | 643 add(G2_thread, in_bytes(JavaThread::jmp_ring_offset()), O1); |
631 sll(O0, exact_log2(4*sizeof(intptr_t)), O2); | 644 sll(O0, exact_log2(4*sizeof(intptr_t)), O2); |
650 and3(O0, JavaThread::jump_ring_buffer_size - 1, O0); | 663 and3(O0, JavaThread::jump_ring_buffer_size - 1, O0); |
651 st(O0, G2_thread, in_bytes(JavaThread::jmp_ring_index_offset())); | 664 st(O0, G2_thread, in_bytes(JavaThread::jmp_ring_index_offset())); |
652 restore(); | 665 restore(); |
653 jmpl(a.base(), G0, d); | 666 jmpl(a.base(), G0, d); |
654 #else | 667 #else |
655 jmpl(a, d, offset); | 668 jmpl(a.base(), a.disp(), d); |
656 #endif /* PRODUCT */ | 669 #endif /* PRODUCT */ |
657 } else { | 670 } else { |
658 jmpl(a, d, offset); | 671 jmpl(a.base(), a.disp(), d); |
659 } | 672 } |
660 } | 673 } |
661 | 674 |
662 void MacroAssembler::jump( Address& a, int offset, const char* file, int line ) { | 675 void MacroAssembler::jump(AddressLiteral& addrlit, Register temp, int offset, const char* file, int line) { |
663 jumpl( a, G0, offset, file, line ); | 676 jumpl(addrlit, temp, G0, offset, file, line); |
664 } | 677 } |
665 | 678 |
666 | 679 |
667 // Convert to C varargs format | 680 // Convert to C varargs format |
668 void MacroAssembler::set_varargs( Argument inArg, Register d ) { | 681 void MacroAssembler::set_varargs( Argument inArg, Register d ) { |
676 savePtr.is_register(); | 689 savePtr.is_register(); |
677 savePtr = savePtr.successor()) { | 690 savePtr = savePtr.successor()) { |
678 st_ptr(savePtr.as_register(), savePtr.address_in_frame()); | 691 st_ptr(savePtr.as_register(), savePtr.address_in_frame()); |
679 } | 692 } |
680 // return the address of the first memory slot | 693 // return the address of the first memory slot |
681 add(inArg.address_in_frame(), d); | 694 Address a = inArg.address_in_frame(); |
695 add(a.base(), a.disp(), d); | |
682 } | 696 } |
683 | 697 |
684 // Conditional breakpoint (for assertion checks in assembly code) | 698 // Conditional breakpoint (for assertion checks in assembly code) |
685 void MacroAssembler::breakpoint_trap(Condition c, CC cc) { | 699 void MacroAssembler::breakpoint_trap(Condition c, CC cc) { |
686 trap(c, cc, G0, ST_RESERVED_FOR_USER_0); | 700 trap(c, cc, G0, ST_RESERVED_FOR_USER_0); |
700 // Write serialization page so VM thread can do a pseudo remote membar | 714 // Write serialization page so VM thread can do a pseudo remote membar |
701 // We use the current thread pointer to calculate a thread specific | 715 // We use the current thread pointer to calculate a thread specific |
702 // offset to write to within the page. This minimizes bus traffic | 716 // offset to write to within the page. This minimizes bus traffic |
703 // due to cache line collision. | 717 // due to cache line collision. |
704 void MacroAssembler::serialize_memory(Register thread, Register tmp1, Register tmp2) { | 718 void MacroAssembler::serialize_memory(Register thread, Register tmp1, Register tmp2) { |
705 Address mem_serialize_page(tmp1, os::get_memory_serialize_page()); | |
706 srl(thread, os::get_serialize_page_shift_count(), tmp2); | 719 srl(thread, os::get_serialize_page_shift_count(), tmp2); |
707 if (Assembler::is_simm13(os::vm_page_size())) { | 720 if (Assembler::is_simm13(os::vm_page_size())) { |
708 and3(tmp2, (os::vm_page_size() - sizeof(int)), tmp2); | 721 and3(tmp2, (os::vm_page_size() - sizeof(int)), tmp2); |
709 } | 722 } |
710 else { | 723 else { |
711 set((os::vm_page_size() - sizeof(int)), tmp1); | 724 set((os::vm_page_size() - sizeof(int)), tmp1); |
712 and3(tmp2, tmp1, tmp2); | 725 and3(tmp2, tmp1, tmp2); |
713 } | 726 } |
714 load_address(mem_serialize_page); | 727 set(os::get_memory_serialize_page(), tmp1); |
715 st(G0, tmp1, tmp2); | 728 st(G0, tmp1, tmp2); |
716 } | 729 } |
717 | 730 |
718 | 731 |
719 | 732 |
828 mov(G1, L0); // avoid clobbering G1 | 841 mov(G1, L0); // avoid clobbering G1 |
829 mov(G5_method, L1); // avoid clobbering G5 | 842 mov(G5_method, L1); // avoid clobbering G5 |
830 mov(G3, L2); // avoid clobbering G3 also | 843 mov(G3, L2); // avoid clobbering G3 also |
831 mov(G4, L5); // avoid clobbering G4 | 844 mov(G4, L5); // avoid clobbering G4 |
832 #ifdef ASSERT | 845 #ifdef ASSERT |
833 Address last_get_thread_addr(L3, (address)&last_get_thread); | 846 AddressLiteral last_get_thread_addrlit(&last_get_thread); |
834 sethi(last_get_thread_addr); | 847 set(last_get_thread_addrlit, L3); |
835 inc(L4, get_pc(L4) + 2 * BytesPerInstWord); // skip getpc() code + inc + st_ptr to point L4 at call | 848 inc(L4, get_pc(L4) + 2 * BytesPerInstWord); // skip getpc() code + inc + st_ptr to point L4 at call |
836 st_ptr(L4, last_get_thread_addr); | 849 st_ptr(L4, L3, 0); |
837 #endif | 850 #endif |
838 call(CAST_FROM_FN_PTR(address, reinitialize_thread), relocInfo::runtime_call_type); | 851 call(CAST_FROM_FN_PTR(address, reinitialize_thread), relocInfo::runtime_call_type); |
839 delayed()->nop(); | 852 delayed()->nop(); |
840 mov(L0, G1); | 853 mov(L0, G1); |
841 mov(L1, G5_method); | 854 mov(L1, G5_method); |
917 | 930 |
918 | 931 |
919 // %%% maybe get rid of [re]set_last_Java_frame | 932 // %%% maybe get rid of [re]set_last_Java_frame |
920 void MacroAssembler::set_last_Java_frame(Register last_java_sp, Register last_Java_pc) { | 933 void MacroAssembler::set_last_Java_frame(Register last_java_sp, Register last_Java_pc) { |
921 assert_not_delayed(); | 934 assert_not_delayed(); |
922 Address flags(G2_thread, | 935 Address flags(G2_thread, JavaThread::frame_anchor_offset() + |
923 0, | 936 JavaFrameAnchor::flags_offset()); |
924 in_bytes(JavaThread::frame_anchor_offset()) + | 937 Address pc_addr(G2_thread, JavaThread::last_Java_pc_offset()); |
925 in_bytes(JavaFrameAnchor::flags_offset())); | |
926 Address pc_addr(G2_thread, | |
927 0, | |
928 in_bytes(JavaThread::last_Java_pc_offset())); | |
929 | 938 |
930 // Always set last_Java_pc and flags first because once last_Java_sp is visible | 939 // Always set last_Java_pc and flags first because once last_Java_sp is visible |
931 // has_last_Java_frame is true and users will look at the rest of the fields. | 940 // has_last_Java_frame is true and users will look at the rest of the fields. |
932 // (Note: flags should always be zero before we get here so doesn't need to be set.) | 941 // (Note: flags should always be zero before we get here so doesn't need to be set.) |
933 | 942 |
975 stop("Stack Not Biased in set_last_Java_frame"); | 984 stop("Stack Not Biased in set_last_Java_frame"); |
976 bind(StackOk); | 985 bind(StackOk); |
977 #endif // ASSERT | 986 #endif // ASSERT |
978 assert( last_java_sp != G4_scratch, "bad register usage in set_last_Java_frame"); | 987 assert( last_java_sp != G4_scratch, "bad register usage in set_last_Java_frame"); |
979 add( last_java_sp, STACK_BIAS, G4_scratch ); | 988 add( last_java_sp, STACK_BIAS, G4_scratch ); |
980 st_ptr(G4_scratch, Address(G2_thread, 0, in_bytes(JavaThread::last_Java_sp_offset()))); | 989 st_ptr(G4_scratch, G2_thread, JavaThread::last_Java_sp_offset()); |
981 #else | 990 #else |
982 st_ptr(last_java_sp, Address(G2_thread, 0, in_bytes(JavaThread::last_Java_sp_offset()))); | 991 st_ptr(last_java_sp, G2_thread, JavaThread::last_Java_sp_offset()); |
983 #endif // _LP64 | 992 #endif // _LP64 |
984 } | 993 } |
985 | 994 |
986 void MacroAssembler::reset_last_Java_frame(void) { | 995 void MacroAssembler::reset_last_Java_frame(void) { |
987 assert_not_delayed(); | 996 assert_not_delayed(); |
988 | 997 |
989 Address sp_addr(G2_thread, 0, in_bytes(JavaThread::last_Java_sp_offset())); | 998 Address sp_addr(G2_thread, JavaThread::last_Java_sp_offset()); |
990 Address pc_addr(G2_thread, | 999 Address pc_addr(G2_thread, JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset()); |
991 0, | 1000 Address flags (G2_thread, JavaThread::frame_anchor_offset() + JavaFrameAnchor::flags_offset()); |
992 in_bytes(JavaThread::frame_anchor_offset()) + in_bytes(JavaFrameAnchor::last_Java_pc_offset())); | |
993 Address flags(G2_thread, | |
994 0, | |
995 in_bytes(JavaThread::frame_anchor_offset()) + in_bytes(JavaFrameAnchor::flags_offset())); | |
996 | 1001 |
997 #ifdef ASSERT | 1002 #ifdef ASSERT |
998 // check that it WAS previously set | 1003 // check that it WAS previously set |
999 #ifdef CC_INTERP | 1004 #ifdef CC_INTERP |
1000 save_frame(0); | 1005 save_frame(0); |
1061 Label L; | 1066 Label L; |
1062 | 1067 |
1063 check_and_handle_popframe(scratch_reg); | 1068 check_and_handle_popframe(scratch_reg); |
1064 check_and_handle_earlyret(scratch_reg); | 1069 check_and_handle_earlyret(scratch_reg); |
1065 | 1070 |
1066 Address exception_addr(G2_thread, 0, in_bytes(Thread::pending_exception_offset())); | 1071 Address exception_addr(G2_thread, Thread::pending_exception_offset()); |
1067 ld_ptr(exception_addr, scratch_reg); | 1072 ld_ptr(exception_addr, scratch_reg); |
1068 br_null(scratch_reg,false,pt,L); | 1073 br_null(scratch_reg,false,pt,L); |
1069 delayed()->nop(); | 1074 delayed()->nop(); |
1070 // we use O7 linkage so that forward_exception_entry has the issuing PC | 1075 // we use O7 linkage so that forward_exception_entry has the issuing PC |
1071 call(StubRoutines::forward_exception_entry(), relocInfo::runtime_call_type); | 1076 call(StubRoutines::forward_exception_entry(), relocInfo::runtime_call_type); |
1184 } | 1189 } |
1185 | 1190 |
1186 | 1191 |
1187 void MacroAssembler::get_vm_result(Register oop_result) { | 1192 void MacroAssembler::get_vm_result(Register oop_result) { |
1188 verify_thread(); | 1193 verify_thread(); |
1189 Address vm_result_addr(G2_thread, 0, in_bytes(JavaThread::vm_result_offset())); | 1194 Address vm_result_addr(G2_thread, JavaThread::vm_result_offset()); |
1190 ld_ptr( vm_result_addr, oop_result); | 1195 ld_ptr( vm_result_addr, oop_result); |
1191 st_ptr(G0, vm_result_addr); | 1196 st_ptr(G0, vm_result_addr); |
1192 verify_oop(oop_result); | 1197 verify_oop(oop_result); |
1193 } | 1198 } |
1194 | 1199 |
1195 | 1200 |
1196 void MacroAssembler::get_vm_result_2(Register oop_result) { | 1201 void MacroAssembler::get_vm_result_2(Register oop_result) { |
1197 verify_thread(); | 1202 verify_thread(); |
1198 Address vm_result_addr_2(G2_thread, 0, in_bytes(JavaThread::vm_result_2_offset())); | 1203 Address vm_result_addr_2(G2_thread, JavaThread::vm_result_2_offset()); |
1199 ld_ptr(vm_result_addr_2, oop_result); | 1204 ld_ptr(vm_result_addr_2, oop_result); |
1200 st_ptr(G0, vm_result_addr_2); | 1205 st_ptr(G0, vm_result_addr_2); |
1201 verify_oop(oop_result); | 1206 verify_oop(oop_result); |
1202 } | 1207 } |
1203 | 1208 |
1204 | 1209 |
1205 // We require that C code which does not return a value in vm_result will | 1210 // We require that C code which does not return a value in vm_result will |
1206 // leave it undisturbed. | 1211 // leave it undisturbed. |
1207 void MacroAssembler::set_vm_result(Register oop_result) { | 1212 void MacroAssembler::set_vm_result(Register oop_result) { |
1208 verify_thread(); | 1213 verify_thread(); |
1209 Address vm_result_addr(G2_thread, 0, in_bytes(JavaThread::vm_result_offset())); | 1214 Address vm_result_addr(G2_thread, JavaThread::vm_result_offset()); |
1210 verify_oop(oop_result); | 1215 verify_oop(oop_result); |
1211 | 1216 |
1212 # ifdef ASSERT | 1217 # ifdef ASSERT |
1213 // Check that we are not overwriting any other oop. | 1218 // Check that we are not overwriting any other oop. |
1214 #ifdef CC_INTERP | 1219 #ifdef CC_INTERP |
1232 #ifdef _LP64 | 1237 #ifdef _LP64 |
1233 srlx(obj, CardTableModRefBS::card_shift, obj); | 1238 srlx(obj, CardTableModRefBS::card_shift, obj); |
1234 #else | 1239 #else |
1235 srl(obj, CardTableModRefBS::card_shift, obj); | 1240 srl(obj, CardTableModRefBS::card_shift, obj); |
1236 #endif | 1241 #endif |
1237 assert( tmp != obj, "need separate temp reg"); | 1242 assert(tmp != obj, "need separate temp reg"); |
1238 Address rs(tmp, (address)byte_map_base); | 1243 set((address) byte_map_base, tmp); |
1239 load_address(rs); | 1244 stb(G0, tmp, obj); |
1240 stb(G0, rs.base(), obj); | 1245 } |
1241 } | 1246 |
1242 | 1247 |
1243 // %%% Note: The following six instructions have been moved, | 1248 void MacroAssembler::internal_sethi(const AddressLiteral& addrlit, Register d, bool ForceRelocatable) { |
1244 // unchanged, from assembler_sparc.inline.hpp. | |
1245 // They will be refactored at a later date. | |
1246 | |
1247 void MacroAssembler::sethi(intptr_t imm22a, | |
1248 Register d, | |
1249 bool ForceRelocatable, | |
1250 RelocationHolder const& rspec) { | |
1251 Address adr( d, (address)imm22a, rspec ); | |
1252 MacroAssembler::sethi( adr, ForceRelocatable ); | |
1253 } | |
1254 | |
1255 | |
1256 void MacroAssembler::sethi(Address& a, bool ForceRelocatable) { | |
1257 address save_pc; | 1249 address save_pc; |
1258 int shiftcnt; | 1250 int shiftcnt; |
1259 // if addr of local, do not need to load it | |
1260 assert(a.base() != FP && a.base() != SP, "just use ld or st for locals"); | |
1261 #ifdef _LP64 | 1251 #ifdef _LP64 |
1262 # ifdef CHECK_DELAY | 1252 # ifdef CHECK_DELAY |
1263 assert_not_delayed( (char *)"cannot put two instructions in delay slot" ); | 1253 assert_not_delayed((char*) "cannot put two instructions in delay slot"); |
1264 # endif | 1254 # endif |
1265 v9_dep(); | 1255 v9_dep(); |
1266 // ForceRelocatable = 1; | |
1267 save_pc = pc(); | 1256 save_pc = pc(); |
1268 if (a.hi32() == 0 && a.low32() >= 0) { | 1257 |
1269 Assembler::sethi(a.low32(), a.base(), a.rspec()); | 1258 int msb32 = (int) (addrlit.value() >> 32); |
1270 } | 1259 int lsb32 = (int) (addrlit.value()); |
1271 else if (a.hi32() == -1) { | 1260 |
1272 Assembler::sethi(~a.low32(), a.base(), a.rspec()); | 1261 if (msb32 == 0 && lsb32 >= 0) { |
1273 xor3(a.base(), ~low10(~0), a.base()); | 1262 Assembler::sethi(lsb32, d, addrlit.rspec()); |
1263 } | |
1264 else if (msb32 == -1) { | |
1265 Assembler::sethi(~lsb32, d, addrlit.rspec()); | |
1266 xor3(d, ~low10(~0), d); | |
1274 } | 1267 } |
1275 else { | 1268 else { |
1276 Assembler::sethi(a.hi32(), a.base(), a.rspec() ); // 22 | 1269 Assembler::sethi(msb32, d, addrlit.rspec()); // msb 22-bits |
1277 if ( a.hi32() & 0x3ff ) // Any bits? | 1270 if (msb32 & 0x3ff) // Any bits? |
1278 or3( a.base(), a.hi32() & 0x3ff ,a.base() ); // High 32 bits are now in low 32 | 1271 or3(d, msb32 & 0x3ff, d); // msb 32-bits are now in lsb 32 |
1279 if ( a.low32() & 0xFFFFFC00 ) { // done? | 1272 if (lsb32 & 0xFFFFFC00) { // done? |
1280 if( (a.low32() >> 20) & 0xfff ) { // Any bits set? | 1273 if ((lsb32 >> 20) & 0xfff) { // Any bits set? |
1281 sllx(a.base(), 12, a.base()); // Make room for next 12 bits | 1274 sllx(d, 12, d); // Make room for next 12 bits |
1282 or3( a.base(), (a.low32() >> 20) & 0xfff,a.base() ); // Or in next 12 | 1275 or3(d, (lsb32 >> 20) & 0xfff, d); // Or in next 12 |
1283 shiftcnt = 0; // We already shifted | 1276 shiftcnt = 0; // We already shifted |
1284 } | 1277 } |
1285 else | 1278 else |
1286 shiftcnt = 12; | 1279 shiftcnt = 12; |
1287 if( (a.low32() >> 10) & 0x3ff ) { | 1280 if ((lsb32 >> 10) & 0x3ff) { |
1288 sllx(a.base(), shiftcnt+10, a.base());// Make room for last 10 bits | 1281 sllx(d, shiftcnt + 10, d); // Make room for last 10 bits |
1289 or3( a.base(), (a.low32() >> 10) & 0x3ff,a.base() ); // Or in next 10 | 1282 or3(d, (lsb32 >> 10) & 0x3ff, d); // Or in next 10 |
1290 shiftcnt = 0; | 1283 shiftcnt = 0; |
1291 } | 1284 } |
1292 else | 1285 else |
1293 shiftcnt = 10; | 1286 shiftcnt = 10; |
1294 sllx(a.base(), shiftcnt+10 , a.base()); // Shift leaving disp field 0'd | 1287 sllx(d, shiftcnt + 10, d); // Shift leaving disp field 0'd |
1295 } | 1288 } |
1296 else | 1289 else |
1297 sllx( a.base(), 32, a.base() ); | 1290 sllx(d, 32, d); |
1298 } | 1291 } |
1299 // Pad out the instruction sequence so it can be | 1292 // Pad out the instruction sequence so it can be patched later. |
1300 // patched later. | 1293 if (ForceRelocatable || (addrlit.rtype() != relocInfo::none && |
1301 if ( ForceRelocatable || (a.rtype() != relocInfo::none && | 1294 addrlit.rtype() != relocInfo::runtime_call_type)) { |
1302 a.rtype() != relocInfo::runtime_call_type) ) { | 1295 while (pc() < (save_pc + (7 * BytesPerInstWord))) |
1303 while ( pc() < (save_pc + (7 * BytesPerInstWord )) ) | |
1304 nop(); | 1296 nop(); |
1305 } | 1297 } |
1306 #else | 1298 #else |
1307 Assembler::sethi(a.hi(), a.base(), a.rspec()); | 1299 Assembler::sethi(addrlit.value(), d, addrlit.rspec()); |
1308 #endif | 1300 #endif |
1309 | 1301 } |
1310 } | 1302 |
1303 | |
1304 void MacroAssembler::sethi(const AddressLiteral& addrlit, Register d) { | |
1305 internal_sethi(addrlit, d, false); | |
1306 } | |
1307 | |
1308 | |
1309 void MacroAssembler::patchable_sethi(const AddressLiteral& addrlit, Register d) { | |
1310 internal_sethi(addrlit, d, true); | |
1311 } | |
1312 | |
1311 | 1313 |
1312 int MacroAssembler::size_of_sethi(address a, bool worst_case) { | 1314 int MacroAssembler::size_of_sethi(address a, bool worst_case) { |
1313 #ifdef _LP64 | 1315 #ifdef _LP64 |
1314 if (worst_case) return 7; | 1316 if (worst_case) return 7; |
1315 intptr_t iaddr = (intptr_t)a; | 1317 intptr_t iaddr = (intptr_t)a; |
1337 | 1339 |
1338 int MacroAssembler::worst_case_size_of_set() { | 1340 int MacroAssembler::worst_case_size_of_set() { |
1339 return size_of_sethi(NULL, true) + 1; | 1341 return size_of_sethi(NULL, true) + 1; |
1340 } | 1342 } |
1341 | 1343 |
1342 void MacroAssembler::set(intptr_t value, Register d, | 1344 |
1343 RelocationHolder const& rspec) { | 1345 void MacroAssembler::internal_set(const AddressLiteral& addrlit, Register d, bool ForceRelocatable) { |
1344 Address val( d, (address)value, rspec); | 1346 intptr_t value = addrlit.value(); |
1345 | 1347 |
1346 if ( rspec.type() == relocInfo::none ) { | 1348 if (!ForceRelocatable && addrlit.rspec().type() == relocInfo::none) { |
1347 // can optimize | 1349 // can optimize |
1348 if (-4096 <= value && value <= 4095) { | 1350 if (-4096 <= value && value <= 4095) { |
1349 or3(G0, value, d); // setsw (this leaves upper 32 bits sign-extended) | 1351 or3(G0, value, d); // setsw (this leaves upper 32 bits sign-extended) |
1350 return; | 1352 return; |
1351 } | 1353 } |
1352 if (inv_hi22(hi22(value)) == value) { | 1354 if (inv_hi22(hi22(value)) == value) { |
1353 sethi(val); | 1355 sethi(addrlit, d); |
1354 return; | 1356 return; |
1355 } | 1357 } |
1356 } | 1358 } |
1357 assert_not_delayed( (char *)"cannot put two instructions in delay slot" ); | 1359 assert_not_delayed((char*) "cannot put two instructions in delay slot"); |
1358 sethi( val ); | 1360 internal_sethi(addrlit, d, ForceRelocatable); |
1359 if (rspec.type() != relocInfo::none || (value & 0x3ff) != 0) { | 1361 if (ForceRelocatable || addrlit.rspec().type() != relocInfo::none || addrlit.low10() != 0) { |
1360 add( d, value & 0x3ff, d, rspec); | 1362 add(d, addrlit.low10(), d, addrlit.rspec()); |
1361 } | 1363 } |
1362 } | 1364 } |
1363 | 1365 |
1364 void MacroAssembler::setsw(int value, Register d, | 1366 void MacroAssembler::set(const AddressLiteral& al, Register d) { |
1365 RelocationHolder const& rspec) { | 1367 internal_set(al, d, false); |
1366 Address val( d, (address)value, rspec); | 1368 } |
1367 if ( rspec.type() == relocInfo::none ) { | 1369 |
1368 // can optimize | 1370 void MacroAssembler::set(intptr_t value, Register d) { |
1369 if (-4096 <= value && value <= 4095) { | 1371 AddressLiteral al(value); |
1370 or3(G0, value, d); | 1372 internal_set(al, d, false); |
1371 return; | 1373 } |
1372 } | 1374 |
1373 if (inv_hi22(hi22(value)) == value) { | 1375 void MacroAssembler::set(address addr, Register d, RelocationHolder const& rspec) { |
1374 sethi( val ); | 1376 AddressLiteral al(addr, rspec); |
1375 #ifndef _LP64 | 1377 internal_set(al, d, false); |
1376 if ( value < 0 ) { | 1378 } |
1377 assert_not_delayed(); | 1379 |
1378 sra (d, G0, d); | 1380 void MacroAssembler::patchable_set(const AddressLiteral& al, Register d) { |
1379 } | 1381 internal_set(al, d, true); |
1380 #endif | 1382 } |
1381 return; | 1383 |
1382 } | 1384 void MacroAssembler::patchable_set(intptr_t value, Register d) { |
1383 } | 1385 AddressLiteral al(value); |
1384 assert_not_delayed(); | 1386 internal_set(al, d, true); |
1385 sethi( val ); | 1387 } |
1386 add( d, value & 0x3ff, d, rspec); | |
1387 | |
1388 // (A negative value could be loaded in 2 insns with sethi/xor, | |
1389 // but it would take a more complex relocation.) | |
1390 #ifndef _LP64 | |
1391 if ( value < 0) | |
1392 sra(d, G0, d); | |
1393 #endif | |
1394 } | |
1395 | |
1396 // %%% End of moved six set instructions. | |
1397 | 1388 |
1398 | 1389 |
1399 void MacroAssembler::set64(jlong value, Register d, Register tmp) { | 1390 void MacroAssembler::set64(jlong value, Register d, Register tmp) { |
1400 assert_not_delayed(); | 1391 assert_not_delayed(); |
1401 v9_dep(); | 1392 v9_dep(); |
1510 mov(s2->after_save(), d2); | 1501 mov(s2->after_save(), d2); |
1511 } | 1502 } |
1512 } | 1503 } |
1513 | 1504 |
1514 | 1505 |
1515 Address MacroAssembler::allocate_oop_address(jobject obj, Register d) { | 1506 AddressLiteral MacroAssembler::allocate_oop_address(jobject obj) { |
1516 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); | 1507 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
1517 int oop_index = oop_recorder()->allocate_index(obj); | 1508 int oop_index = oop_recorder()->allocate_index(obj); |
1518 return Address(d, address(obj), oop_Relocation::spec(oop_index)); | 1509 return AddressLiteral(obj, oop_Relocation::spec(oop_index)); |
1519 } | 1510 } |
1520 | 1511 |
1521 | 1512 |
1522 Address MacroAssembler::constant_oop_address(jobject obj, Register d) { | 1513 AddressLiteral MacroAssembler::constant_oop_address(jobject obj) { |
1523 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); | 1514 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
1524 int oop_index = oop_recorder()->find_index(obj); | 1515 int oop_index = oop_recorder()->find_index(obj); |
1525 return Address(d, address(obj), oop_Relocation::spec(oop_index)); | 1516 return AddressLiteral(obj, oop_Relocation::spec(oop_index)); |
1526 } | 1517 } |
1527 | 1518 |
1528 void MacroAssembler::set_narrow_oop(jobject obj, Register d) { | 1519 void MacroAssembler::set_narrow_oop(jobject obj, Register d) { |
1529 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); | 1520 assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
1530 int oop_index = oop_recorder()->find_index(obj); | 1521 int oop_index = oop_recorder()->find_index(obj); |
1680 len += strlen(buffer); | 1671 len += strlen(buffer); |
1681 char * real_msg = new char[len]; | 1672 char * real_msg = new char[len]; |
1682 sprintf(real_msg, "%s%s(%s:%d)", msg, buffer, file, line); | 1673 sprintf(real_msg, "%s%s(%s:%d)", msg, buffer, file, line); |
1683 | 1674 |
1684 // Call indirectly to solve generation ordering problem | 1675 // Call indirectly to solve generation ordering problem |
1685 Address a(O7, (address)StubRoutines::verify_oop_subroutine_entry_address()); | 1676 AddressLiteral a(StubRoutines::verify_oop_subroutine_entry_address()); |
1686 | 1677 |
1687 // Make some space on stack above the current register window. | 1678 // Make some space on stack above the current register window. |
1688 // Enough to hold 8 64-bit registers. | 1679 // Enough to hold 8 64-bit registers. |
1689 add(SP,-8*8,SP); | 1680 add(SP,-8*8,SP); |
1690 | 1681 |
1716 len += strlen(buffer); | 1707 len += strlen(buffer); |
1717 char * real_msg = new char[len]; | 1708 char * real_msg = new char[len]; |
1718 sprintf(real_msg, "%s at SP+%d (%s:%d)", msg, addr.disp(), file, line); | 1709 sprintf(real_msg, "%s at SP+%d (%s:%d)", msg, addr.disp(), file, line); |
1719 | 1710 |
1720 // Call indirectly to solve generation ordering problem | 1711 // Call indirectly to solve generation ordering problem |
1721 Address a(O7, (address)StubRoutines::verify_oop_subroutine_entry_address()); | 1712 AddressLiteral a(StubRoutines::verify_oop_subroutine_entry_address()); |
1722 | 1713 |
1723 // Make some space on stack above the current register window. | 1714 // Make some space on stack above the current register window. |
1724 // Enough to hold 8 64-bit registers. | 1715 // Enough to hold 8 64-bit registers. |
1725 add(SP,-8*8,SP); | 1716 add(SP,-8*8,SP); |
1726 | 1717 |
1770 rdccr( O5_save_flags ); | 1761 rdccr( O5_save_flags ); |
1771 | 1762 |
1772 { // count number of verifies | 1763 { // count number of verifies |
1773 Register O2_adr = O2; | 1764 Register O2_adr = O2; |
1774 Register O3_accum = O3; | 1765 Register O3_accum = O3; |
1775 Address count_addr( O2_adr, (address) StubRoutines::verify_oop_count_addr() ); | 1766 inc_counter(StubRoutines::verify_oop_count_addr(), O2_adr, O3_accum); |
1776 sethi(count_addr); | |
1777 ld(count_addr, O3_accum); | |
1778 inc(O3_accum); | |
1779 st(O3_accum, count_addr); | |
1780 } | 1767 } |
1781 | 1768 |
1782 Register O2_mask = O2; | 1769 Register O2_mask = O2; |
1783 Register O3_bits = O3; | 1770 Register O3_bits = O3; |
1784 Register O4_temp = O4; | 1771 Register O4_temp = O4; |
1868 | 1855 |
1869 // factor long stop-sequence into subroutine to save space | 1856 // factor long stop-sequence into subroutine to save space |
1870 assert(StubRoutines::Sparc::stop_subroutine_entry_address(), "hasn't been generated yet"); | 1857 assert(StubRoutines::Sparc::stop_subroutine_entry_address(), "hasn't been generated yet"); |
1871 | 1858 |
1872 // call indirectly to solve generation ordering problem | 1859 // call indirectly to solve generation ordering problem |
1873 Address a(O5, (address)StubRoutines::Sparc::stop_subroutine_entry_address()); | 1860 AddressLiteral al(StubRoutines::Sparc::stop_subroutine_entry_address()); |
1874 load_ptr_contents(a, O5); | 1861 load_ptr_contents(al, O5); |
1875 jmpl(O5, 0, O7); | 1862 jmpl(O5, 0, O7); |
1876 delayed()->nop(); | 1863 delayed()->nop(); |
1877 } | 1864 } |
1878 | 1865 |
1879 | 1866 |
1889 | 1876 |
1890 // factor long stop-sequence into subroutine to save space | 1877 // factor long stop-sequence into subroutine to save space |
1891 assert(StubRoutines::Sparc::stop_subroutine_entry_address(), "hasn't been generated yet"); | 1878 assert(StubRoutines::Sparc::stop_subroutine_entry_address(), "hasn't been generated yet"); |
1892 | 1879 |
1893 // call indirectly to solve generation ordering problem | 1880 // call indirectly to solve generation ordering problem |
1894 Address a(O5, (address)StubRoutines::Sparc::stop_subroutine_entry_address()); | 1881 AddressLiteral a(StubRoutines::Sparc::stop_subroutine_entry_address()); |
1895 load_ptr_contents(a, O5); | 1882 load_ptr_contents(a, O5); |
1896 jmpl(O5, 0, O7); | 1883 jmpl(O5, 0, O7); |
1897 delayed()->nop(); | 1884 delayed()->nop(); |
1898 | 1885 |
1899 breakpoint_trap(); // make stop actually stop rather than writing | 1886 breakpoint_trap(); // make stop actually stop rather than writing |
2001 | 1988 |
2002 void MacroAssembler::calc_mem_param_words(Register Rparam_words, Register Rresult) { | 1989 void MacroAssembler::calc_mem_param_words(Register Rparam_words, Register Rresult) { |
2003 subcc( Rparam_words, Argument::n_register_parameters, Rresult); // how many mem words? | 1990 subcc( Rparam_words, Argument::n_register_parameters, Rresult); // how many mem words? |
2004 Label no_extras; | 1991 Label no_extras; |
2005 br( negative, true, pt, no_extras ); // if neg, clear reg | 1992 br( negative, true, pt, no_extras ); // if neg, clear reg |
2006 delayed()->set( 0, Rresult); // annuled, so only if taken | 1993 delayed()->set(0, Rresult); // annuled, so only if taken |
2007 bind( no_extras ); | 1994 bind( no_extras ); |
2008 } | 1995 } |
2009 | 1996 |
2010 | 1997 |
2011 void MacroAssembler::calc_frame_size(Register Rextra_words, Register Rresult) { | 1998 void MacroAssembler::calc_frame_size(Register Rextra_words, Register Rresult) { |
2621 intptr_t value = *delayed_value_addr; | 2608 intptr_t value = *delayed_value_addr; |
2622 if (value != 0) | 2609 if (value != 0) |
2623 return RegisterOrConstant(value + offset); | 2610 return RegisterOrConstant(value + offset); |
2624 | 2611 |
2625 // load indirectly to solve generation ordering problem | 2612 // load indirectly to solve generation ordering problem |
2626 Address a(tmp, (address) delayed_value_addr); | 2613 AddressLiteral a(delayed_value_addr); |
2627 load_ptr_contents(a, tmp); | 2614 load_ptr_contents(a, tmp); |
2628 | 2615 |
2629 #ifdef ASSERT | 2616 #ifdef ASSERT |
2630 tst(tmp); | 2617 tst(tmp); |
2631 breakpoint_trap(zero, xcc); | 2618 breakpoint_trap(zero, xcc); |
3105 cmp(temp_reg, markOopDesc::biased_lock_pattern); | 3092 cmp(temp_reg, markOopDesc::biased_lock_pattern); |
3106 brx(Assembler::notEqual, false, Assembler::pn, cas_label); | 3093 brx(Assembler::notEqual, false, Assembler::pn, cas_label); |
3107 delayed()->nop(); | 3094 delayed()->nop(); |
3108 | 3095 |
3109 load_klass(obj_reg, temp_reg); | 3096 load_klass(obj_reg, temp_reg); |
3110 ld_ptr(Address(temp_reg, 0, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg); | 3097 ld_ptr(Address(temp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg); |
3111 or3(G2_thread, temp_reg, temp_reg); | 3098 or3(G2_thread, temp_reg, temp_reg); |
3112 xor3(mark_reg, temp_reg, temp_reg); | 3099 xor3(mark_reg, temp_reg, temp_reg); |
3113 andcc(temp_reg, ~((int) markOopDesc::age_mask_in_place), temp_reg); | 3100 andcc(temp_reg, ~((int) markOopDesc::age_mask_in_place), temp_reg); |
3114 if (counters != NULL) { | 3101 if (counters != NULL) { |
3115 cond_inc(Assembler::equal, (address) counters->biased_lock_entry_count_addr(), mark_reg, temp_reg); | 3102 cond_inc(Assembler::equal, (address) counters->biased_lock_entry_count_addr(), mark_reg, temp_reg); |
3116 // Reload mark_reg as we may need it later | 3103 // Reload mark_reg as we may need it later |
3117 ld_ptr(Address(obj_reg, 0, oopDesc::mark_offset_in_bytes()), mark_reg); | 3104 ld_ptr(Address(obj_reg, oopDesc::mark_offset_in_bytes()), mark_reg); |
3118 } | 3105 } |
3119 brx(Assembler::equal, true, Assembler::pt, done); | 3106 brx(Assembler::equal, true, Assembler::pt, done); |
3120 delayed()->nop(); | 3107 delayed()->nop(); |
3121 | 3108 |
3122 Label try_revoke_bias; | 3109 Label try_revoke_bias; |
3123 Label try_rebias; | 3110 Label try_rebias; |
3124 Address mark_addr = Address(obj_reg, 0, oopDesc::mark_offset_in_bytes()); | 3111 Address mark_addr = Address(obj_reg, oopDesc::mark_offset_in_bytes()); |
3125 assert(mark_addr.disp() == 0, "cas must take a zero displacement"); | 3112 assert(mark_addr.disp() == 0, "cas must take a zero displacement"); |
3126 | 3113 |
3127 // At this point we know that the header has the bias pattern and | 3114 // At this point we know that the header has the bias pattern and |
3128 // that we are not the bias owner in the current epoch. We need to | 3115 // that we are not the bias owner in the current epoch. We need to |
3129 // figure out more details about the state of the header in order to | 3116 // figure out more details about the state of the header in order to |
3183 // the bias from one thread to another directly in this situation. | 3170 // the bias from one thread to another directly in this situation. |
3184 // | 3171 // |
3185 // FIXME: due to a lack of registers we currently blow away the age | 3172 // FIXME: due to a lack of registers we currently blow away the age |
3186 // bits in this situation. Should attempt to preserve them. | 3173 // bits in this situation. Should attempt to preserve them. |
3187 load_klass(obj_reg, temp_reg); | 3174 load_klass(obj_reg, temp_reg); |
3188 ld_ptr(Address(temp_reg, 0, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg); | 3175 ld_ptr(Address(temp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg); |
3189 or3(G2_thread, temp_reg, temp_reg); | 3176 or3(G2_thread, temp_reg, temp_reg); |
3190 casn(mark_addr.base(), mark_reg, temp_reg); | 3177 casn(mark_addr.base(), mark_reg, temp_reg); |
3191 // If the biasing toward our thread failed, this means that | 3178 // If the biasing toward our thread failed, this means that |
3192 // another thread succeeded in biasing it toward itself and we | 3179 // another thread succeeded in biasing it toward itself and we |
3193 // need to revoke that bias. The revocation will occur in the | 3180 // need to revoke that bias. The revocation will occur in the |
3214 // normal locking code. | 3201 // normal locking code. |
3215 // | 3202 // |
3216 // FIXME: due to a lack of registers we currently blow away the age | 3203 // FIXME: due to a lack of registers we currently blow away the age |
3217 // bits in this situation. Should attempt to preserve them. | 3204 // bits in this situation. Should attempt to preserve them. |
3218 load_klass(obj_reg, temp_reg); | 3205 load_klass(obj_reg, temp_reg); |
3219 ld_ptr(Address(temp_reg, 0, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg); | 3206 ld_ptr(Address(temp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()), temp_reg); |
3220 casn(mark_addr.base(), mark_reg, temp_reg); | 3207 casn(mark_addr.base(), mark_reg, temp_reg); |
3221 // Fall through to the normal CAS-based lock, because no matter what | 3208 // Fall through to the normal CAS-based lock, because no matter what |
3222 // the result of the above CAS, some thread must have succeeded in | 3209 // the result of the above CAS, some thread must have succeeded in |
3223 // removing the bias bit from the object's header. | 3210 // removing the bias bit from the object's header. |
3224 if (counters != NULL) { | 3211 if (counters != NULL) { |
3281 | 3268 |
3282 void MacroAssembler::compiler_lock_object(Register Roop, Register Rmark, | 3269 void MacroAssembler::compiler_lock_object(Register Roop, Register Rmark, |
3283 Register Rbox, Register Rscratch, | 3270 Register Rbox, Register Rscratch, |
3284 BiasedLockingCounters* counters, | 3271 BiasedLockingCounters* counters, |
3285 bool try_bias) { | 3272 bool try_bias) { |
3286 Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes()); | 3273 Address mark_addr(Roop, oopDesc::mark_offset_in_bytes()); |
3287 | 3274 |
3288 verify_oop(Roop); | 3275 verify_oop(Roop); |
3289 Label done ; | 3276 Label done ; |
3290 | 3277 |
3291 if (counters != NULL) { | 3278 if (counters != NULL) { |
3384 bind (IsInflated) ; | 3371 bind (IsInflated) ; |
3385 if (EmitSync & 64) { | 3372 if (EmitSync & 64) { |
3386 // If m->owner != null goto IsLocked | 3373 // If m->owner != null goto IsLocked |
3387 // Pessimistic form: Test-and-CAS vs CAS | 3374 // Pessimistic form: Test-and-CAS vs CAS |
3388 // The optimistic form avoids RTS->RTO cache line upgrades. | 3375 // The optimistic form avoids RTS->RTO cache line upgrades. |
3389 ld_ptr (Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2), Rscratch) ; | 3376 ld_ptr (Rmark, ObjectMonitor::owner_offset_in_bytes() - 2, Rscratch); |
3390 andcc (Rscratch, Rscratch, G0) ; | 3377 andcc (Rscratch, Rscratch, G0) ; |
3391 brx (Assembler::notZero, false, Assembler::pn, done) ; | 3378 brx (Assembler::notZero, false, Assembler::pn, done) ; |
3392 delayed()->nop() ; | 3379 delayed()->nop() ; |
3393 // m->owner == null : it's unlocked. | 3380 // m->owner == null : it's unlocked. |
3394 } | 3381 } |
3480 if (EmitSync & 64) { | 3467 if (EmitSync & 64) { |
3481 // If m->owner != null goto IsLocked | 3468 // If m->owner != null goto IsLocked |
3482 // Test-and-CAS vs CAS | 3469 // Test-and-CAS vs CAS |
3483 // Pessimistic form avoids futile (doomed) CAS attempts | 3470 // Pessimistic form avoids futile (doomed) CAS attempts |
3484 // The optimistic form avoids RTS->RTO cache line upgrades. | 3471 // The optimistic form avoids RTS->RTO cache line upgrades. |
3485 ld_ptr (Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2), Rscratch) ; | 3472 ld_ptr (Rmark, ObjectMonitor::owner_offset_in_bytes() - 2, Rscratch); |
3486 andcc (Rscratch, Rscratch, G0) ; | 3473 andcc (Rscratch, Rscratch, G0) ; |
3487 brx (Assembler::notZero, false, Assembler::pn, done) ; | 3474 brx (Assembler::notZero, false, Assembler::pn, done) ; |
3488 delayed()->nop() ; | 3475 delayed()->nop() ; |
3489 // m->owner == null : it's unlocked. | 3476 // m->owner == null : it's unlocked. |
3490 } | 3477 } |
3506 } | 3493 } |
3507 | 3494 |
3508 void MacroAssembler::compiler_unlock_object(Register Roop, Register Rmark, | 3495 void MacroAssembler::compiler_unlock_object(Register Roop, Register Rmark, |
3509 Register Rbox, Register Rscratch, | 3496 Register Rbox, Register Rscratch, |
3510 bool try_bias) { | 3497 bool try_bias) { |
3511 Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes()); | 3498 Address mark_addr(Roop, oopDesc::mark_offset_in_bytes()); |
3512 | 3499 |
3513 Label done ; | 3500 Label done ; |
3514 | 3501 |
3515 if (EmitSync & 4) { | 3502 if (EmitSync & 4) { |
3516 cmp (SP, G0) ; | 3503 cmp (SP, G0) ; |
3566 // past the store that releases the lock. But TSO is a strong memory model | 3553 // past the store that releases the lock. But TSO is a strong memory model |
3567 // and that particular flavor of barrier is a noop, so we can safely elide it. | 3554 // and that particular flavor of barrier is a noop, so we can safely elide it. |
3568 // Note that we use 1-0 locking by default for the inflated case. We | 3555 // Note that we use 1-0 locking by default for the inflated case. We |
3569 // close the resultant (and rare) race by having contented threads in | 3556 // close the resultant (and rare) race by having contented threads in |
3570 // monitorenter periodically poll _owner. | 3557 // monitorenter periodically poll _owner. |
3571 ld_ptr (Address(Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2), Rscratch) ; | 3558 ld_ptr (Rmark, ObjectMonitor::owner_offset_in_bytes() - 2, Rscratch); |
3572 ld_ptr (Address(Rmark, 0, ObjectMonitor::recursions_offset_in_bytes()-2), Rbox) ; | 3559 ld_ptr (Rmark, ObjectMonitor::recursions_offset_in_bytes() - 2, Rbox); |
3573 xor3 (Rscratch, G2_thread, Rscratch) ; | 3560 xor3 (Rscratch, G2_thread, Rscratch) ; |
3574 orcc (Rbox, Rscratch, Rbox) ; | 3561 orcc (Rbox, Rscratch, Rbox) ; |
3575 brx (Assembler::notZero, false, Assembler::pn, done) ; | 3562 brx (Assembler::notZero, false, Assembler::pn, done) ; |
3576 delayed()-> | 3563 delayed()-> |
3577 ld_ptr (Address (Rmark, 0, ObjectMonitor::EntryList_offset_in_bytes()-2), Rscratch) ; | 3564 ld_ptr (Rmark, ObjectMonitor::EntryList_offset_in_bytes() - 2, Rscratch); |
3578 ld_ptr (Address (Rmark, 0, ObjectMonitor::cxq_offset_in_bytes()-2), Rbox) ; | 3565 ld_ptr (Rmark, ObjectMonitor::cxq_offset_in_bytes() - 2, Rbox); |
3579 orcc (Rbox, Rscratch, G0) ; | 3566 orcc (Rbox, Rscratch, G0) ; |
3580 if (EmitSync & 65536) { | 3567 if (EmitSync & 65536) { |
3581 Label LSucc ; | 3568 Label LSucc ; |
3582 brx (Assembler::notZero, false, Assembler::pn, LSucc) ; | 3569 brx (Assembler::notZero, false, Assembler::pn, LSucc) ; |
3583 delayed()->nop() ; | 3570 delayed()->nop() ; |
3584 br (Assembler::always, false, Assembler::pt, done) ; | 3571 br (Assembler::always, false, Assembler::pt, done) ; |
3585 delayed()-> | 3572 delayed()-> |
3586 st_ptr (G0, Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2)) ; | 3573 st_ptr (G0, Rmark, ObjectMonitor::owner_offset_in_bytes() - 2); |
3587 | 3574 |
3588 bind (LSucc) ; | 3575 bind (LSucc) ; |
3589 st_ptr (G0, Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2)) ; | 3576 st_ptr (G0, Rmark, ObjectMonitor::owner_offset_in_bytes() - 2); |
3590 if (os::is_MP()) { membar (StoreLoad) ; } | 3577 if (os::is_MP()) { membar (StoreLoad) ; } |
3591 ld_ptr (Address (Rmark, 0, ObjectMonitor::succ_offset_in_bytes()-2), Rscratch) ; | 3578 ld_ptr (Rmark, ObjectMonitor::succ_offset_in_bytes() - 2, Rscratch); |
3592 andcc (Rscratch, Rscratch, G0) ; | 3579 andcc (Rscratch, Rscratch, G0) ; |
3593 brx (Assembler::notZero, false, Assembler::pt, done) ; | 3580 brx (Assembler::notZero, false, Assembler::pt, done) ; |
3594 delayed()-> andcc (G0, G0, G0) ; | 3581 delayed()-> andcc (G0, G0, G0) ; |
3595 add (Rmark, ObjectMonitor::owner_offset_in_bytes()-2, Rmark) ; | 3582 add (Rmark, ObjectMonitor::owner_offset_in_bytes()-2, Rmark) ; |
3596 mov (G2_thread, Rscratch) ; | 3583 mov (G2_thread, Rscratch) ; |
3604 } else { | 3591 } else { |
3605 brx (Assembler::notZero, false, Assembler::pn, done) ; | 3592 brx (Assembler::notZero, false, Assembler::pn, done) ; |
3606 delayed()->nop() ; | 3593 delayed()->nop() ; |
3607 br (Assembler::always, false, Assembler::pt, done) ; | 3594 br (Assembler::always, false, Assembler::pt, done) ; |
3608 delayed()-> | 3595 delayed()-> |
3609 st_ptr (G0, Address (Rmark, 0, ObjectMonitor::owner_offset_in_bytes()-2)) ; | 3596 st_ptr (G0, Rmark, ObjectMonitor::owner_offset_in_bytes() - 2); |
3610 } | 3597 } |
3611 | 3598 |
3612 bind (LStacked) ; | 3599 bind (LStacked) ; |
3613 // Consider: we could replace the expensive CAS in the exit | 3600 // Consider: we could replace the expensive CAS in the exit |
3614 // path with a simple ST of the displaced mark value fetched from | 3601 // path with a simple ST of the displaced mark value fetched from |
4003 delayed()->nop(); | 3990 delayed()->nop(); |
4004 inc_counter(counter_ptr, Rtmp1, Rtmp2); | 3991 inc_counter(counter_ptr, Rtmp1, Rtmp2); |
4005 bind(L); | 3992 bind(L); |
4006 } | 3993 } |
4007 | 3994 |
4008 void MacroAssembler::inc_counter(address counter_ptr, Register Rtmp1, Register Rtmp2) { | 3995 void MacroAssembler::inc_counter(address counter_addr, Register Rtmp1, Register Rtmp2) { |
4009 Address counter_addr(Rtmp1, counter_ptr); | 3996 AddressLiteral addrlit(counter_addr); |
4010 load_contents(counter_addr, Rtmp2); | 3997 sethi(addrlit, Rtmp1); // Move hi22 bits into temporary register. |
3998 Address addr(Rtmp1, addrlit.low10()); // Build an address with low10 bits. | |
3999 ld(addr, Rtmp2); | |
4011 inc(Rtmp2); | 4000 inc(Rtmp2); |
4012 store_contents(Rtmp2, counter_addr); | 4001 st(Rtmp2, addr); |
4002 } | |
4003 | |
4004 void MacroAssembler::inc_counter(int* counter_addr, Register Rtmp1, Register Rtmp2) { | |
4005 inc_counter((address) counter_addr, Rtmp1, Rtmp2); | |
4013 } | 4006 } |
4014 | 4007 |
4015 SkipIfEqual::SkipIfEqual( | 4008 SkipIfEqual::SkipIfEqual( |
4016 MacroAssembler* masm, Register temp, const bool* flag_addr, | 4009 MacroAssembler* masm, Register temp, const bool* flag_addr, |
4017 Assembler::Condition condition) { | 4010 Assembler::Condition condition) { |
4018 _masm = masm; | 4011 _masm = masm; |
4019 Address flag(temp, (address)flag_addr, relocInfo::none); | 4012 AddressLiteral flag(flag_addr); |
4020 _masm->sethi(flag); | 4013 _masm->sethi(flag, temp); |
4021 _masm->ldub(flag, temp); | 4014 _masm->ldub(temp, flag.low10(), temp); |
4022 _masm->tst(temp); | 4015 _masm->tst(temp); |
4023 _masm->br(condition, false, Assembler::pt, _label); | 4016 _masm->br(condition, false, Assembler::pt, _label); |
4024 _masm->delayed()->nop(); | 4017 _masm->delayed()->nop(); |
4025 } | 4018 } |
4026 | 4019 |
4331 #ifdef _LP64 | 4324 #ifdef _LP64 |
4332 masm.srlx(O0, CardTableModRefBS::card_shift, O0); | 4325 masm.srlx(O0, CardTableModRefBS::card_shift, O0); |
4333 #else | 4326 #else |
4334 masm.srl(O0, CardTableModRefBS::card_shift, O0); | 4327 masm.srl(O0, CardTableModRefBS::card_shift, O0); |
4335 #endif | 4328 #endif |
4336 Address rs(O1, (address)byte_map_base); | 4329 AddressLiteral addrlit(byte_map_base); |
4337 masm.load_address(rs); // O1 := <card table base> | 4330 masm.set(addrlit, O1); // O1 := <card table base> |
4338 masm.ldub(O0, O1, O2); // O2 := [O0 + O1] | 4331 masm.ldub(O0, O1, O2); // O2 := [O0 + O1] |
4339 | 4332 |
4340 masm.br_on_reg_cond(Assembler::rc_nz, /*annul*/false, Assembler::pt, | 4333 masm.br_on_reg_cond(Assembler::rc_nz, /*annul*/false, Assembler::pt, |
4341 O2, not_already_dirty); | 4334 O2, not_already_dirty); |
4342 // Get O1 + O2 into a reg by itself -- useful in the take-the-branch | 4335 // Get O1 + O2 into a reg by itself -- useful in the take-the-branch |
4492 #ifdef _LP64 | 4485 #ifdef _LP64 |
4493 post_filter_masm->srlx(store_addr, CardTableModRefBS::card_shift, store_addr); | 4486 post_filter_masm->srlx(store_addr, CardTableModRefBS::card_shift, store_addr); |
4494 #else | 4487 #else |
4495 post_filter_masm->srl(store_addr, CardTableModRefBS::card_shift, store_addr); | 4488 post_filter_masm->srl(store_addr, CardTableModRefBS::card_shift, store_addr); |
4496 #endif | 4489 #endif |
4497 assert( tmp != store_addr, "need separate temp reg"); | 4490 assert(tmp != store_addr, "need separate temp reg"); |
4498 Address rs(tmp, (address)bs->byte_map_base); | 4491 set(bs->byte_map_base, tmp); |
4499 load_address(rs); | 4492 stb(G0, tmp, store_addr); |
4500 stb(G0, rs.base(), store_addr); | |
4501 } | 4493 } |
4502 | 4494 |
4503 bind(filtered); | 4495 bind(filtered); |
4504 | 4496 |
4505 } | 4497 } |
4513 CardTableModRefBS* bs = (CardTableModRefBS*) Universe::heap()->barrier_set(); | 4505 CardTableModRefBS* bs = (CardTableModRefBS*) Universe::heap()->barrier_set(); |
4514 assert(bs->kind() == BarrierSet::CardTableModRef || | 4506 assert(bs->kind() == BarrierSet::CardTableModRef || |
4515 bs->kind() == BarrierSet::CardTableExtension, "wrong barrier"); | 4507 bs->kind() == BarrierSet::CardTableExtension, "wrong barrier"); |
4516 card_table_write(bs->byte_map_base, tmp, store_addr); | 4508 card_table_write(bs->byte_map_base, tmp, store_addr); |
4517 } | 4509 } |
4518 | |
4519 // Loading values by size and signed-ness | |
4520 void MacroAssembler::load_sized_value(Register s1, RegisterOrConstant s2, Register d, | |
4521 int size_in_bytes, bool is_signed) { | |
4522 switch (size_in_bytes ^ (is_signed ? -1 : 0)) { | |
4523 case ~8: // fall through: | |
4524 case 8: ld_long( s1, s2, d ); break; | |
4525 case ~4: ldsw( s1, s2, d ); break; | |
4526 case 4: lduw( s1, s2, d ); break; | |
4527 case ~2: ldsh( s1, s2, d ); break; | |
4528 case 2: lduh( s1, s2, d ); break; | |
4529 case ~1: ldsb( s1, s2, d ); break; | |
4530 case 1: ldub( s1, s2, d ); break; | |
4531 default: ShouldNotReachHere(); | |
4532 } | |
4533 } | |
4534 | |
4535 | |
4536 | 4510 |
4537 void MacroAssembler::load_klass(Register src_oop, Register klass) { | 4511 void MacroAssembler::load_klass(Register src_oop, Register klass) { |
4538 // The number of bytes in this code is used by | 4512 // The number of bytes in this code is used by |
4539 // MachCallDynamicJavaNode::ret_addr_offset() | 4513 // MachCallDynamicJavaNode::ret_addr_offset() |
4540 // if this changes, change that. | 4514 // if this changes, change that. |
4561 assert(s != d, "not enough registers"); | 4535 assert(s != d, "not enough registers"); |
4562 st(s, d, oopDesc::klass_gap_offset_in_bytes()); | 4536 st(s, d, oopDesc::klass_gap_offset_in_bytes()); |
4563 } | 4537 } |
4564 } | 4538 } |
4565 | 4539 |
4566 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) { | 4540 void MacroAssembler::load_heap_oop(const Address& s, Register d) { |
4567 if (UseCompressedOops) { | 4541 if (UseCompressedOops) { |
4568 lduw(s, d, offset); | 4542 lduw(s, d); |
4569 decode_heap_oop(d); | 4543 decode_heap_oop(d); |
4570 } else { | 4544 } else { |
4571 ld_ptr(s, d, offset); | 4545 ld_ptr(s, d); |
4572 } | 4546 } |
4573 } | 4547 } |
4574 | 4548 |
4575 void MacroAssembler::load_heap_oop(Register s1, Register s2, Register d) { | 4549 void MacroAssembler::load_heap_oop(Register s1, Register s2, Register d) { |
4576 if (UseCompressedOops) { | 4550 if (UseCompressedOops) { |
4712 } | 4686 } |
4713 | 4687 |
4714 void MacroAssembler::reinit_heapbase() { | 4688 void MacroAssembler::reinit_heapbase() { |
4715 if (UseCompressedOops) { | 4689 if (UseCompressedOops) { |
4716 // call indirectly to solve generation ordering problem | 4690 // call indirectly to solve generation ordering problem |
4717 Address base(G6_heapbase, (address)Universe::narrow_oop_base_addr()); | 4691 AddressLiteral base(Universe::narrow_oop_base_addr()); |
4718 load_ptr_contents(base, G6_heapbase); | 4692 load_ptr_contents(base, G6_heapbase); |
4719 } | 4693 } |
4720 } | 4694 } |