Index: src/arm/assembler-arm.h |
diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h |
index 3b9bb804fd331c144563d6522239c6967933a817..797be543c7af0a9104ba2c7901dcf2d6088685a3 100644 |
--- a/src/arm/assembler-arm.h |
+++ b/src/arm/assembler-arm.h |
@@ -1291,8 +1291,11 @@ class Assembler : public AssemblerBase { |
static bool IsBranch(Instr instr); |
static int GetBranchOffset(Instr instr); |
static bool IsLdrRegisterImmediate(Instr instr); |
+ static bool IsVldrDRegisterImmediate(Instr instr); |
static int GetLdrRegisterImmediateOffset(Instr instr); |
+ static int GetVldrDRegisterImmediateOffset(Instr instr); |
static Instr SetLdrRegisterImmediateOffset(Instr instr, int offset); |
+ static Instr SetVldrDRegisterImmediateOffset(Instr instr, int offset); |
static bool IsStrRegisterImmediate(Instr instr); |
static Instr SetStrRegisterImmediateOffset(Instr instr, int offset); |
static bool IsAddRegisterImmediate(Instr instr); |
@@ -1307,6 +1310,7 @@ class Assembler : public AssemblerBase { |
static bool IsStrRegFpNegOffset(Instr instr); |
static bool IsLdrRegFpNegOffset(Instr instr); |
static bool IsLdrPcImmediateOffset(Instr instr); |
+ static bool IsVldrDPcImmediateOffset(Instr instr); |
static bool IsTstImmediate(Instr instr); |
static bool IsCmpRegister(Instr instr); |
static bool IsCmpImmediate(Instr instr); |
@@ -1317,12 +1321,13 @@ class Assembler : public AssemblerBase { |
static bool IsMovW(Instr instr); |
// Constants in pools are accessed via pc relative addressing, which can |
- // reach +/-4KB thereby defining a maximum distance between the instruction |
- // and the accessed constant. |
- static const int kMaxDistToPool = 4*KB; |
- static const int kMaxNumPendingRelocInfo = kMaxDistToPool/kInstrSize; |
- STATIC_ASSERT((kConstantPoolLengthMaxMask & kMaxNumPendingRelocInfo) == |
- kMaxNumPendingRelocInfo); |
+ // reach +/-4KB for integer PC-relative loads and +/-1KB for floating-point |
+ // PC-relative loads, thereby defining a maximum distance between the |
+ // instruction and the accessed constant. |
+ static const int kMaxDistToIntPool = 4*KB; |
+ static const int kMaxDistToFPPool = 1*KB; |
+ // All relocations could be integer, it therefore acts as the limit. |
+ static const int kMaxNumPendingRelocInfo = kMaxDistToIntPool/kInstrSize; |
// Postpone the generation of the constant pool for the specified number of |
// instructions. |
@@ -1362,7 +1367,9 @@ class Assembler : public AssemblerBase { |
if (--const_pool_blocked_nesting_ == 0) { |
// Check the constant pool hasn't been blocked for too long. |
ASSERT((num_pending_reloc_info_ == 0) || |
- (pc_offset() < (first_const_pool_use_ + kMaxDistToPool))); |
+ (pc_offset() < (first_const_pool_use_ + kMaxDistToIntPool))); |
+ ASSERT((num_pending_64_bit_reloc_info_ == 0) || |
+ (pc_offset() < (first_const_pool_use_ + kMaxDistToFPPool))); |
// Two cases: |
// * no_const_pool_before_ >= next_buffer_check_ and the emission is |
// still blocked |
@@ -1405,13 +1412,6 @@ class Assembler : public AssemblerBase { |
static const int kCheckPoolInterval = kCheckPoolIntervalInst * kInstrSize; |
- // Average distance beetween a constant pool and the first instruction |
- // accessing the constant pool. Longer distance should result in less I-cache |
- // pollution. |
- // In practice the distance will be smaller since constant pool emission is |
- // forced after function return and sometimes after unconditional branches. |
- static const int kAvgDistToPool = kMaxDistToPool - kCheckPoolInterval; |
- |
// Emission of the constant pool may be blocked in some code sequences. |
int const_pool_blocked_nesting_; // Block emission if this is not zero. |
int no_const_pool_before_; // Block emission before this pc offset. |
@@ -1436,6 +1436,9 @@ class Assembler : public AssemblerBase { |
RelocInfo pending_reloc_info_[kMaxNumPendingRelocInfo]; |
// number of pending reloc info entries in the buffer |
int num_pending_reloc_info_; |
+ // Number of pending reloc info entries included above which also happen to |
+ // be 64-bit. |
+ int num_pending_64_bit_reloc_info_; |
// The bound position, before this we cannot do instruction elimination. |
int last_bound_pos_; |
@@ -1472,6 +1475,8 @@ class Assembler : public AssemblerBase { |
// Record reloc info for current pc_ |
void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0, |
UseConstantPoolMode mode = USE_CONSTANT_POOL); |
+ void RecordRelocInfo(double data); |
+ void RecordRelocInfoConstantPoolEntryHelper(const RelocInfo& rinfo); |
friend class RegExpMacroAssemblerARM; |
friend class RelocInfo; |