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

Side by Side Diff: src/arm/assembler-arm.h

Issue 204403002: Revert "Add out-of-line constant pool support to Arm." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « src/a64/assembler-a64.cc ('k') | src/arm/assembler-arm.cc » ('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 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are 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 21 matching lines...) Expand all
32 32
33 // The original source code covered by the above license above has been 33 // The original source code covered by the above license above has been
34 // modified significantly by Google Inc. 34 // modified significantly by Google Inc.
35 // Copyright 2012 the V8 project authors. All rights reserved. 35 // Copyright 2012 the V8 project authors. All rights reserved.
36 36
37 // A light-weight ARM Assembler 37 // A light-weight ARM Assembler
38 // Generates user mode instructions for the ARM architecture up to version 5 38 // Generates user mode instructions for the ARM architecture up to version 5
39 39
40 #ifndef V8_ARM_ASSEMBLER_ARM_H_ 40 #ifndef V8_ARM_ASSEMBLER_ARM_H_
41 #define V8_ARM_ASSEMBLER_ARM_H_ 41 #define V8_ARM_ASSEMBLER_ARM_H_
42
43 #include <stdio.h> 42 #include <stdio.h>
44 #include <vector>
45
46 #include "assembler.h" 43 #include "assembler.h"
47 #include "constants-arm.h" 44 #include "constants-arm.h"
48 #include "serialize.h" 45 #include "serialize.h"
49 46
50 namespace v8 { 47 namespace v8 {
51 namespace internal { 48 namespace internal {
52 49
53 // CpuFeatures keeps track of which features are supported by the target CPU. 50 // CpuFeatures keeps track of which features are supported by the target CPU.
54 // Supported features must be enabled by a CpuFeatureScope before use. 51 // Supported features must be enabled by a CpuFeatureScope before use.
55 class CpuFeatures : public AllStatic { 52 class CpuFeatures : public AllStatic {
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 class NeonListOperand BASE_EMBEDDED { 695 class NeonListOperand BASE_EMBEDDED {
699 public: 696 public:
700 explicit NeonListOperand(DoubleRegister base, int registers_count = 1); 697 explicit NeonListOperand(DoubleRegister base, int registers_count = 1);
701 DoubleRegister base() const { return base_; } 698 DoubleRegister base() const { return base_; }
702 NeonListType type() const { return type_; } 699 NeonListType type() const { return type_; }
703 private: 700 private:
704 DoubleRegister base_; 701 DoubleRegister base_;
705 NeonListType type_; 702 NeonListType type_;
706 }; 703 };
707 704
708
709 // Class used to build a constant pool.
710 class ConstantPoolBuilder BASE_EMBEDDED {
711 public:
712 explicit ConstantPoolBuilder();
713 void AddEntry(Assembler* assm, const RelocInfo& rinfo);
714 void Relocate(int pc_delta);
715 bool IsEmpty();
716 MaybeObject* Allocate(Heap* heap);
717 void Populate(Assembler* assm, ConstantPoolArray* constant_pool);
718
719 inline int count_of_64bit() const { return count_of_64bit_; }
720 inline int count_of_code_ptr() const { return count_of_code_ptr_; }
721 inline int count_of_heap_ptr() const { return count_of_heap_ptr_; }
722 inline int count_of_32bit() const { return count_of_32bit_; }
723
724 private:
725 bool Is64BitEntry(RelocInfo::Mode rmode);
726 bool Is32BitEntry(RelocInfo::Mode rmode);
727 bool IsCodePtrEntry(RelocInfo::Mode rmode);
728 bool IsHeapPtrEntry(RelocInfo::Mode rmode);
729
730 std::vector<RelocInfo> entries_;
731 std::vector<int> merged_indexes_;
732 int count_of_64bit_;
733 int count_of_code_ptr_;
734 int count_of_heap_ptr_;
735 int count_of_32bit_;
736 };
737
738
739 extern const Instr kMovLrPc; 705 extern const Instr kMovLrPc;
740 extern const Instr kLdrPCMask; 706 extern const Instr kLdrPCMask;
741 extern const Instr kLdrPCPattern; 707 extern const Instr kLdrPCPattern;
742 extern const Instr kLdrPpMask;
743 extern const Instr kLdrPpPattern;
744 extern const Instr kBlxRegMask; 708 extern const Instr kBlxRegMask;
745 extern const Instr kBlxRegPattern; 709 extern const Instr kBlxRegPattern;
746 extern const Instr kBlxIp; 710 extern const Instr kBlxIp;
747 711
748 extern const Instr kMovMvnMask; 712 extern const Instr kMovMvnMask;
749 extern const Instr kMovMvnPattern; 713 extern const Instr kMovMvnPattern;
750 extern const Instr kMovMvnFlip; 714 extern const Instr kMovMvnFlip;
751 715
752 extern const Instr kMovLeaveCCMask; 716 extern const Instr kMovLeaveCCMask;
753 extern const Instr kMovLeaveCCPattern; 717 extern const Instr kMovLeaveCCPattern;
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 } 1406 }
1443 static Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); } 1407 static Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); }
1444 static void instr_at_put(byte* pc, Instr instr) { 1408 static void instr_at_put(byte* pc, Instr instr) {
1445 *reinterpret_cast<Instr*>(pc) = instr; 1409 *reinterpret_cast<Instr*>(pc) = instr;
1446 } 1410 }
1447 static Condition GetCondition(Instr instr); 1411 static Condition GetCondition(Instr instr);
1448 static bool IsBranch(Instr instr); 1412 static bool IsBranch(Instr instr);
1449 static int GetBranchOffset(Instr instr); 1413 static int GetBranchOffset(Instr instr);
1450 static bool IsLdrRegisterImmediate(Instr instr); 1414 static bool IsLdrRegisterImmediate(Instr instr);
1451 static bool IsVldrDRegisterImmediate(Instr instr); 1415 static bool IsVldrDRegisterImmediate(Instr instr);
1452 static bool IsLdrPpImmediateOffset(Instr instr);
1453 static bool IsVldrDPpImmediateOffset(Instr instr);
1454 static int GetLdrRegisterImmediateOffset(Instr instr); 1416 static int GetLdrRegisterImmediateOffset(Instr instr);
1455 static int GetVldrDRegisterImmediateOffset(Instr instr); 1417 static int GetVldrDRegisterImmediateOffset(Instr instr);
1456 static Instr SetLdrRegisterImmediateOffset(Instr instr, int offset); 1418 static Instr SetLdrRegisterImmediateOffset(Instr instr, int offset);
1457 static Instr SetVldrDRegisterImmediateOffset(Instr instr, int offset); 1419 static Instr SetVldrDRegisterImmediateOffset(Instr instr, int offset);
1458 static bool IsStrRegisterImmediate(Instr instr); 1420 static bool IsStrRegisterImmediate(Instr instr);
1459 static Instr SetStrRegisterImmediateOffset(Instr instr, int offset); 1421 static Instr SetStrRegisterImmediateOffset(Instr instr, int offset);
1460 static bool IsAddRegisterImmediate(Instr instr); 1422 static bool IsAddRegisterImmediate(Instr instr);
1461 static Instr SetAddRegisterImmediateOffset(Instr instr, int offset); 1423 static Instr SetAddRegisterImmediateOffset(Instr instr, int offset);
1462 static Register GetRd(Instr instr); 1424 static Register GetRd(Instr instr);
1463 static Register GetRn(Instr instr); 1425 static Register GetRn(Instr instr);
(...skipping 25 matching lines...) Expand all
1489 static const int kMaxNumPending32RelocInfo = kMaxDistToIntPool/kInstrSize; 1451 static const int kMaxNumPending32RelocInfo = kMaxDistToIntPool/kInstrSize;
1490 static const int kMaxNumPending64RelocInfo = kMaxDistToFPPool/kInstrSize; 1452 static const int kMaxNumPending64RelocInfo = kMaxDistToFPPool/kInstrSize;
1491 1453
1492 // Postpone the generation of the constant pool for the specified number of 1454 // Postpone the generation of the constant pool for the specified number of
1493 // instructions. 1455 // instructions.
1494 void BlockConstPoolFor(int instructions); 1456 void BlockConstPoolFor(int instructions);
1495 1457
1496 // Check if is time to emit a constant pool. 1458 // Check if is time to emit a constant pool.
1497 void CheckConstPool(bool force_emit, bool require_jump); 1459 void CheckConstPool(bool force_emit, bool require_jump);
1498 1460
1499 // Allocate a constant pool of the correct size for the generated code.
1500 MaybeObject* AllocateConstantPool(Heap* heap);
1501
1502 // Generate the constant pool for the generated code.
1503 void PopulateConstantPool(ConstantPoolArray* constant_pool);
1504
1505 bool can_use_constant_pool() const { 1461 bool can_use_constant_pool() const {
1506 return is_constant_pool_available() && !constant_pool_full_; 1462 return is_constant_pool_available() && !constant_pool_full_;
1507 } 1463 }
1508 1464
1509 void set_constant_pool_full() { 1465 void set_constant_pool_full() {
1510 constant_pool_full_ = true; 1466 constant_pool_full_ = true;
1511 } 1467 }
1512 1468
1513 protected: 1469 protected:
1514 // Relocation for a type-recording IC has the AST id added to it. This 1470 // Relocation for a type-recording IC has the AST id added to it. This
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 // pending relocation entry per instruction. 1577 // pending relocation entry per instruction.
1622 1578
1623 // The buffers of pending relocation info. 1579 // The buffers of pending relocation info.
1624 RelocInfo pending_32_bit_reloc_info_[kMaxNumPending32RelocInfo]; 1580 RelocInfo pending_32_bit_reloc_info_[kMaxNumPending32RelocInfo];
1625 RelocInfo pending_64_bit_reloc_info_[kMaxNumPending64RelocInfo]; 1581 RelocInfo pending_64_bit_reloc_info_[kMaxNumPending64RelocInfo];
1626 // Number of pending reloc info entries in the 32 bits buffer. 1582 // Number of pending reloc info entries in the 32 bits buffer.
1627 int num_pending_32_bit_reloc_info_; 1583 int num_pending_32_bit_reloc_info_;
1628 // Number of pending reloc info entries in the 64 bits buffer. 1584 // Number of pending reloc info entries in the 64 bits buffer.
1629 int num_pending_64_bit_reloc_info_; 1585 int num_pending_64_bit_reloc_info_;
1630 1586
1631 ConstantPoolBuilder constant_pool_builder_;
1632
1633 // The bound position, before this we cannot do instruction elimination. 1587 // The bound position, before this we cannot do instruction elimination.
1634 int last_bound_pos_; 1588 int last_bound_pos_;
1635 1589
1636 // Indicates whether the constant pool can be accessed, which is only possible 1590 // Indicates whether the constant pool can be accessed, which is only possible
1637 // if the pp register points to the current code object's constant pool. 1591 // if the pp register points to the current code object's constant pool.
1638 bool constant_pool_available_; 1592 bool constant_pool_available_;
1639 // Indicates whether the constant pool is too full to accept new entries due 1593 // Indicates whether the constant pool is too full to accept new entries due
1640 // to the ldr instruction's limitted immediate offset range. 1594 // to the ldr instruction's limitted immediate offset range.
1641 bool constant_pool_full_; 1595 bool constant_pool_full_;
1642 1596
(...skipping 18 matching lines...) Expand all
1661 void print(Label* L); 1615 void print(Label* L);
1662 void bind_to(Label* L, int pos); 1616 void bind_to(Label* L, int pos);
1663 void next(Label* L); 1617 void next(Label* L);
1664 1618
1665 enum UseConstantPoolMode { 1619 enum UseConstantPoolMode {
1666 USE_CONSTANT_POOL, 1620 USE_CONSTANT_POOL,
1667 DONT_USE_CONSTANT_POOL 1621 DONT_USE_CONSTANT_POOL
1668 }; 1622 };
1669 1623
1670 // Record reloc info for current pc_ 1624 // Record reloc info for current pc_
1671 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0); 1625 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0,
1672 void RecordRelocInfo(const RelocInfo& rinfo); 1626 UseConstantPoolMode mode = USE_CONSTANT_POOL);
1673 void ConstantPoolAddEntry(const RelocInfo& rinfo); 1627 void RecordRelocInfo(double data);
1628 void RecordRelocInfoConstantPoolEntryHelper(const RelocInfo& rinfo);
1674 1629
1675 friend class RelocInfo; 1630 friend class RelocInfo;
1676 friend class CodePatcher; 1631 friend class CodePatcher;
1677 friend class BlockConstPoolScope; 1632 friend class BlockConstPoolScope;
1678 friend class FrameAndConstantPoolScope; 1633 friend class FrameAndConstantPoolScope;
1679 friend class ConstantPoolUnavailableScope; 1634 friend class ConstantPoolUnavailableScope;
1680 1635
1681 PositionsRecorder positions_recorder_; 1636 PositionsRecorder positions_recorder_;
1682 friend class PositionsRecorder; 1637 friend class PositionsRecorder;
1683 friend class EnsureSpace; 1638 friend class EnsureSpace;
1684 }; 1639 };
1685 1640
1686 1641
1687 class EnsureSpace BASE_EMBEDDED { 1642 class EnsureSpace BASE_EMBEDDED {
1688 public: 1643 public:
1689 explicit EnsureSpace(Assembler* assembler) { 1644 explicit EnsureSpace(Assembler* assembler) {
1690 assembler->CheckBuffer(); 1645 assembler->CheckBuffer();
1691 } 1646 }
1692 }; 1647 };
1693 1648
1694 1649
1695 } } // namespace v8::internal 1650 } } // namespace v8::internal
1696 1651
1697 #endif // V8_ARM_ASSEMBLER_ARM_H_ 1652 #endif // V8_ARM_ASSEMBLER_ARM_H_
OLDNEW
« no previous file with comments | « src/a64/assembler-a64.cc ('k') | src/arm/assembler-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698