7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
Summary: Replaced incr_allocated_bytes() formals var_size_in_bytes and con_size_in_bytes with a single RegisterOrConstant formal.
Reviewed-by: twisti, jcoomes
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp Mon Jan 10 17:14:53 2011 -0500
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.cpp Tue Jan 11 17:33:21 2011 -0500
@@ -4104,7 +4104,7 @@
ld_ptr(G2_thread, in_bytes(JavaThread::tlab_start_offset()), t1);
sub(top, t1, t1); // size of tlab's allocated portion
- incr_allocated_bytes(t1, 0, t2);
+ incr_allocated_bytes(t1, t2, t3);
// refill the tlab with an eden allocation
bind(do_refill);
@@ -4138,19 +4138,14 @@
delayed()->nop();
}
-void MacroAssembler::incr_allocated_bytes(Register var_size_in_bytes,
- int con_size_in_bytes,
- Register t1) {
+void MacroAssembler::incr_allocated_bytes(RegisterOrConstant size_in_bytes,
+ Register t1, Register t2) {
// Bump total bytes allocated by this thread
assert(t1->is_global(), "must be global reg"); // so all 64 bits are saved on a context switch
- assert_different_registers(var_size_in_bytes, t1);
+ assert_different_registers(size_in_bytes.register_or_noreg(), t1, t2);
// v8 support has gone the way of the dodo
ldx(G2_thread, in_bytes(JavaThread::allocated_bytes_offset()), t1);
- if (var_size_in_bytes->is_valid()) {
- add(t1, var_size_in_bytes, t1);
- } else {
- add(t1, con_size_in_bytes, t1);
- }
+ add(t1, ensure_simm13_or_reg(size_in_bytes, t2), t1);
stx(t1, G2_thread, in_bytes(JavaThread::allocated_bytes_offset()));
}
--- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Mon Jan 10 17:14:53 2011 -0500
+++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Tue Jan 11 17:33:21 2011 -0500
@@ -2389,7 +2389,8 @@
Label& slow_case // continuation point if fast allocation fails
);
void tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case);
- void incr_allocated_bytes(Register var_size_in_bytes, int con_size_in_bytes, Register t1);
+ void incr_allocated_bytes(RegisterOrConstant size_in_bytes,
+ Register t1, Register t2);
// interface method calling
void lookup_interface_method(Register recv_klass,
--- a/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Mon Jan 10 17:14:53 2011 -0500
+++ b/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Tue Jan 11 17:33:21 2011 -0500
@@ -170,11 +170,13 @@
Register t2, // temp register
Label& slow_case // continuation point if fast allocation fails
) {
+ RegisterOrConstant size_in_bytes = var_size_in_bytes->is_valid()
+ ? RegisterOrConstant(var_size_in_bytes) : RegisterOrConstant(con_size_in_bytes);
if (UseTLAB) {
tlab_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, slow_case);
} else {
eden_allocate(obj, var_size_in_bytes, con_size_in_bytes, t1, t2, slow_case);
- incr_allocated_bytes(var_size_in_bytes, con_size_in_bytes, t1);
+ incr_allocated_bytes(size_in_bytes, t1, t2);
}
}
--- a/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Mon Jan 10 17:14:53 2011 -0500
+++ b/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Tue Jan 11 17:33:21 2011 -0500
@@ -461,7 +461,7 @@
// get the instance size
__ ld(G5_klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes(), G1_obj_size);
__ eden_allocate(O0_obj, G1_obj_size, 0, G3_t1, G4_t2, slow_path);
- __ incr_allocated_bytes(G1_obj_size, 0, G3_t1);
+ __ incr_allocated_bytes(G1_obj_size, G3_t1, G4_t2);
__ initialize_object(O0_obj, G5_klass, G1_obj_size, 0, G3_t1, G4_t2);
__ verify_oop(O0_obj);
@@ -577,7 +577,7 @@
__ and3(G1_arr_size, ~MinObjAlignmentInBytesMask, G1_arr_size);
__ eden_allocate(O0_obj, G1_arr_size, 0, G3_t1, O1_t2, slow_path); // preserves G1_arr_size
- __ incr_allocated_bytes(G1_arr_size, 0, G3_t1);
+ __ incr_allocated_bytes(G1_arr_size, G3_t1, O1_t2);
__ initialize_header(O0_obj, G5_klass, G4_length, G3_t1, O1_t2);
__ ldub(klass_lh, G3_t1, klass_lh_header_size_offset);
--- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Mon Jan 10 17:14:53 2011 -0500
+++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Tue Jan 11 17:33:21 2011 -0500
@@ -3447,7 +3447,8 @@
__ delayed()->nop();
// bump total bytes allocated by this thread
- __ incr_allocated_bytes(Roffset, 0, G1_scratch);
+ // RoldTopValue and RtopAddr are dead, so can use G1 and G3
+ __ incr_allocated_bytes(Roffset, G1_scratch, G3_scratch);
}
if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {