| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
| 6 | 6 |
| 7 #define ARM64_DEFINE_FP_STATICS | 7 #define ARM64_DEFINE_FP_STATICS |
| 8 | 8 |
| 9 #include "src/arm64/assembler-arm64-inl.h" | 9 #include "src/arm64/assembler-arm64-inl.h" |
| 10 #include "src/arm64/instructions-arm64.h" | 10 #include "src/arm64/instructions-arm64.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 ptrdiff_t offset) { | 212 ptrdiff_t offset) { |
| 213 return is_intn(offset, ImmBranchRangeBitwidth(branch_type)); | 213 return is_intn(offset, ImmBranchRangeBitwidth(branch_type)); |
| 214 } | 214 } |
| 215 | 215 |
| 216 | 216 |
| 217 bool Instruction::IsTargetInImmPCOffsetRange(Instruction* target) { | 217 bool Instruction::IsTargetInImmPCOffsetRange(Instruction* target) { |
| 218 return IsValidImmPCOffset(BranchType(), DistanceTo(target)); | 218 return IsValidImmPCOffset(BranchType(), DistanceTo(target)); |
| 219 } | 219 } |
| 220 | 220 |
| 221 | 221 |
| 222 void Instruction::SetImmPCOffsetTarget(Instruction* target) { | 222 void Instruction::SetImmPCOffsetTarget(Isolate* isolate, Instruction* target) { |
| 223 if (IsPCRelAddressing()) { | 223 if (IsPCRelAddressing()) { |
| 224 SetPCRelImmTarget(target); | 224 SetPCRelImmTarget(isolate, target); |
| 225 } else if (BranchType() != UnknownBranchType) { | 225 } else if (BranchType() != UnknownBranchType) { |
| 226 SetBranchImmTarget(target); | 226 SetBranchImmTarget(target); |
| 227 } else if (IsUnresolvedInternalReference()) { | 227 } else if (IsUnresolvedInternalReference()) { |
| 228 SetUnresolvedInternalReferenceImmTarget(target); | 228 SetUnresolvedInternalReferenceImmTarget(isolate, target); |
| 229 } else { | 229 } else { |
| 230 // Load literal (offset from PC). | 230 // Load literal (offset from PC). |
| 231 SetImmLLiteral(target); | 231 SetImmLLiteral(target); |
| 232 } | 232 } |
| 233 } | 233 } |
| 234 | 234 |
| 235 | 235 |
| 236 void Instruction::SetPCRelImmTarget(Instruction* target) { | 236 void Instruction::SetPCRelImmTarget(Isolate* isolate, Instruction* target) { |
| 237 // ADRP is not supported, so 'this' must point to an ADR instruction. | 237 // ADRP is not supported, so 'this' must point to an ADR instruction. |
| 238 DCHECK(IsAdr()); | 238 DCHECK(IsAdr()); |
| 239 | 239 |
| 240 ptrdiff_t target_offset = DistanceTo(target); | 240 ptrdiff_t target_offset = DistanceTo(target); |
| 241 Instr imm; | 241 Instr imm; |
| 242 if (Instruction::IsValidPCRelOffset(target_offset)) { | 242 if (Instruction::IsValidPCRelOffset(target_offset)) { |
| 243 imm = Assembler::ImmPCRelAddress(static_cast<int>(target_offset)); | 243 imm = Assembler::ImmPCRelAddress(static_cast<int>(target_offset)); |
| 244 SetInstructionBits(Mask(~ImmPCRel_mask) | imm); | 244 SetInstructionBits(Mask(~ImmPCRel_mask) | imm); |
| 245 } else { | 245 } else { |
| 246 PatchingAssembler patcher(this, | 246 PatchingAssembler patcher(isolate, this, |
| 247 PatchingAssembler::kAdrFarPatchableNInstrs); | 247 PatchingAssembler::kAdrFarPatchableNInstrs); |
| 248 patcher.PatchAdrFar(target_offset); | 248 patcher.PatchAdrFar(target_offset); |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 | 251 |
| 252 | 252 |
| 253 void Instruction::SetBranchImmTarget(Instruction* target) { | 253 void Instruction::SetBranchImmTarget(Instruction* target) { |
| 254 DCHECK(IsAligned(DistanceTo(target), kInstructionSize)); | 254 DCHECK(IsAligned(DistanceTo(target), kInstructionSize)); |
| 255 DCHECK(IsValidImmPCOffset(BranchType(), | 255 DCHECK(IsValidImmPCOffset(BranchType(), |
| 256 DistanceTo(target) >> kInstructionSizeLog2)); | 256 DistanceTo(target) >> kInstructionSizeLog2)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 277 branch_imm = Assembler::ImmTestBranch(offset); | 277 branch_imm = Assembler::ImmTestBranch(offset); |
| 278 imm_mask = ImmTestBranch_mask; | 278 imm_mask = ImmTestBranch_mask; |
| 279 break; | 279 break; |
| 280 } | 280 } |
| 281 default: UNREACHABLE(); | 281 default: UNREACHABLE(); |
| 282 } | 282 } |
| 283 SetInstructionBits(Mask(~imm_mask) | branch_imm); | 283 SetInstructionBits(Mask(~imm_mask) | branch_imm); |
| 284 } | 284 } |
| 285 | 285 |
| 286 | 286 |
| 287 void Instruction::SetUnresolvedInternalReferenceImmTarget(Instruction* target) { | 287 void Instruction::SetUnresolvedInternalReferenceImmTarget(Isolate* isolate, |
| 288 Instruction* target) { |
| 288 DCHECK(IsUnresolvedInternalReference()); | 289 DCHECK(IsUnresolvedInternalReference()); |
| 289 DCHECK(IsAligned(DistanceTo(target), kInstructionSize)); | 290 DCHECK(IsAligned(DistanceTo(target), kInstructionSize)); |
| 290 DCHECK(is_int32(DistanceTo(target) >> kInstructionSizeLog2)); | 291 DCHECK(is_int32(DistanceTo(target) >> kInstructionSizeLog2)); |
| 291 int32_t target_offset = | 292 int32_t target_offset = |
| 292 static_cast<int32_t>(DistanceTo(target) >> kInstructionSizeLog2); | 293 static_cast<int32_t>(DistanceTo(target) >> kInstructionSizeLog2); |
| 293 uint32_t high16 = unsigned_bitextract_32(31, 16, target_offset); | 294 uint32_t high16 = unsigned_bitextract_32(31, 16, target_offset); |
| 294 uint32_t low16 = unsigned_bitextract_32(15, 0, target_offset); | 295 uint32_t low16 = unsigned_bitextract_32(15, 0, target_offset); |
| 295 | 296 |
| 296 PatchingAssembler patcher(this, 2); | 297 PatchingAssembler patcher(isolate, this, 2); |
| 297 patcher.brk(high16); | 298 patcher.brk(high16); |
| 298 patcher.brk(low16); | 299 patcher.brk(low16); |
| 299 } | 300 } |
| 300 | 301 |
| 301 | 302 |
| 302 void Instruction::SetImmLLiteral(Instruction* source) { | 303 void Instruction::SetImmLLiteral(Instruction* source) { |
| 303 DCHECK(IsLdrLiteral()); | 304 DCHECK(IsLdrLiteral()); |
| 304 DCHECK(IsAligned(DistanceTo(source), kInstructionSize)); | 305 DCHECK(IsAligned(DistanceTo(source), kInstructionSize)); |
| 305 DCHECK(Assembler::IsImmLLiteral(DistanceTo(source))); | 306 DCHECK(Assembler::IsImmLLiteral(DistanceTo(source))); |
| 306 Instr imm = Assembler::ImmLLiteral( | 307 Instr imm = Assembler::ImmLLiteral( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 332 // TODO(all): If we extend ::InlineData() to support bigger data, we need | 333 // TODO(all): If we extend ::InlineData() to support bigger data, we need |
| 333 // to update this method too. | 334 // to update this method too. |
| 334 return payload; | 335 return payload; |
| 335 } | 336 } |
| 336 | 337 |
| 337 | 338 |
| 338 } // namespace internal | 339 } // namespace internal |
| 339 } // namespace v8 | 340 } // namespace v8 |
| 340 | 341 |
| 341 #endif // V8_TARGET_ARCH_ARM64 | 342 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |