| 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 #ifndef V8_ARM64_SIMULATOR_ARM64_H_ | 5 #ifndef V8_ARM64_SIMULATOR_ARM64_H_ | 
| 6 #define V8_ARM64_SIMULATOR_ARM64_H_ | 6 #define V8_ARM64_SIMULATOR_ARM64_H_ | 
| 7 | 7 | 
| 8 #include <stdarg.h> | 8 #include <stdarg.h> | 
| 9 #include <vector> | 9 #include <vector> | 
| 10 | 10 | 
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 126   // describes the bits which are not modifiable. | 126   // describes the bits which are not modifiable. | 
| 127   SimSystemRegister(uint32_t value, uint32_t write_ignore_mask) | 127   SimSystemRegister(uint32_t value, uint32_t write_ignore_mask) | 
| 128       : value_(value), write_ignore_mask_(write_ignore_mask) { } | 128       : value_(value), write_ignore_mask_(write_ignore_mask) { } | 
| 129 | 129 | 
| 130   uint32_t value_; | 130   uint32_t value_; | 
| 131   uint32_t write_ignore_mask_; | 131   uint32_t write_ignore_mask_; | 
| 132 }; | 132 }; | 
| 133 | 133 | 
| 134 | 134 | 
| 135 // Represent a register (r0-r31, v0-v31). | 135 // Represent a register (r0-r31, v0-v31). | 
| 136 template<int kSizeInBytes> |  | 
| 137 class SimRegisterBase { | 136 class SimRegisterBase { | 
| 138  public: | 137  public: | 
| 139   template<typename T> | 138   template<typename T> | 
| 140   void Set(T new_value, unsigned size = sizeof(T)) { | 139   void Set(T new_value) { | 
| 141     ASSERT(size <= kSizeInBytes); | 140     value_ = 0; | 
| 142     ASSERT(size <= sizeof(new_value)); | 141     memcpy(&value_, &new_value, sizeof(T)); | 
| 143     // All AArch64 registers are zero-extending; Writing a W register clears the |  | 
| 144     // top bits of the corresponding X register. |  | 
| 145     memset(value_, 0, kSizeInBytes); |  | 
| 146     memcpy(value_, &new_value, size); |  | 
| 147   } | 142   } | 
| 148 | 143 | 
| 149   // Copy 'size' bytes of the register to the result, and zero-extend to fill |  | 
| 150   // the result. |  | 
| 151   template<typename T> | 144   template<typename T> | 
| 152   T Get(unsigned size = sizeof(T)) const { | 145   T Get() const { | 
| 153     ASSERT(size <= kSizeInBytes); |  | 
| 154     T result; | 146     T result; | 
| 155     memset(&result, 0, sizeof(result)); | 147     memcpy(&result, &value_, sizeof(T)); | 
| 156     memcpy(&result, value_, size); |  | 
| 157     return result; | 148     return result; | 
| 158   } | 149   } | 
| 159 | 150 | 
| 160  protected: | 151  protected: | 
| 161   uint8_t value_[kSizeInBytes]; | 152   int64_t value_; | 
| 162 }; | 153 }; | 
| 163 typedef SimRegisterBase<kXRegSize> SimRegister;      // r0-r31 | 154 | 
| 164 typedef SimRegisterBase<kDRegSize> SimFPRegister;    // v0-v31 | 155 | 
|  | 156 typedef SimRegisterBase SimRegister;      // r0-r31 | 
|  | 157 typedef SimRegisterBase SimFPRegister;    // v0-v31 | 
| 165 | 158 | 
| 166 | 159 | 
| 167 class Simulator : public DecoderVisitor { | 160 class Simulator : public DecoderVisitor { | 
| 168  public: | 161  public: | 
| 169   explicit Simulator(Decoder<DispatchingDecoderVisitor>* decoder, | 162   explicit Simulator(Decoder<DispatchingDecoderVisitor>* decoder, | 
| 170                      Isolate* isolate = NULL, | 163                      Isolate* isolate = NULL, | 
| 171                      FILE* stream = stderr); | 164                      FILE* stream = stderr); | 
| 172   Simulator(); | 165   Simulator(); | 
| 173   ~Simulator(); | 166   ~Simulator(); | 
| 174 | 167 | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 321     LogProcessorState(); | 314     LogProcessorState(); | 
| 322     increment_pc(); | 315     increment_pc(); | 
| 323     CheckBreakpoints(); | 316     CheckBreakpoints(); | 
| 324   } | 317   } | 
| 325 | 318 | 
| 326   // Declare all Visitor functions. | 319   // Declare all Visitor functions. | 
| 327   #define DECLARE(A)  void Visit##A(Instruction* instr); | 320   #define DECLARE(A)  void Visit##A(Instruction* instr); | 
| 328   VISITOR_LIST(DECLARE) | 321   VISITOR_LIST(DECLARE) | 
| 329   #undef DECLARE | 322   #undef DECLARE | 
| 330 | 323 | 
|  | 324   bool IsZeroRegister(unsigned code, Reg31Mode r31mode) const { | 
|  | 325     return ((code == 31) && (r31mode == Reg31IsZeroRegister)); | 
|  | 326   } | 
|  | 327 | 
| 331   // Register accessors. | 328   // Register accessors. | 
| 332 |  | 
| 333   // Return 'size' bits of the value of an integer register, as the specified | 329   // Return 'size' bits of the value of an integer register, as the specified | 
| 334   // type. The value is zero-extended to fill the result. | 330   // type. The value is zero-extended to fill the result. | 
| 335   // | 331   // | 
| 336   // The only supported values of 'size' are kXRegSizeInBits and |  | 
| 337   // kWRegSizeInBits. |  | 
| 338   template<typename T> |  | 
| 339   T reg(unsigned size, unsigned code, |  | 
| 340         Reg31Mode r31mode = Reg31IsZeroRegister) const { |  | 
| 341     unsigned size_in_bytes = size / 8; |  | 
| 342     ASSERT(size_in_bytes <= sizeof(T)); |  | 
| 343     ASSERT((size == kXRegSizeInBits) || (size == kWRegSizeInBits)); |  | 
| 344     ASSERT(code < kNumberOfRegisters); |  | 
| 345 |  | 
| 346     if ((code == 31) && (r31mode == Reg31IsZeroRegister)) { |  | 
| 347       T result; |  | 
| 348       memset(&result, 0, sizeof(result)); |  | 
| 349       return result; |  | 
| 350     } |  | 
| 351     return registers_[code].Get<T>(size_in_bytes); |  | 
| 352   } |  | 
| 353 |  | 
| 354   // Like reg(), but infer the access size from the template type. |  | 
| 355   template<typename T> | 332   template<typename T> | 
| 356   T reg(unsigned code, Reg31Mode r31mode = Reg31IsZeroRegister) const { | 333   T reg(unsigned code, Reg31Mode r31mode = Reg31IsZeroRegister) const { | 
| 357     return reg<T>(sizeof(T) * 8, code, r31mode); | 334     ASSERT(code < kNumberOfRegisters); | 
|  | 335     if (IsZeroRegister(code, r31mode)) { | 
|  | 336       return 0; | 
|  | 337     } | 
|  | 338     return registers_[code].Get<T>(); | 
| 358   } | 339   } | 
| 359 | 340 | 
| 360   // Common specialized accessors for the reg() template. | 341   // Common specialized accessors for the reg() template. | 
| 361   int32_t wreg(unsigned code, | 342   int32_t wreg(unsigned code, Reg31Mode r31mode = Reg31IsZeroRegister) const { | 
| 362                Reg31Mode r31mode = Reg31IsZeroRegister) const { |  | 
| 363     return reg<int32_t>(code, r31mode); | 343     return reg<int32_t>(code, r31mode); | 
| 364   } | 344   } | 
| 365 | 345 | 
| 366   int64_t xreg(unsigned code, | 346   int64_t xreg(unsigned code, Reg31Mode r31mode = Reg31IsZeroRegister) const { | 
| 367                Reg31Mode r31mode = Reg31IsZeroRegister) const { |  | 
| 368     return reg<int64_t>(code, r31mode); | 347     return reg<int64_t>(code, r31mode); | 
| 369   } | 348   } | 
| 370 | 349 | 
| 371   int64_t reg(unsigned size, unsigned code, |  | 
| 372               Reg31Mode r31mode = Reg31IsZeroRegister) const { |  | 
| 373     return reg<int64_t>(size, code, r31mode); |  | 
| 374   } |  | 
| 375 |  | 
| 376   // Write 'size' bits of 'value' into an integer register. The value is | 350   // Write 'size' bits of 'value' into an integer register. The value is | 
| 377   // zero-extended. This behaviour matches AArch64 register writes. | 351   // zero-extended. This behaviour matches AArch64 register writes. | 
| 378   // |  | 
| 379   // The only supported values of 'size' are kXRegSizeInBits and |  | 
| 380   // kWRegSizeInBits. |  | 
| 381   template<typename T> |  | 
| 382   void set_reg(unsigned size, unsigned code, T value, |  | 
| 383                Reg31Mode r31mode = Reg31IsZeroRegister) { |  | 
| 384     unsigned size_in_bytes = size / 8; |  | 
| 385     ASSERT(size_in_bytes <= sizeof(T)); |  | 
| 386     ASSERT((size == kXRegSizeInBits) || (size == kWRegSizeInBits)); |  | 
| 387     ASSERT(code < kNumberOfRegisters); |  | 
| 388 |  | 
| 389     if ((code == 31) && (r31mode == Reg31IsZeroRegister)) { |  | 
| 390       return; |  | 
| 391     } |  | 
| 392     return registers_[code].Set(value, size_in_bytes); |  | 
| 393   } |  | 
| 394 | 352 | 
| 395   // Like set_reg(), but infer the access size from the template type. | 353   // Like set_reg(), but infer the access size from the template type. | 
| 396   template<typename T> | 354   template<typename T> | 
| 397   void set_reg(unsigned code, T value, | 355   void set_reg(unsigned code, T value, | 
| 398                Reg31Mode r31mode = Reg31IsZeroRegister) { | 356                Reg31Mode r31mode = Reg31IsZeroRegister) { | 
| 399     set_reg(sizeof(value) * 8, code, value, r31mode); | 357     ASSERT(code < kNumberOfRegisters); | 
|  | 358     if (!IsZeroRegister(code, r31mode)) | 
|  | 359       registers_[code].Set(value); | 
| 400   } | 360   } | 
| 401 | 361 | 
| 402   // Common specialized accessors for the set_reg() template. | 362   // Common specialized accessors for the set_reg() template. | 
| 403   void set_wreg(unsigned code, int32_t value, | 363   void set_wreg(unsigned code, int32_t value, | 
| 404                 Reg31Mode r31mode = Reg31IsZeroRegister) { | 364                 Reg31Mode r31mode = Reg31IsZeroRegister) { | 
| 405     set_reg(kWRegSizeInBits, code, value, r31mode); | 365     set_reg(code, value, r31mode); | 
| 406   } | 366   } | 
| 407 | 367 | 
| 408   void set_xreg(unsigned code, int64_t value, | 368   void set_xreg(unsigned code, int64_t value, | 
| 409                 Reg31Mode r31mode = Reg31IsZeroRegister) { | 369                 Reg31Mode r31mode = Reg31IsZeroRegister) { | 
| 410     set_reg(kXRegSizeInBits, code, value, r31mode); | 370     set_reg(code, value, r31mode); | 
| 411   } | 371   } | 
| 412 | 372 | 
| 413   // Commonly-used special cases. | 373   // Commonly-used special cases. | 
| 414   template<typename T> | 374   template<typename T> | 
| 415   void set_lr(T value) { | 375   void set_lr(T value) { | 
| 416     ASSERT(sizeof(T) == kPointerSize); | 376     ASSERT(sizeof(T) == kPointerSize); | 
| 417     set_reg(kLinkRegCode, value); | 377     set_reg(kLinkRegCode, value); | 
| 418   } | 378   } | 
| 419 | 379 | 
| 420   template<typename T> | 380   template<typename T> | 
| 421   void set_sp(T value) { | 381   void set_sp(T value) { | 
| 422     ASSERT(sizeof(T) == kPointerSize); | 382     ASSERT(sizeof(T) == kPointerSize); | 
| 423     set_reg(31, value, Reg31IsStackPointer); | 383     set_reg(31, value, Reg31IsStackPointer); | 
| 424   } | 384   } | 
| 425 | 385 | 
| 426   int64_t sp() { return xreg(31, Reg31IsStackPointer); } | 386   int64_t sp() { return xreg(31, Reg31IsStackPointer); } | 
| 427   int64_t jssp() { return xreg(kJSSPCode, Reg31IsStackPointer); } | 387   int64_t jssp() { return xreg(kJSSPCode, Reg31IsStackPointer); } | 
| 428   int64_t fp() { | 388   int64_t fp() { | 
| 429       return xreg(kFramePointerRegCode, Reg31IsStackPointer); | 389       return xreg(kFramePointerRegCode, Reg31IsStackPointer); | 
| 430   } | 390   } | 
| 431   Instruction* lr() { return reg<Instruction*>(kLinkRegCode); } | 391   Instruction* lr() { return reg<Instruction*>(kLinkRegCode); } | 
| 432 | 392 | 
| 433   Address get_sp() { return reg<Address>(31, Reg31IsStackPointer); } | 393   Address get_sp() { return reg<Address>(31, Reg31IsStackPointer); } | 
| 434 | 394 | 
| 435   // Return 'size' bits of the value of a floating-point register, as the |  | 
| 436   // specified type. The value is zero-extended to fill the result. |  | 
| 437   // |  | 
| 438   // The only supported values of 'size' are kDRegSizeInBits and |  | 
| 439   // kSRegSizeInBits. |  | 
| 440   template<typename T> |  | 
| 441   T fpreg(unsigned size, unsigned code) const { |  | 
| 442     unsigned size_in_bytes = size / 8; |  | 
| 443     ASSERT(size_in_bytes <= sizeof(T)); |  | 
| 444     ASSERT((size == kDRegSizeInBits) || (size == kSRegSizeInBits)); |  | 
| 445     ASSERT(code < kNumberOfFPRegisters); |  | 
| 446     return fpregisters_[code].Get<T>(size_in_bytes); |  | 
| 447   } |  | 
| 448 |  | 
| 449   // Like fpreg(), but infer the access size from the template type. |  | 
| 450   template<typename T> | 395   template<typename T> | 
| 451   T fpreg(unsigned code) const { | 396   T fpreg(unsigned code) const { | 
| 452     return fpreg<T>(sizeof(T) * 8, code); | 397     ASSERT(code < kNumberOfRegisters); | 
|  | 398     return fpregisters_[code].Get<T>(); | 
| 453   } | 399   } | 
| 454 | 400 | 
| 455   // Common specialized accessors for the fpreg() template. | 401   // Common specialized accessors for the fpreg() template. | 
| 456   float sreg(unsigned code) const { | 402   float sreg(unsigned code) const { | 
| 457     return fpreg<float>(code); | 403     return fpreg<float>(code); | 
| 458   } | 404   } | 
| 459 | 405 | 
| 460   uint32_t sreg_bits(unsigned code) const { | 406   uint32_t sreg_bits(unsigned code) const { | 
| 461     return fpreg<uint32_t>(code); | 407     return fpreg<uint32_t>(code); | 
| 462   } | 408   } | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 478         return 0.0; | 424         return 0.0; | 
| 479     } | 425     } | 
| 480   } | 426   } | 
| 481 | 427 | 
| 482   // Write 'value' into a floating-point register. The value is zero-extended. | 428   // Write 'value' into a floating-point register. The value is zero-extended. | 
| 483   // This behaviour matches AArch64 register writes. | 429   // This behaviour matches AArch64 register writes. | 
| 484   template<typename T> | 430   template<typename T> | 
| 485   void set_fpreg(unsigned code, T value) { | 431   void set_fpreg(unsigned code, T value) { | 
| 486     ASSERT((sizeof(value) == kDRegSize) || (sizeof(value) == kSRegSize)); | 432     ASSERT((sizeof(value) == kDRegSize) || (sizeof(value) == kSRegSize)); | 
| 487     ASSERT(code < kNumberOfFPRegisters); | 433     ASSERT(code < kNumberOfFPRegisters); | 
| 488     fpregisters_[code].Set(value, sizeof(value)); | 434     fpregisters_[code].Set(value); | 
| 489   } | 435   } | 
| 490 | 436 | 
| 491   // Common specialized accessors for the set_fpreg() template. | 437   // Common specialized accessors for the set_fpreg() template. | 
| 492   void set_sreg(unsigned code, float value) { | 438   void set_sreg(unsigned code, float value) { | 
| 493     set_fpreg(code, value); | 439     set_fpreg(code, value); | 
| 494   } | 440   } | 
| 495 | 441 | 
| 496   void set_sreg_bits(unsigned code, uint32_t value) { | 442   void set_sreg_bits(unsigned code, uint32_t value) { | 
| 497     set_fpreg(code, value); | 443     set_fpreg(code, value); | 
| 498   } | 444   } | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 618       default: | 564       default: | 
| 619         UNREACHABLE(); | 565         UNREACHABLE(); | 
| 620         return false; | 566         return false; | 
| 621     } | 567     } | 
| 622   } | 568   } | 
| 623 | 569 | 
| 624   bool ConditionFailed(Condition cond) { | 570   bool ConditionFailed(Condition cond) { | 
| 625     return !ConditionPassed(cond); | 571     return !ConditionPassed(cond); | 
| 626   } | 572   } | 
| 627 | 573 | 
| 628   void AddSubHelper(Instruction* instr, int64_t op2); | 574   template<typename T> | 
| 629   int64_t AddWithCarry(unsigned reg_size, | 575   void AddSubHelper(Instruction* instr, T op2); | 
| 630                        bool set_flags, | 576   template<typename T> | 
| 631                        int64_t src1, | 577   T AddWithCarry(bool set_flags, | 
| 632                        int64_t src2, | 578                  T src1, | 
| 633                        int64_t carry_in = 0); | 579                  T src2, | 
| 634   void LogicalHelper(Instruction* instr, int64_t op2); | 580                  T carry_in = 0); | 
| 635   void ConditionalCompareHelper(Instruction* instr, int64_t op2); | 581   template<typename T> | 
|  | 582   void AddSubWithCarry(Instruction* instr); | 
|  | 583   template<typename T> | 
|  | 584   void LogicalHelper(Instruction* instr, T op2); | 
|  | 585   template<typename T> | 
|  | 586   void ConditionalCompareHelper(Instruction* instr, T op2); | 
| 636   void LoadStoreHelper(Instruction* instr, | 587   void LoadStoreHelper(Instruction* instr, | 
| 637                        int64_t offset, | 588                        int64_t offset, | 
| 638                        AddrMode addrmode); | 589                        AddrMode addrmode); | 
| 639   void LoadStorePairHelper(Instruction* instr, AddrMode addrmode); | 590   void LoadStorePairHelper(Instruction* instr, AddrMode addrmode); | 
| 640   uint8_t* LoadStoreAddress(unsigned addr_reg, | 591   uint8_t* LoadStoreAddress(unsigned addr_reg, | 
| 641                             int64_t offset, | 592                             int64_t offset, | 
| 642                             AddrMode addrmode); | 593                             AddrMode addrmode); | 
| 643   void LoadStoreWriteBack(unsigned addr_reg, | 594   void LoadStoreWriteBack(unsigned addr_reg, | 
| 644                           int64_t offset, | 595                           int64_t offset, | 
| 645                           AddrMode addrmode); | 596                           AddrMode addrmode); | 
| 646   void CheckMemoryAccess(uint8_t* address, uint8_t* stack); | 597   void CheckMemoryAccess(uint8_t* address, uint8_t* stack); | 
| 647 | 598 | 
| 648   uint64_t MemoryRead(uint8_t* address, unsigned num_bytes); | 599   uint64_t MemoryRead(uint8_t* address, unsigned num_bytes); | 
| 649   uint8_t MemoryRead8(uint8_t* address); | 600   uint8_t MemoryRead8(uint8_t* address); | 
| 650   uint16_t MemoryRead16(uint8_t* address); | 601   uint16_t MemoryRead16(uint8_t* address); | 
| 651   uint32_t MemoryRead32(uint8_t* address); | 602   uint32_t MemoryRead32(uint8_t* address); | 
| 652   float MemoryReadFP32(uint8_t* address); | 603   float MemoryReadFP32(uint8_t* address); | 
| 653   uint64_t MemoryRead64(uint8_t* address); | 604   uint64_t MemoryRead64(uint8_t* address); | 
| 654   double MemoryReadFP64(uint8_t* address); | 605   double MemoryReadFP64(uint8_t* address); | 
| 655 | 606 | 
| 656   void MemoryWrite(uint8_t* address, uint64_t value, unsigned num_bytes); | 607   void MemoryWrite(uint8_t* address, uint64_t value, unsigned num_bytes); | 
| 657   void MemoryWrite32(uint8_t* address, uint32_t value); | 608   void MemoryWrite32(uint8_t* address, uint32_t value); | 
| 658   void MemoryWriteFP32(uint8_t* address, float value); | 609   void MemoryWriteFP32(uint8_t* address, float value); | 
| 659   void MemoryWrite64(uint8_t* address, uint64_t value); | 610   void MemoryWrite64(uint8_t* address, uint64_t value); | 
| 660   void MemoryWriteFP64(uint8_t* address, double value); | 611   void MemoryWriteFP64(uint8_t* address, double value); | 
| 661 | 612 | 
| 662   int64_t ShiftOperand(unsigned reg_size, | 613 | 
| 663                        int64_t value, | 614   template <typename T> | 
| 664                        Shift shift_type, | 615   T ShiftOperand(T value, | 
| 665                        unsigned amount); |  | 
| 666   int64_t Rotate(unsigned reg_width, |  | 
| 667                  int64_t value, |  | 
| 668                  Shift shift_type, | 616                  Shift shift_type, | 
| 669                  unsigned amount); | 617                  unsigned amount); | 
| 670   int64_t ExtendValue(unsigned reg_width, | 618   template <typename T> | 
| 671                       int64_t value, | 619   T ExtendValue(T value, | 
| 672                       Extend extend_type, | 620                 Extend extend_type, | 
| 673                       unsigned left_shift = 0); | 621                 unsigned left_shift = 0); | 
|  | 622   template <typename T> | 
|  | 623   void Extract(Instruction* instr); | 
|  | 624   template <typename T> | 
|  | 625   void DataProcessing2Source(Instruction* instr); | 
|  | 626   template <typename T> | 
|  | 627   void BitfieldHelper(Instruction* instr); | 
| 674 | 628 | 
| 675   uint64_t ReverseBits(uint64_t value, unsigned num_bits); | 629   uint64_t ReverseBits(uint64_t value, unsigned num_bits); | 
| 676   uint64_t ReverseBytes(uint64_t value, ReverseByteMode mode); | 630   uint64_t ReverseBytes(uint64_t value, ReverseByteMode mode); | 
| 677 | 631 | 
| 678   template <typename T> | 632   template <typename T> | 
| 679   T FPDefaultNaN() const; | 633   T FPDefaultNaN() const; | 
| 680 | 634 | 
| 681   void FPCompare(double val0, double val1); | 635   void FPCompare(double val0, double val1); | 
| 682   double FPRoundInt(double value, FPRounding round_mode); | 636   double FPRoundInt(double value, FPRounding round_mode); | 
| 683   double FPToDouble(float value); | 637   double FPToDouble(float value); | 
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 789   // functions, or to save and restore it when entering and leaving generated | 743   // functions, or to save and restore it when entering and leaving generated | 
| 790   // code. | 744   // code. | 
| 791   void AssertSupportedFPCR() { | 745   void AssertSupportedFPCR() { | 
| 792     ASSERT(fpcr().FZ() == 0);             // No flush-to-zero support. | 746     ASSERT(fpcr().FZ() == 0);             // No flush-to-zero support. | 
| 793     ASSERT(fpcr().RMode() == FPTieEven);  // Ties-to-even rounding only. | 747     ASSERT(fpcr().RMode() == FPTieEven);  // Ties-to-even rounding only. | 
| 794 | 748 | 
| 795     // The simulator does not support half-precision operations so fpcr().AHP() | 749     // The simulator does not support half-precision operations so fpcr().AHP() | 
| 796     // is irrelevant, and is not checked here. | 750     // is irrelevant, and is not checked here. | 
| 797   } | 751   } | 
| 798 | 752 | 
| 799   static int CalcNFlag(uint64_t result, unsigned reg_size) { | 753   template <typename T> | 
| 800     return (result >> (reg_size - 1)) & 1; | 754   static int CalcNFlag(T result) { | 
|  | 755     return (result >> (sizeof(T) * 8 - 1)) & 1; | 
| 801   } | 756   } | 
| 802 | 757 | 
| 803   static int CalcZFlag(uint64_t result) { | 758   static int CalcZFlag(uint64_t result) { | 
| 804     return result == 0; | 759     return result == 0; | 
| 805   } | 760   } | 
| 806 | 761 | 
| 807   static const uint32_t kConditionFlagsMask = 0xf0000000; | 762   static const uint32_t kConditionFlagsMask = 0xf0000000; | 
| 808 | 763 | 
| 809   // Stack | 764   // Stack | 
| 810   byte* stack_; | 765   byte* stack_; | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 873   static void UnregisterCTryCatch() { | 828   static void UnregisterCTryCatch() { | 
| 874     Simulator::current(Isolate::Current())->PopAddress(); | 829     Simulator::current(Isolate::Current())->PopAddress(); | 
| 875   } | 830   } | 
| 876 }; | 831 }; | 
| 877 | 832 | 
| 878 #endif  // !defined(USE_SIMULATOR) | 833 #endif  // !defined(USE_SIMULATOR) | 
| 879 | 834 | 
| 880 } }  // namespace v8::internal | 835 } }  // namespace v8::internal | 
| 881 | 836 | 
| 882 #endif  // V8_ARM64_SIMULATOR_ARM64_H_ | 837 #endif  // V8_ARM64_SIMULATOR_ARM64_H_ | 
| OLD | NEW | 
|---|