Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 680 } else { | 680 } else { |
| 681 ASSERT(!scratch.is(result_end)); | 681 ASSERT(!scratch.is(result_end)); |
| 682 mov(Operand(scratch), Immediate(new_space_allocation_top)); | 682 mov(Operand(scratch), Immediate(new_space_allocation_top)); |
| 683 mov(result, Operand(scratch, 0)); | 683 mov(result, Operand(scratch, 0)); |
| 684 } | 684 } |
| 685 } | 685 } |
| 686 | 686 |
| 687 | 687 |
| 688 void MacroAssembler::UpdateAllocationTopHelper(Register result_end, | 688 void MacroAssembler::UpdateAllocationTopHelper(Register result_end, |
| 689 Register scratch) { | 689 Register scratch) { |
| 690 #ifdef DEBUG | |
|
Mads Ager (chromium)
2009/12/04 07:33:12
Please use the flag debug_code, so that we only ge
Søren Thygesen Gjesse
2009/12/04 07:57:22
Done.
| |
| 691 test(result_end, Immediate(kObjectAlignmentMask)); | |
| 692 Check(zero, "Unaligned allocation in new space"); | |
| 693 #endif | |
| 694 | |
| 690 ExternalReference new_space_allocation_top = | 695 ExternalReference new_space_allocation_top = |
| 691 ExternalReference::new_space_allocation_top_address(); | 696 ExternalReference::new_space_allocation_top_address(); |
| 692 | 697 |
| 693 // Update new top. Use scratch if available. | 698 // Update new top. Use scratch if available. |
| 694 if (scratch.is(no_reg)) { | 699 if (scratch.is(no_reg)) { |
| 695 mov(Operand::StaticVariable(new_space_allocation_top), result_end); | 700 mov(Operand::StaticVariable(new_space_allocation_top), result_end); |
| 696 } else { | 701 } else { |
| 697 mov(Operand(scratch, 0), result_end); | 702 mov(Operand(scratch, 0), result_end); |
| 698 } | 703 } |
| 699 } | 704 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 819 Immediate(Factory::heap_number_map())); | 824 Immediate(Factory::heap_number_map())); |
| 820 } | 825 } |
| 821 | 826 |
| 822 | 827 |
| 823 void MacroAssembler::AllocateTwoByteString(Register result, | 828 void MacroAssembler::AllocateTwoByteString(Register result, |
| 824 Register length, | 829 Register length, |
| 825 Register scratch1, | 830 Register scratch1, |
| 826 Register scratch2, | 831 Register scratch2, |
| 827 Register scratch3, | 832 Register scratch3, |
| 828 Label* gc_required) { | 833 Label* gc_required) { |
| 829 // Calculate the number of words needed for the number of characters in the | 834 // Calculate the number of bytes needed for the characters in the string while |
| 830 // string | 835 // observing object alignment. |
| 836 ASSERT((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); | |
| 831 mov(scratch1, length); | 837 mov(scratch1, length); |
| 832 add(Operand(scratch1), Immediate(1)); | 838 ASSERT(kShortSize == 2); |
| 833 shr(scratch1, 1); | 839 shl(scratch1, 1); |
| 840 add(Operand(scratch1), Immediate(kObjectAlignmentMask)); | |
| 841 and_(Operand(scratch1), Immediate(~kObjectAlignmentMask)); | |
| 834 | 842 |
| 835 // Allocate two byte string in new space. | 843 // Allocate two byte string in new space. |
| 836 AllocateInNewSpace(SeqTwoByteString::kHeaderSize, | 844 AllocateInNewSpace(SeqTwoByteString::kHeaderSize, |
| 837 times_4, | 845 times_1, |
| 838 scratch1, | 846 scratch1, |
| 839 result, | 847 result, |
| 840 scratch2, | 848 scratch2, |
| 841 scratch3, | 849 scratch3, |
| 842 gc_required, | 850 gc_required, |
| 843 TAG_OBJECT); | 851 TAG_OBJECT); |
| 844 | 852 |
| 845 // Set the map, length and hash field. | 853 // Set the map, length and hash field. |
| 846 mov(FieldOperand(result, HeapObject::kMapOffset), | 854 mov(FieldOperand(result, HeapObject::kMapOffset), |
| 847 Immediate(Factory::string_map())); | 855 Immediate(Factory::string_map())); |
| 848 mov(FieldOperand(result, String::kLengthOffset), length); | 856 mov(FieldOperand(result, String::kLengthOffset), length); |
| 849 mov(FieldOperand(result, String::kHashFieldOffset), | 857 mov(FieldOperand(result, String::kHashFieldOffset), |
| 850 Immediate(String::kEmptyHashField)); | 858 Immediate(String::kEmptyHashField)); |
| 851 } | 859 } |
| 852 | 860 |
| 853 | 861 |
| 854 void MacroAssembler::AllocateAsciiString(Register result, | 862 void MacroAssembler::AllocateAsciiString(Register result, |
| 855 Register length, | 863 Register length, |
| 856 Register scratch1, | 864 Register scratch1, |
| 857 Register scratch2, | 865 Register scratch2, |
| 858 Register scratch3, | 866 Register scratch3, |
| 859 Label* gc_required) { | 867 Label* gc_required) { |
| 860 // Calculate the number of words needed for the number of characters in the | 868 // Calculate the number of bytes needed for the characters in the string while |
| 861 // string | 869 // observing object alignment. |
| 870 ASSERT((SeqAsciiString::kHeaderSize & kObjectAlignmentMask) == 0); | |
| 862 mov(scratch1, length); | 871 mov(scratch1, length); |
| 863 add(Operand(scratch1), Immediate(3)); | 872 ASSERT(kCharSize == 1); |
| 864 shr(scratch1, 2); | 873 add(Operand(scratch1), Immediate(kObjectAlignmentMask)); |
| 874 and_(Operand(scratch1), Immediate(~kObjectAlignmentMask)); | |
| 865 | 875 |
| 866 // Allocate ascii string in new space. | 876 // Allocate ascii string in new space. |
| 867 AllocateInNewSpace(SeqAsciiString::kHeaderSize, | 877 AllocateInNewSpace(SeqAsciiString::kHeaderSize, |
| 868 times_4, | 878 times_1, |
| 869 scratch1, | 879 scratch1, |
| 870 result, | 880 result, |
| 871 scratch2, | 881 scratch2, |
| 872 scratch3, | 882 scratch3, |
| 873 gc_required, | 883 gc_required, |
| 874 TAG_OBJECT); | 884 TAG_OBJECT); |
| 875 | 885 |
| 876 // Set the map, length and hash field. | 886 // Set the map, length and hash field. |
| 877 mov(FieldOperand(result, HeapObject::kMapOffset), | 887 mov(FieldOperand(result, HeapObject::kMapOffset), |
| 878 Immediate(Factory::ascii_string_map())); | 888 Immediate(Factory::ascii_string_map())); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1376 // from the real pointer as a smi. | 1386 // from the real pointer as a smi. |
| 1377 intptr_t p1 = reinterpret_cast<intptr_t>(msg); | 1387 intptr_t p1 = reinterpret_cast<intptr_t>(msg); |
| 1378 intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag; | 1388 intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag; |
| 1379 ASSERT(reinterpret_cast<Object*>(p0)->IsSmi()); | 1389 ASSERT(reinterpret_cast<Object*>(p0)->IsSmi()); |
| 1380 #ifdef DEBUG | 1390 #ifdef DEBUG |
| 1381 if (msg != NULL) { | 1391 if (msg != NULL) { |
| 1382 RecordComment("Abort message: "); | 1392 RecordComment("Abort message: "); |
| 1383 RecordComment(msg); | 1393 RecordComment(msg); |
| 1384 } | 1394 } |
| 1385 #endif | 1395 #endif |
| 1396 // Disable stub call restrictions to always allow cals to abort. | |
| 1397 set_allow_stub_calls(true); | |
| 1398 | |
| 1386 push(eax); | 1399 push(eax); |
| 1387 push(Immediate(p0)); | 1400 push(Immediate(p0)); |
| 1388 push(Immediate(reinterpret_cast<intptr_t>(Smi::FromInt(p1 - p0)))); | 1401 push(Immediate(reinterpret_cast<intptr_t>(Smi::FromInt(p1 - p0)))); |
| 1389 CallRuntime(Runtime::kAbort, 2); | 1402 CallRuntime(Runtime::kAbort, 2); |
| 1390 // will not return here | 1403 // will not return here |
| 1404 int3(); | |
| 1391 } | 1405 } |
| 1392 | 1406 |
| 1393 | 1407 |
| 1394 CodePatcher::CodePatcher(byte* address, int size) | 1408 CodePatcher::CodePatcher(byte* address, int size) |
| 1395 : address_(address), size_(size), masm_(address, size + Assembler::kGap) { | 1409 : address_(address), size_(size), masm_(address, size + Assembler::kGap) { |
| 1396 // Create a new macro assembler pointing to the address of the code to patch. | 1410 // Create a new macro assembler pointing to the address of the code to patch. |
| 1397 // The size is adjusted with kGap on order for the assembler to generate size | 1411 // The size is adjusted with kGap on order for the assembler to generate size |
| 1398 // bytes of instructions without failing with buffer size constraints. | 1412 // bytes of instructions without failing with buffer size constraints. |
| 1399 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 1413 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
| 1400 } | 1414 } |
| 1401 | 1415 |
| 1402 | 1416 |
| 1403 CodePatcher::~CodePatcher() { | 1417 CodePatcher::~CodePatcher() { |
| 1404 // Indicate that code has changed. | 1418 // Indicate that code has changed. |
| 1405 CPU::FlushICache(address_, size_); | 1419 CPU::FlushICache(address_, size_); |
| 1406 | 1420 |
| 1407 // Check that the code was patched as expected. | 1421 // Check that the code was patched as expected. |
| 1408 ASSERT(masm_.pc_ == address_ + size_); | 1422 ASSERT(masm_.pc_ == address_ + size_); |
| 1409 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 1423 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
| 1410 } | 1424 } |
| 1411 | 1425 |
| 1412 | 1426 |
| 1413 } } // namespace v8::internal | 1427 } } // namespace v8::internal |
| OLD | NEW |