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 }
|