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

Side by Side Diff: src/arm/lithium-codegen-arm.cc

Issue 14371005: Various improvements regarding the way we print code code comments. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 } 257 }
258 258
259 259
260 bool LCodeGen::GenerateBody() { 260 bool LCodeGen::GenerateBody() {
261 ASSERT(is_generating()); 261 ASSERT(is_generating());
262 bool emit_instructions = true; 262 bool emit_instructions = true;
263 for (current_instruction_ = 0; 263 for (current_instruction_ = 0;
264 !is_aborted() && current_instruction_ < instructions_->length(); 264 !is_aborted() && current_instruction_ < instructions_->length();
265 current_instruction_++) { 265 current_instruction_++) {
266 LInstruction* instr = instructions_->at(current_instruction_); 266 LInstruction* instr = instructions_->at(current_instruction_);
267
268 // Don't emit code for basic blocks with a replacement.
267 if (instr->IsLabel()) { 269 if (instr->IsLabel()) {
268 LLabel* label = LLabel::cast(instr); 270 emit_instructions = !LLabel::cast(instr)->HasReplacement();
269 emit_instructions = !label->HasReplacement(); 271 }
272 if (!emit_instructions) continue;
273
274 if (FLAG_code_comments && instr->HasInterestingComment(this)) {
275 Comment(";;; <%d,%d> %s",
276 current_instruction_,
277 instr->hydrogen_value()->id(),
278 instr->Mnemonic());
270 } 279 }
271 280
272 if (emit_instructions) { 281 instr->CompileToNative(this);
273 if (FLAG_code_comments) {
274 HValue* hydrogen = instr->hydrogen_value();
275 if (hydrogen != NULL) {
276 if (hydrogen->IsChange()) {
277 HValue* changed_value = HChange::cast(hydrogen)->value();
278 int use_id = 0;
279 const char* use_mnemo = "dead";
280 if (hydrogen->UseCount() >= 1) {
281 HValue* use_value = hydrogen->uses().value();
282 use_id = use_value->id();
283 use_mnemo = use_value->Mnemonic();
284 }
285 Comment(";;; @%d: %s. <of #%d %s for #%d %s>",
286 current_instruction_, instr->Mnemonic(),
287 changed_value->id(), changed_value->Mnemonic(),
288 use_id, use_mnemo);
289 } else {
290 Comment(";;; @%d: %s. <#%d>", current_instruction_,
291 instr->Mnemonic(), hydrogen->id());
292 }
293 } else {
294 Comment(";;; @%d: %s.", current_instruction_, instr->Mnemonic());
295 }
296 }
297 instr->CompileToNative(this);
298 }
299 } 282 }
300 EnsureSpaceForLazyDeopt(); 283 EnsureSpaceForLazyDeopt();
301 return !is_aborted(); 284 return !is_aborted();
302 } 285 }
303 286
304 287
305 bool LCodeGen::GenerateDeferredCode() { 288 bool LCodeGen::GenerateDeferredCode() {
306 ASSERT(is_generating()); 289 ASSERT(is_generating());
307 if (deferred_.length() > 0) { 290 if (deferred_.length() > 0) {
308 for (int i = 0; !is_aborted() && i < deferred_.length(); i++) { 291 for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
309 LDeferredCode* code = deferred_[i]; 292 LDeferredCode* code = deferred_[i];
293 Comment(";;; <%d,%d> "
294 "-------------------- Deferred %s --------------------",
295 code->instruction_index(),
296 code->instr()->hydrogen_value()->id(),
297 code->instr()->Mnemonic());
310 __ bind(code->entry()); 298 __ bind(code->entry());
311 if (NeedsDeferredFrame()) { 299 if (NeedsDeferredFrame()) {
312 Comment(";;; Deferred build frame @%d: %s.", 300 Comment(";;; Build frame");
313 code->instruction_index(),
314 code->instr()->Mnemonic());
315 ASSERT(!frame_is_built_); 301 ASSERT(!frame_is_built_);
316 ASSERT(info()->IsStub()); 302 ASSERT(info()->IsStub());
317 frame_is_built_ = true; 303 frame_is_built_ = true;
318 __ stm(db_w, sp, cp.bit() | fp.bit() | lr.bit()); 304 __ stm(db_w, sp, cp.bit() | fp.bit() | lr.bit());
319 __ mov(scratch0(), Operand(Smi::FromInt(StackFrame::STUB))); 305 __ mov(scratch0(), Operand(Smi::FromInt(StackFrame::STUB)));
320 __ push(scratch0()); 306 __ push(scratch0());
321 __ add(fp, sp, Operand(2 * kPointerSize)); 307 __ add(fp, sp, Operand(2 * kPointerSize));
308 Comment(";;; Deferred code");
322 } 309 }
323 Comment(";;; Deferred code @%d: %s.",
324 code->instruction_index(),
325 code->instr()->Mnemonic());
326 code->Generate(); 310 code->Generate();
327 if (NeedsDeferredFrame()) { 311 if (NeedsDeferredFrame()) {
328 Comment(";;; Deferred destroy frame @%d: %s.", 312 Comment(";;; Destroy frame");
329 code->instruction_index(),
330 code->instr()->Mnemonic());
331 ASSERT(frame_is_built_); 313 ASSERT(frame_is_built_);
332 __ pop(ip); 314 __ pop(ip);
333 __ ldm(ia_w, sp, cp.bit() | fp.bit() | lr.bit()); 315 __ ldm(ia_w, sp, cp.bit() | fp.bit() | lr.bit());
334 frame_is_built_ = false; 316 frame_is_built_ = false;
335 } 317 }
336 __ jmp(code->exit()); 318 __ jmp(code->exit());
337 } 319 }
338 } 320 }
339 321
340 // Force constant pool emission at the end of the deferred code to make 322 // Force constant pool emission at the end of the deferred code to make
(...skipping 10 matching lines...) Expand all
351 // immediate of a branch instruction. 333 // immediate of a branch instruction.
352 // To simplify we consider the code size from the first instruction to the 334 // To simplify we consider the code size from the first instruction to the
353 // end of the jump table. We also don't consider the pc load delta. 335 // end of the jump table. We also don't consider the pc load delta.
354 // Each entry in the jump table generates one instruction and inlines one 336 // Each entry in the jump table generates one instruction and inlines one
355 // 32bit data after it. 337 // 32bit data after it.
356 if (!is_int24((masm()->pc_offset() / Assembler::kInstrSize) + 338 if (!is_int24((masm()->pc_offset() / Assembler::kInstrSize) +
357 deopt_jump_table_.length() * 7)) { 339 deopt_jump_table_.length() * 7)) {
358 Abort("Generated code is too large"); 340 Abort("Generated code is too large");
359 } 341 }
360 342
361 __ RecordComment("[ Deoptimisation jump table"); 343 if (deopt_jump_table_.length() > 0) {
344 Comment(";;; -------------------- Jump table --------------------");
345 }
362 Label table_start; 346 Label table_start;
363 __ bind(&table_start); 347 __ bind(&table_start);
364 Label needs_frame_not_call; 348 Label needs_frame_not_call;
365 Label needs_frame_is_call; 349 Label needs_frame_is_call;
366 for (int i = 0; i < deopt_jump_table_.length(); i++) { 350 for (int i = 0; i < deopt_jump_table_.length(); i++) {
367 __ bind(&deopt_jump_table_[i].label); 351 __ bind(&deopt_jump_table_[i].label);
368 Address entry = deopt_jump_table_[i].address; 352 Address entry = deopt_jump_table_[i].address;
369 bool is_lazy_deopt = deopt_jump_table_[i].is_lazy_deopt; 353 bool is_lazy_deopt = deopt_jump_table_[i].is_lazy_deopt;
370 Deoptimizer::BailoutType type = 354 Deoptimizer::BailoutType type =
371 is_lazy_deopt ? Deoptimizer::LAZY : Deoptimizer::EAGER; 355 is_lazy_deopt ? Deoptimizer::LAZY : Deoptimizer::EAGER;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 } else { 396 } else {
413 if (is_lazy_deopt) { 397 if (is_lazy_deopt) {
414 __ mov(lr, Operand(pc), LeaveCC, al); 398 __ mov(lr, Operand(pc), LeaveCC, al);
415 __ mov(pc, Operand(ExternalReference::ForDeoptEntry(entry))); 399 __ mov(pc, Operand(ExternalReference::ForDeoptEntry(entry)));
416 } else { 400 } else {
417 __ mov(pc, Operand(ExternalReference::ForDeoptEntry(entry))); 401 __ mov(pc, Operand(ExternalReference::ForDeoptEntry(entry)));
418 } 402 }
419 } 403 }
420 masm()->CheckConstPool(false, false); 404 masm()->CheckConstPool(false, false);
421 } 405 }
422 __ RecordComment("]");
423 406
424 // Force constant pool emission at the end of the deopt jump table to make 407 // Force constant pool emission at the end of the deopt jump table to make
425 // sure that no constant pools are emitted after. 408 // sure that no constant pools are emitted after.
426 masm()->CheckConstPool(true, false); 409 masm()->CheckConstPool(true, false);
427 410
428 // The deoptimization jump table is the last part of the instruction 411 // The deoptimization jump table is the last part of the instruction
429 // sequence. Mark the generated code as done unless we bailed out. 412 // sequence. Mark the generated code as done unless we bailed out.
430 if (!is_aborted()) status_ = DONE; 413 if (!is_aborted()) status_ = DONE;
431 return !is_aborted(); 414 return !is_aborted();
432 } 415 }
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode); 1023 pointers, Safepoint::kWithRegistersAndDoubles, arguments, deopt_mode);
1041 } 1024 }
1042 1025
1043 1026
1044 void LCodeGen::RecordPosition(int position) { 1027 void LCodeGen::RecordPosition(int position) {
1045 if (position == RelocInfo::kNoPosition) return; 1028 if (position == RelocInfo::kNoPosition) return;
1046 masm()->positions_recorder()->RecordPosition(position); 1029 masm()->positions_recorder()->RecordPosition(position);
1047 } 1030 }
1048 1031
1049 1032
1033 static const char* LabelType(LLabel* label) {
1034 if (label->is_loop_header()) return " (loop header)";
1035 if (label->is_osr_entry()) return " (OSR entry)";
1036 return "";
1037 }
1038
1039
1050 void LCodeGen::DoLabel(LLabel* label) { 1040 void LCodeGen::DoLabel(LLabel* label) {
1051 Comment(";;; -------------------- B%d%s --------------------", 1041 Comment(";;; <%d,%d> -------------------- B%d%s --------------------",
1042 current_instruction_,
1043 label->hydrogen_value()->id(),
1052 label->block_id(), 1044 label->block_id(),
1053 label->is_loop_header() ? " (loop header)" : ""); 1045 LabelType(label));
1054 __ bind(label->label()); 1046 __ bind(label->label());
1055 current_block_ = label->block_id(); 1047 current_block_ = label->block_id();
1056 DoGap(label); 1048 DoGap(label);
1057 } 1049 }
1058 1050
1059 1051
1060 void LCodeGen::DoParallelMove(LParallelMove* move) { 1052 void LCodeGen::DoParallelMove(LParallelMove* move) {
1061 resolver_.Resolve(move); 1053 resolver_.Resolve(move);
1062 } 1054 }
1063 1055
(...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after
2168 2160
2169 BinaryOpStub stub(instr->op(), NO_OVERWRITE); 2161 BinaryOpStub stub(instr->op(), NO_OVERWRITE);
2170 // Block literal pool emission to ensure nop indicating no inlined smi code 2162 // Block literal pool emission to ensure nop indicating no inlined smi code
2171 // is in the correct position. 2163 // is in the correct position.
2172 Assembler::BlockConstPoolScope block_const_pool(masm()); 2164 Assembler::BlockConstPoolScope block_const_pool(masm());
2173 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); 2165 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
2174 __ nop(); // Signals no inlined code. 2166 __ nop(); // Signals no inlined code.
2175 } 2167 }
2176 2168
2177 2169
2178 int LCodeGen::GetNextEmittedBlock() { 2170 int LCodeGen::GetNextEmittedBlock() const {
2179 for (int i = current_block_ + 1; i < graph()->blocks()->length(); ++i) { 2171 for (int i = current_block_ + 1; i < graph()->blocks()->length(); ++i) {
2180 if (!chunk_->GetLabel(i)->HasReplacement()) return i; 2172 if (!chunk_->GetLabel(i)->HasReplacement()) return i;
2181 } 2173 }
2182 return -1; 2174 return -1;
2183 } 2175 }
2184 2176
2185 2177
2186 void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) { 2178 void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) {
2187 int next_block = GetNextEmittedBlock(); 2179 int next_block = GetNextEmittedBlock();
2188 right_block = chunk_->LookupDestination(right_block); 2180 right_block = chunk_->LookupDestination(right_block);
(...skipping 3809 matching lines...) Expand 10 before | Expand all | Expand 10 after
5998 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); 5990 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize));
5999 __ ldr(result, FieldMemOperand(scratch, 5991 __ ldr(result, FieldMemOperand(scratch,
6000 FixedArray::kHeaderSize - kPointerSize)); 5992 FixedArray::kHeaderSize - kPointerSize));
6001 __ bind(&done); 5993 __ bind(&done);
6002 } 5994 }
6003 5995
6004 5996
6005 #undef __ 5997 #undef __
6006 5998
6007 } } // namespace v8::internal 5999 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698