OLD | NEW |
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 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 Label ok; | 498 Label ok; |
499 testl(result, result); | 499 testl(result, result); |
500 j(not_zero, &ok, Label::kNear); | 500 j(not_zero, &ok, Label::kNear); |
501 testl(op, op); | 501 testl(op, op); |
502 j(sign, then_label); | 502 j(sign, then_label); |
503 bind(&ok); | 503 bind(&ok); |
504 } | 504 } |
505 | 505 |
506 | 506 |
507 void MacroAssembler::Abort(BailoutReason reason) { | 507 void MacroAssembler::Abort(BailoutReason reason) { |
508 // We want to pass the msg string like a smi to avoid GC | 508 #ifdef DEBUG |
509 // problems, however msg is not guaranteed to be aligned | |
510 // properly. Instead, we pass an aligned pointer that is | |
511 // a proper v8 smi, but also pass the alignment difference | |
512 // from the real pointer as a smi. | |
513 const char* msg = GetBailoutReason(reason); | 509 const char* msg = GetBailoutReason(reason); |
514 intptr_t p1 = reinterpret_cast<intptr_t>(msg); | |
515 intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag; | |
516 // Note: p0 might not be a valid Smi _value_, but it has a valid Smi tag. | |
517 ASSERT(reinterpret_cast<Object*>(p0)->IsSmi()); | |
518 #ifdef DEBUG | |
519 if (msg != NULL) { | 510 if (msg != NULL) { |
520 RecordComment("Abort message: "); | 511 RecordComment("Abort message: "); |
521 RecordComment(msg); | 512 RecordComment(msg); |
522 } | 513 } |
523 | 514 |
524 if (FLAG_trap_on_abort) { | 515 if (FLAG_trap_on_abort) { |
525 int3(); | 516 int3(); |
526 return; | 517 return; |
527 } | 518 } |
528 #endif | 519 #endif |
529 | 520 |
530 push(rax); | 521 push(rax); |
531 Move(kScratchRegister, reinterpret_cast<Smi*>(p0), | 522 Move(kScratchRegister, Smi::FromInt(static_cast<int>(reason)), |
532 Assembler::RelocInfoNone()); | |
533 push(kScratchRegister); | |
534 Move(kScratchRegister, Smi::FromInt(static_cast<int>(p1 - p0)), | |
535 Assembler::RelocInfoNone()); | 523 Assembler::RelocInfoNone()); |
536 push(kScratchRegister); | 524 push(kScratchRegister); |
537 | 525 |
538 if (!has_frame_) { | 526 if (!has_frame_) { |
539 // We don't actually want to generate a pile of code for this, so just | 527 // We don't actually want to generate a pile of code for this, so just |
540 // claim there is a stack frame, without generating one. | 528 // claim there is a stack frame, without generating one. |
541 FrameScope scope(this, StackFrame::NONE); | 529 FrameScope scope(this, StackFrame::NONE); |
542 CallRuntime(Runtime::kAbort, 2); | 530 CallRuntime(Runtime::kAbort, 1); |
543 } else { | 531 } else { |
544 CallRuntime(Runtime::kAbort, 2); | 532 CallRuntime(Runtime::kAbort, 1); |
545 } | 533 } |
546 // Control will not return here. | 534 // Control will not return here. |
547 int3(); | 535 int3(); |
548 } | 536 } |
549 | 537 |
550 | 538 |
551 void MacroAssembler::CallStub(CodeStub* stub, TypeFeedbackId ast_id) { | 539 void MacroAssembler::CallStub(CodeStub* stub, TypeFeedbackId ast_id) { |
552 ASSERT(AllowThisStubCall(stub)); // Calls are not allowed in some stubs | 540 ASSERT(AllowThisStubCall(stub)); // Calls are not allowed in some stubs |
553 Call(stub->GetCode(isolate()), RelocInfo::CODE_TARGET, ast_id); | 541 Call(stub->GetCode(isolate()), RelocInfo::CODE_TARGET, ast_id); |
554 } | 542 } |
(...skipping 4465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5020 j(equal, found); | 5008 j(equal, found); |
5021 movp(current, FieldOperand(current, Map::kPrototypeOffset)); | 5009 movp(current, FieldOperand(current, Map::kPrototypeOffset)); |
5022 CompareRoot(current, Heap::kNullValueRootIndex); | 5010 CompareRoot(current, Heap::kNullValueRootIndex); |
5023 j(not_equal, &loop_again); | 5011 j(not_equal, &loop_again); |
5024 } | 5012 } |
5025 | 5013 |
5026 | 5014 |
5027 } } // namespace v8::internal | 5015 } } // namespace v8::internal |
5028 | 5016 |
5029 #endif // V8_TARGET_ARCH_X64 | 5017 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |