| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 return UncondBranchType; | 273 return UncondBranchType; |
| 274 } else if (IsCompareBranch()) { | 274 } else if (IsCompareBranch()) { |
| 275 return CompareBranchType; | 275 return CompareBranchType; |
| 276 } else if (IsTestBranch()) { | 276 } else if (IsTestBranch()) { |
| 277 return TestBranchType; | 277 return TestBranchType; |
| 278 } else { | 278 } else { |
| 279 return UnknownBranchType; | 279 return UnknownBranchType; |
| 280 } | 280 } |
| 281 } | 281 } |
| 282 | 282 |
| 283 static int ImmBranchRangeBitwidth(ImmBranchType branch_type) { |
| 284 switch (branch_type) { |
| 285 case UncondBranchType: |
| 286 return ImmUncondBranch_width; |
| 287 case CondBranchType: |
| 288 return ImmCondBranch_width; |
| 289 case CompareBranchType: |
| 290 return ImmCmpBranch_width; |
| 291 case TestBranchType: |
| 292 return ImmTestBranch_width; |
| 293 default: |
| 294 UNREACHABLE(); |
| 295 return 0; |
| 296 } |
| 297 } |
| 298 |
| 299 // The range of the branch instruction, expressed as 'instr +- range'. |
| 300 static int32_t ImmBranchRange(ImmBranchType branch_type) { |
| 301 return |
| 302 (1 << (ImmBranchRangeBitwidth(branch_type) + kInstructionSizeLog2)) / 2 - |
| 303 kInstructionSize; |
| 304 } |
| 305 |
| 283 int ImmBranch() const { | 306 int ImmBranch() const { |
| 284 switch (BranchType()) { | 307 switch (BranchType()) { |
| 285 case CondBranchType: return ImmCondBranch(); | 308 case CondBranchType: return ImmCondBranch(); |
| 286 case UncondBranchType: return ImmUncondBranch(); | 309 case UncondBranchType: return ImmUncondBranch(); |
| 287 case CompareBranchType: return ImmCmpBranch(); | 310 case CompareBranchType: return ImmCmpBranch(); |
| 288 case TestBranchType: return ImmTestBranch(); | 311 case TestBranchType: return ImmTestBranch(); |
| 289 default: UNREACHABLE(); | 312 default: UNREACHABLE(); |
| 290 } | 313 } |
| 291 return 0; | 314 return 0; |
| 292 } | 315 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 322 | 345 |
| 323 // Find the PC offset encoded in this instruction. 'this' may be a branch or | 346 // Find the PC offset encoded in this instruction. 'this' may be a branch or |
| 324 // a PC-relative addressing instruction. | 347 // a PC-relative addressing instruction. |
| 325 // The offset returned is unscaled. | 348 // The offset returned is unscaled. |
| 326 ptrdiff_t ImmPCOffset(); | 349 ptrdiff_t ImmPCOffset(); |
| 327 | 350 |
| 328 // Find the target of this instruction. 'this' may be a branch or a | 351 // Find the target of this instruction. 'this' may be a branch or a |
| 329 // PC-relative addressing instruction. | 352 // PC-relative addressing instruction. |
| 330 Instruction* ImmPCOffsetTarget(); | 353 Instruction* ImmPCOffsetTarget(); |
| 331 | 354 |
| 355 static bool IsValidImmPCOffset(ImmBranchType branch_type, int32_t offset); |
| 356 bool IsTargetInImmPCOffsetRange(Instruction* target); |
| 332 // Patch a PC-relative offset to refer to 'target'. 'this' may be a branch or | 357 // Patch a PC-relative offset to refer to 'target'. 'this' may be a branch or |
| 333 // a PC-relative addressing instruction. | 358 // a PC-relative addressing instruction. |
| 334 void SetImmPCOffsetTarget(Instruction* target); | 359 void SetImmPCOffsetTarget(Instruction* target); |
| 335 // Patch a literal load instruction to load from 'source'. | 360 // Patch a literal load instruction to load from 'source'. |
| 336 void SetImmLLiteral(Instruction* source); | 361 void SetImmLLiteral(Instruction* source); |
| 337 | 362 |
| 338 uint8_t* LiteralAddress() { | 363 uint8_t* LiteralAddress() { |
| 339 int offset = ImmLLiteral() << kLiteralEntrySizeLog2; | 364 int offset = ImmLLiteral() << kLiteralEntrySizeLog2; |
| 340 return reinterpret_cast<uint8_t*>(this) + offset; | 365 return reinterpret_cast<uint8_t*>(this) + offset; |
| 341 } | 366 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 TRACE_ENABLE = 1 << 6, | 507 TRACE_ENABLE = 1 << 6, |
| 483 TRACE_DISABLE = 2 << 6, | 508 TRACE_DISABLE = 2 << 6, |
| 484 TRACE_OVERRIDE = 3 << 6 | 509 TRACE_OVERRIDE = 3 << 6 |
| 485 }; | 510 }; |
| 486 | 511 |
| 487 | 512 |
| 488 } } // namespace v8::internal | 513 } } // namespace v8::internal |
| 489 | 514 |
| 490 | 515 |
| 491 #endif // V8_A64_INSTRUCTIONS_A64_H_ | 516 #endif // V8_A64_INSTRUCTIONS_A64_H_ |
| OLD | NEW |