< prev index next >

src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp

Print this page

 36 #include "runtime/os.hpp"
 37 #include "runtime/sharedRuntime.hpp"
 38 #include "runtime/stubRoutines.hpp"
 39 #include "utilities/powerOfTwo.hpp"
 40 
 41 // Note: Rtemp usage is this file should not impact C2 and should be
 42 // correct as long as it is not implicitly used in lower layers (the
 43 // arm [macro]assembler) and used with care in the other C1 specific
 44 // files.
 45 
 46 void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
 47   Label verified;
 48   load_klass(Rtemp, receiver);
 49   cmp(Rtemp, iCache);
 50   b(verified, eq); // jump over alignment no-ops
 51   jump(SharedRuntime::get_ic_miss_stub(), relocInfo::runtime_call_type);
 52   align(CodeEntryAlignment);
 53   bind(verified);
 54 }
 55 
 56 void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes) {
 57   assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
 58   assert((frame_size_in_bytes % StackAlignmentInBytes) == 0, "frame size should be aligned");
 59 
 60 
 61   arm_stack_overflow_check(bang_size_in_bytes, Rtemp);
 62 
 63   // FP can no longer be used to memorize SP. It may be modified
 64   // if this method contains a methodHandle call site
 65   raw_push(FP, LR);
 66   sub_slow(SP, SP, frame_size_in_bytes);
 67 
 68   // Insert nmethod entry barrier into frame.
 69   BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
 70   bs->nmethod_entry_barrier(this);
 71 }
 72 
 73 void C1_MacroAssembler::remove_frame(int frame_size_in_bytes) {
 74   add_slow(SP, SP, frame_size_in_bytes);
 75   raw_pop(FP, LR);
 76 }

146                                         Register klass, Label& slow_case) {
147   assert_different_registers(obj, tmp1, tmp2, tmp3, klass, Rtemp);
148   assert(header_size >= 0 && object_size >= header_size, "illegal sizes");
149   const int object_size_in_bytes = object_size * BytesPerWord;
150 
151   const Register obj_end = tmp1;
152   const Register len = noreg;
153 
154   if (Assembler::is_arith_imm_in_range(object_size_in_bytes)) {
155     try_allocate(obj, obj_end, tmp2, tmp3, object_size_in_bytes, slow_case);
156   } else {
157     // Rtemp should be free at c1 LIR level
158     mov_slow(Rtemp, object_size_in_bytes);
159     try_allocate(obj, obj_end, tmp2, tmp3, Rtemp, slow_case);
160   }
161   initialize_object(obj, obj_end, klass, len, tmp2, tmp3, instanceOopDesc::header_size() * HeapWordSize, object_size_in_bytes, /* is_tlab_allocated */ UseTLAB);
162 }
163 
164 void C1_MacroAssembler::allocate_array(Register obj, Register len,
165                                        Register tmp1, Register tmp2, Register tmp3,
166                                        int header_size, int element_size,
167                                        Register klass, Label& slow_case) {
168   assert_different_registers(obj, len, tmp1, tmp2, tmp3, klass, Rtemp);
169   const int header_size_in_bytes = header_size * BytesPerWord;
170   const int scale_shift = exact_log2(element_size);
171   const Register obj_size = Rtemp; // Rtemp should be free at c1 LIR level
172 
173   cmp_32(len, max_array_allocation_length);
174   b(slow_case, hs);
175 
176   bool align_header = ((header_size_in_bytes | element_size) & MinObjAlignmentInBytesMask) != 0;
177   assert(align_header || ((header_size_in_bytes & MinObjAlignmentInBytesMask) == 0), "must be");
178   assert(align_header || ((element_size & MinObjAlignmentInBytesMask) == 0), "must be");
179 
180   mov(obj_size, header_size_in_bytes + (align_header ? (MinObjAlignmentInBytes - 1) : 0));
181   add_ptr_scaled_int32(obj_size, obj_size, len, scale_shift);
182 
183   if (align_header) {
184     align_reg(obj_size, obj_size, MinObjAlignmentInBytes);
185   }
186 
187   try_allocate(obj, tmp1, tmp2, tmp3, obj_size, slow_case);
188   initialize_object(obj, tmp1, klass, len, tmp2, tmp3, header_size_in_bytes, -1, /* is_tlab_allocated */ UseTLAB);
189 }

 36 #include "runtime/os.hpp"
 37 #include "runtime/sharedRuntime.hpp"
 38 #include "runtime/stubRoutines.hpp"
 39 #include "utilities/powerOfTwo.hpp"
 40 
 41 // Note: Rtemp usage is this file should not impact C2 and should be
 42 // correct as long as it is not implicitly used in lower layers (the
 43 // arm [macro]assembler) and used with care in the other C1 specific
 44 // files.
 45 
 46 void C1_MacroAssembler::inline_cache_check(Register receiver, Register iCache) {
 47   Label verified;
 48   load_klass(Rtemp, receiver);
 49   cmp(Rtemp, iCache);
 50   b(verified, eq); // jump over alignment no-ops
 51   jump(SharedRuntime::get_ic_miss_stub(), relocInfo::runtime_call_type);
 52   align(CodeEntryAlignment);
 53   bind(verified);
 54 }
 55 
 56 void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes, int max_monitors) {
 57   assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
 58   assert((frame_size_in_bytes % StackAlignmentInBytes) == 0, "frame size should be aligned");
 59 
 60 
 61   arm_stack_overflow_check(bang_size_in_bytes, Rtemp);
 62 
 63   // FP can no longer be used to memorize SP. It may be modified
 64   // if this method contains a methodHandle call site
 65   raw_push(FP, LR);
 66   sub_slow(SP, SP, frame_size_in_bytes);
 67 
 68   // Insert nmethod entry barrier into frame.
 69   BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
 70   bs->nmethod_entry_barrier(this);
 71 }
 72 
 73 void C1_MacroAssembler::remove_frame(int frame_size_in_bytes) {
 74   add_slow(SP, SP, frame_size_in_bytes);
 75   raw_pop(FP, LR);
 76 }

146                                         Register klass, Label& slow_case) {
147   assert_different_registers(obj, tmp1, tmp2, tmp3, klass, Rtemp);
148   assert(header_size >= 0 && object_size >= header_size, "illegal sizes");
149   const int object_size_in_bytes = object_size * BytesPerWord;
150 
151   const Register obj_end = tmp1;
152   const Register len = noreg;
153 
154   if (Assembler::is_arith_imm_in_range(object_size_in_bytes)) {
155     try_allocate(obj, obj_end, tmp2, tmp3, object_size_in_bytes, slow_case);
156   } else {
157     // Rtemp should be free at c1 LIR level
158     mov_slow(Rtemp, object_size_in_bytes);
159     try_allocate(obj, obj_end, tmp2, tmp3, Rtemp, slow_case);
160   }
161   initialize_object(obj, obj_end, klass, len, tmp2, tmp3, instanceOopDesc::header_size() * HeapWordSize, object_size_in_bytes, /* is_tlab_allocated */ UseTLAB);
162 }
163 
164 void C1_MacroAssembler::allocate_array(Register obj, Register len,
165                                        Register tmp1, Register tmp2, Register tmp3,
166                                        int header_size_in_bytes, int element_size,
167                                        Register klass, Label& slow_case) {
168   assert_different_registers(obj, len, tmp1, tmp2, tmp3, klass, Rtemp);

169   const int scale_shift = exact_log2(element_size);
170   const Register obj_size = Rtemp; // Rtemp should be free at c1 LIR level
171 
172   cmp_32(len, max_array_allocation_length);
173   b(slow_case, hs);
174 
175   bool align_header = ((header_size_in_bytes | element_size) & MinObjAlignmentInBytesMask) != 0;
176   assert(align_header || ((header_size_in_bytes & MinObjAlignmentInBytesMask) == 0), "must be");
177   assert(align_header || ((element_size & MinObjAlignmentInBytesMask) == 0), "must be");
178 
179   mov(obj_size, header_size_in_bytes + (align_header ? (MinObjAlignmentInBytes - 1) : 0));
180   add_ptr_scaled_int32(obj_size, obj_size, len, scale_shift);
181 
182   if (align_header) {
183     align_reg(obj_size, obj_size, MinObjAlignmentInBytes);
184   }
185 
186   try_allocate(obj, tmp1, tmp2, tmp3, obj_size, slow_case);
187   initialize_object(obj, tmp1, klass, len, tmp2, tmp3, header_size_in_bytes, -1, /* is_tlab_allocated */ UseTLAB);
188 }
< prev index next >