Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/mips/assembler-mips.cc

Issue 2732273003: Disentangle assembler from isolate. (Closed)
Patch Set: Address feedback. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips/assembler-mips.h ('k') | src/mips/assembler-mips-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 DCHECK(IsWasmMemorySizeReference(rmode_)); 203 DCHECK(IsWasmMemorySizeReference(rmode_));
204 return reinterpret_cast<uint32_t>(Assembler::target_address_at(pc_, host_)); 204 return reinterpret_cast<uint32_t>(Assembler::target_address_at(pc_, host_));
205 } 205 }
206 206
207 uint32_t RelocInfo::wasm_function_table_size_reference() { 207 uint32_t RelocInfo::wasm_function_table_size_reference() {
208 DCHECK(IsWasmFunctionTableSizeReference(rmode_)); 208 DCHECK(IsWasmFunctionTableSizeReference(rmode_));
209 return reinterpret_cast<uint32_t>(Assembler::target_address_at(pc_, host_)); 209 return reinterpret_cast<uint32_t>(Assembler::target_address_at(pc_, host_));
210 } 210 }
211 211
212 void RelocInfo::unchecked_update_wasm_memory_reference( 212 void RelocInfo::unchecked_update_wasm_memory_reference(
213 Address address, ICacheFlushMode flush_mode) { 213 Isolate* isolate, Address address, ICacheFlushMode flush_mode) {
214 Assembler::set_target_address_at(isolate_, pc_, host_, address, flush_mode); 214 Assembler::set_target_address_at(isolate, pc_, host_, address, flush_mode);
215 } 215 }
216 216
217 void RelocInfo::unchecked_update_wasm_size(uint32_t size, 217 void RelocInfo::unchecked_update_wasm_size(Isolate* isolate, uint32_t size,
218 ICacheFlushMode flush_mode) { 218 ICacheFlushMode flush_mode) {
219 Assembler::set_target_address_at(isolate_, pc_, host_, 219 Assembler::set_target_address_at(isolate, pc_, host_,
220 reinterpret_cast<Address>(size), flush_mode); 220 reinterpret_cast<Address>(size), flush_mode);
221 } 221 }
222 222
223 // ----------------------------------------------------------------------------- 223 // -----------------------------------------------------------------------------
224 // Implementation of Operand and MemOperand. 224 // Implementation of Operand and MemOperand.
225 // See assembler-mips-inl.h for inlined constructors. 225 // See assembler-mips-inl.h for inlined constructors.
226 226
227 Operand::Operand(Handle<Object> handle) { 227 Operand::Operand(Handle<Object> handle) {
228 AllowDeferredHandleDereference using_raw_address; 228 AllowDeferredHandleDereference using_raw_address;
229 rm_ = no_reg; 229 rm_ = no_reg;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 (kNegOffset & kImm16Mask); // NOLINT 281 (kNegOffset & kImm16Mask); // NOLINT
282 282
283 const Instr kSwRegFpNegOffsetPattern = SW | (Register::kCode_fp << kRsShift) | 283 const Instr kSwRegFpNegOffsetPattern = SW | (Register::kCode_fp << kRsShift) |
284 (kNegOffset & kImm16Mask); // NOLINT 284 (kNegOffset & kImm16Mask); // NOLINT
285 // A mask for the Rt register for push, pop, lw, sw instructions. 285 // A mask for the Rt register for push, pop, lw, sw instructions.
286 const Instr kRtMask = kRtFieldMask; 286 const Instr kRtMask = kRtFieldMask;
287 const Instr kLwSwInstrTypeMask = 0xffe00000; 287 const Instr kLwSwInstrTypeMask = 0xffe00000;
288 const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask; 288 const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask;
289 const Instr kLwSwOffsetMask = kImm16Mask; 289 const Instr kLwSwOffsetMask = kImm16Mask;
290 290
291 Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 291 Assembler::Assembler(IsolateData isolate_data, void* buffer, int buffer_size)
292 : AssemblerBase(isolate, buffer, buffer_size), 292 : AssemblerBase(isolate_data, buffer, buffer_size),
293 recorded_ast_id_(TypeFeedbackId::None()) { 293 recorded_ast_id_(TypeFeedbackId::None()) {
294 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 294 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
295 295
296 last_trampoline_pool_end_ = 0; 296 last_trampoline_pool_end_ = 0;
297 no_trampoline_pool_before_ = 0; 297 no_trampoline_pool_before_ = 0;
298 trampoline_pool_blocked_nesting_ = 0; 298 trampoline_pool_blocked_nesting_ = 0;
299 // We leave space (16 * kTrampolineSlotsSize) 299 // We leave space (16 * kTrampolineSlotsSize)
300 // for BlockTrampolinePoolScope buffer. 300 // for BlockTrampolinePoolScope buffer.
301 next_buffer_check_ = FLAG_force_long_branches 301 next_buffer_check_ = FLAG_force_long_branches
302 ? kMaxInt : kMaxBranchOffset - kTrampolineSlotsSize * 16; 302 ? kMaxInt : kMaxBranchOffset - kTrampolineSlotsSize * 16;
(...skipping 2774 matching lines...) Expand 10 before | Expand all | Expand 10 after
3077 unbound_labels_count_++; 3077 unbound_labels_count_++;
3078 internal_reference_positions_.insert(label->pos()); 3078 internal_reference_positions_.insert(label->pos());
3079 } 3079 }
3080 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE); 3080 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
3081 EmitHelper(data); 3081 EmitHelper(data);
3082 } 3082 }
3083 3083
3084 3084
3085 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 3085 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
3086 // We do not try to reuse pool constants. 3086 // We do not try to reuse pool constants.
3087 RelocInfo rinfo(isolate(), pc_, rmode, data, NULL); 3087 RelocInfo rinfo(pc_, rmode, data, NULL);
3088 if (rmode >= RelocInfo::COMMENT && 3088 if (rmode >= RelocInfo::COMMENT &&
3089 rmode <= RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL) { 3089 rmode <= RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL) {
3090 // Adjust code for new modes. 3090 // Adjust code for new modes.
3091 DCHECK(RelocInfo::IsDebugBreakSlot(rmode) || RelocInfo::IsComment(rmode)); 3091 DCHECK(RelocInfo::IsDebugBreakSlot(rmode) || RelocInfo::IsComment(rmode));
3092 // These modes do not need an entry in the constant pool. 3092 // These modes do not need an entry in the constant pool.
3093 } 3093 }
3094 if (!RelocInfo::IsNone(rinfo.rmode())) { 3094 if (!RelocInfo::IsNone(rinfo.rmode())) {
3095 // Don't record external references unless the heap will be serialized. 3095 // Don't record external references unless the heap will be serialized.
3096 if (rmode == RelocInfo::EXTERNAL_REFERENCE && 3096 if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
3097 !serializer_enabled() && !emit_debug_code()) { 3097 !serializer_enabled() && !emit_debug_code()) {
3098 return; 3098 return;
3099 } 3099 }
3100 DCHECK(buffer_space() >= kMaxRelocSize); // Too late to grow buffer here. 3100 DCHECK(buffer_space() >= kMaxRelocSize); // Too late to grow buffer here.
3101 if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 3101 if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
3102 RelocInfo reloc_info_with_ast_id(isolate(), pc_, rmode, 3102 RelocInfo reloc_info_with_ast_id(pc_, rmode, RecordedAstId().ToInt(),
3103 RecordedAstId().ToInt(), NULL); 3103 NULL);
3104 ClearRecordedAstId(); 3104 ClearRecordedAstId();
3105 reloc_info_writer.Write(&reloc_info_with_ast_id); 3105 reloc_info_writer.Write(&reloc_info_with_ast_id);
3106 } else { 3106 } else {
3107 reloc_info_writer.Write(&rinfo); 3107 reloc_info_writer.Write(&rinfo);
3108 } 3108 }
3109 } 3109 }
3110 } 3110 }
3111 3111
3112 3112
3113 void Assembler::BlockTrampolinePoolFor(int instructions) { 3113 void Assembler::BlockTrampolinePoolFor(int instructions) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3231 // Patching the address must replace both instr, and flush the i-cache. 3231 // Patching the address must replace both instr, and flush the i-cache.
3232 // On r6, target address is stored in a lui/jic pair, and both instr have to be 3232 // On r6, target address is stored in a lui/jic pair, and both instr have to be
3233 // patched. 3233 // patched.
3234 // 3234 //
3235 // There is an optimization below, which emits a nop when the address 3235 // There is an optimization below, which emits a nop when the address
3236 // fits in just 16 bits. This is unlikely to help, and should be benchmarked, 3236 // fits in just 16 bits. This is unlikely to help, and should be benchmarked,
3237 // and possibly removed. 3237 // and possibly removed.
3238 void Assembler::set_target_address_at(Isolate* isolate, Address pc, 3238 void Assembler::set_target_address_at(Isolate* isolate, Address pc,
3239 Address target, 3239 Address target,
3240 ICacheFlushMode icache_flush_mode) { 3240 ICacheFlushMode icache_flush_mode) {
3241 DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH);
3242
3241 Instr instr2 = instr_at(pc + kInstrSize); 3243 Instr instr2 = instr_at(pc + kInstrSize);
3242 uint32_t rt_code = GetRtField(instr2); 3244 uint32_t rt_code = GetRtField(instr2);
3243 uint32_t* p = reinterpret_cast<uint32_t*>(pc); 3245 uint32_t* p = reinterpret_cast<uint32_t*>(pc);
3244 uint32_t itarget = reinterpret_cast<uint32_t>(target); 3246 uint32_t itarget = reinterpret_cast<uint32_t>(target);
3245 3247
3246 #ifdef DEBUG 3248 #ifdef DEBUG
3247 // Check we have the result from a li macro-instruction, using instr pair. 3249 // Check we have the result from a li macro-instruction, using instr pair.
3248 Instr instr1 = instr_at(pc); 3250 Instr instr1 = instr_at(pc);
3249 CHECK(IsLui(instr1) && (IsOri(instr2) || IsJicOrJialc(instr2))); 3251 CHECK(IsLui(instr1) && (IsOri(instr2) || IsJicOrJialc(instr2)));
3250 #endif 3252 #endif
(...skipping 19 matching lines...) Expand all
3270 3272
3271 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 3273 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
3272 Assembler::FlushICache(isolate, pc, 2 * sizeof(int32_t)); 3274 Assembler::FlushICache(isolate, pc, 2 * sizeof(int32_t));
3273 } 3275 }
3274 } 3276 }
3275 3277
3276 } // namespace internal 3278 } // namespace internal
3277 } // namespace v8 3279 } // namespace v8
3278 3280
3279 #endif // V8_TARGET_ARCH_MIPS 3281 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/assembler-mips.h ('k') | src/mips/assembler-mips-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698