1 /* |
1 /* |
2 * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved. |
2 * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
27 |
27 |
28 void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) { |
28 void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) { |
29 Label L; |
29 Label L; |
30 const Register temp_reg = G3_scratch; |
30 const Register temp_reg = G3_scratch; |
31 // Note: needs more testing of out-of-line vs. inline slow case |
31 // Note: needs more testing of out-of-line vs. inline slow case |
32 Address ic_miss(temp_reg, SharedRuntime::get_ic_miss_stub()); |
|
33 verify_oop(receiver); |
32 verify_oop(receiver); |
34 ld_ptr(receiver, oopDesc::klass_offset_in_bytes(), temp_reg); |
33 ld_ptr(receiver, oopDesc::klass_offset_in_bytes(), temp_reg); |
35 cmp(temp_reg, iCache); |
34 cmp(temp_reg, iCache); |
36 brx(Assembler::equal, true, Assembler::pt, L); |
35 brx(Assembler::equal, true, Assembler::pt, L); |
37 delayed()->nop(); |
36 delayed()->nop(); |
38 jump_to(ic_miss, 0); |
37 AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub()); |
|
38 jump_to(ic_miss, temp_reg); |
39 delayed()->nop(); |
39 delayed()->nop(); |
40 align(CodeEntryAlignment); |
40 align(CodeEntryAlignment); |
41 bind(L); |
41 bind(L); |
42 } |
42 } |
43 |
43 |
82 void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox, Register Rscratch, Label& slow_case) { |
82 void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox, Register Rscratch, Label& slow_case) { |
83 assert_different_registers(Rmark, Roop, Rbox, Rscratch); |
83 assert_different_registers(Rmark, Roop, Rbox, Rscratch); |
84 |
84 |
85 Label done; |
85 Label done; |
86 |
86 |
87 Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes()); |
87 Address mark_addr(Roop, oopDesc::mark_offset_in_bytes()); |
88 |
88 |
89 // The following move must be the first instruction of emitted since debug |
89 // The following move must be the first instruction of emitted since debug |
90 // information may be generated for it. |
90 // information may be generated for it. |
91 // Load object header |
91 // Load object header |
92 ld_ptr(mark_addr, Rmark); |
92 ld_ptr(mark_addr, Rmark); |
130 void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rbox, Label& slow_case) { |
130 void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rbox, Label& slow_case) { |
131 assert_different_registers(Rmark, Roop, Rbox); |
131 assert_different_registers(Rmark, Roop, Rbox); |
132 |
132 |
133 Label done; |
133 Label done; |
134 |
134 |
135 Address mark_addr(Roop, 0, oopDesc::mark_offset_in_bytes()); |
135 Address mark_addr(Roop, oopDesc::mark_offset_in_bytes()); |
136 assert(mark_addr.disp() == 0, "cas must take a zero displacement"); |
136 assert(mark_addr.disp() == 0, "cas must take a zero displacement"); |
137 |
137 |
138 if (UseBiasedLocking) { |
138 if (UseBiasedLocking) { |
139 // load the object out of the BasicObjectLock |
139 // load the object out of the BasicObjectLock |
140 ld_ptr(Rbox, BasicObjectLock::obj_offset_in_bytes(), Roop); |
140 ld_ptr(Rbox, BasicObjectLock::obj_offset_in_bytes(), Roop); |
368 |
368 |
369 #ifndef PRODUCT |
369 #ifndef PRODUCT |
370 |
370 |
371 void C1_MacroAssembler::verify_stack_oop(int stack_offset) { |
371 void C1_MacroAssembler::verify_stack_oop(int stack_offset) { |
372 if (!VerifyOops) return; |
372 if (!VerifyOops) return; |
373 verify_oop_addr(Address(SP, 0, stack_offset + STACK_BIAS)); |
373 verify_oop_addr(Address(SP, stack_offset + STACK_BIAS)); |
374 } |
374 } |
375 |
375 |
376 void C1_MacroAssembler::verify_not_null_oop(Register r) { |
376 void C1_MacroAssembler::verify_not_null_oop(Register r) { |
377 Label not_null; |
377 Label not_null; |
378 br_zero(Assembler::notEqual, false, Assembler::pt, r, not_null); |
378 br_zero(Assembler::notEqual, false, Assembler::pt, r, not_null); |