| 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 | 128 |
| 129 int32_t SignedBits(int msb, int lsb) const { | 129 int32_t SignedBits(int msb, int lsb) const { |
| 130 return signed_bitextract_32(msb, lsb, value_); | 130 return signed_bitextract_32(msb, lsb, value_); |
| 131 } | 131 } |
| 132 | 132 |
| 133 void SetBits(int msb, int lsb, uint32_t bits); | 133 void SetBits(int msb, int lsb, uint32_t bits); |
| 134 | 134 |
| 135 // Default system register values. | 135 // Default system register values. |
| 136 static SimSystemRegister DefaultValueFor(SystemRegister id); | 136 static SimSystemRegister DefaultValueFor(SystemRegister id); |
| 137 | 137 |
| 138 #define DEFINE_GETTER(Name, HighBit, LowBit, Func) \ | 138 #define DEFINE_GETTER(Name, HighBit, LowBit, Func, Type) \ |
| 139 uint32_t Name() const { return Func(HighBit, LowBit); } \ | 139 Type Name() const { return static_cast<Type>(Func(HighBit, LowBit)); } \ |
| 140 void Set##Name(uint32_t bits) { SetBits(HighBit, LowBit, bits); } | 140 void Set##Name(Type bits) { \ |
| 141 #define DEFINE_WRITE_IGNORE_MASK(Name, Mask) \ | 141 SetBits(HighBit, LowBit, static_cast<Type>(bits)); \ |
| 142 } |
| 143 #define DEFINE_WRITE_IGNORE_MASK(Name, Mask) \ |
| 142 static const uint32_t Name##WriteIgnoreMask = ~static_cast<uint32_t>(Mask); | 144 static const uint32_t Name##WriteIgnoreMask = ~static_cast<uint32_t>(Mask); |
| 143 | |
| 144 SYSTEM_REGISTER_FIELDS_LIST(DEFINE_GETTER, DEFINE_WRITE_IGNORE_MASK) | 145 SYSTEM_REGISTER_FIELDS_LIST(DEFINE_GETTER, DEFINE_WRITE_IGNORE_MASK) |
| 145 | |
| 146 #undef DEFINE_ZERO_BITS | 146 #undef DEFINE_ZERO_BITS |
| 147 #undef DEFINE_GETTER | 147 #undef DEFINE_GETTER |
| 148 | 148 |
| 149 protected: | 149 protected: |
| 150 // Most system registers only implement a few of the bits in the word. Other | 150 // Most system registers only implement a few of the bits in the word. Other |
| 151 // bits are "read-as-zero, write-ignored". The write_ignore_mask argument | 151 // bits are "read-as-zero, write-ignored". The write_ignore_mask argument |
| 152 // describes the bits which are not modifiable. | 152 // describes the bits which are not modifiable. |
| 153 SimSystemRegister(uint32_t value, uint32_t write_ignore_mask) | 153 SimSystemRegister(uint32_t value, uint32_t write_ignore_mask) |
| 154 : value_(value), write_ignore_mask_(write_ignore_mask) { } | 154 : value_(value), write_ignore_mask_(write_ignore_mask) { } |
| 155 | 155 |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 } | 523 } |
| 524 | 524 |
| 525 void set_dreg(unsigned code, double value) { | 525 void set_dreg(unsigned code, double value) { |
| 526 set_fpreg(code, value); | 526 set_fpreg(code, value); |
| 527 } | 527 } |
| 528 | 528 |
| 529 void set_dreg_bits(unsigned code, uint64_t value) { | 529 void set_dreg_bits(unsigned code, uint64_t value) { |
| 530 set_fpreg(code, value); | 530 set_fpreg(code, value); |
| 531 } | 531 } |
| 532 | 532 |
| 533 bool N() { return nzcv_.N() != 0; } | |
| 534 bool Z() { return nzcv_.Z() != 0; } | |
| 535 bool C() { return nzcv_.C() != 0; } | |
| 536 bool V() { return nzcv_.V() != 0; } | |
| 537 SimSystemRegister& nzcv() { return nzcv_; } | 533 SimSystemRegister& nzcv() { return nzcv_; } |
| 538 | |
| 539 // TODO(jbramley): Find a way to make the fpcr_ members return the proper | |
| 540 // types, so these accessors are not necessary. | |
| 541 FPRounding RMode() { return static_cast<FPRounding>(fpcr_.RMode()); } | |
| 542 bool DN() { return fpcr_.DN() != 0; } | |
| 543 SimSystemRegister& fpcr() { return fpcr_; } | 534 SimSystemRegister& fpcr() { return fpcr_; } |
| 544 | 535 |
| 545 // Debug helpers | 536 // Debug helpers |
| 546 | 537 |
| 547 // Simulator breakpoints. | 538 // Simulator breakpoints. |
| 548 struct Breakpoint { | 539 struct Breakpoint { |
| 549 Instruction* location; | 540 Instruction* location; |
| 550 bool enabled; | 541 bool enabled; |
| 551 }; | 542 }; |
| 552 std::vector<Breakpoint> breakpoints_; | 543 std::vector<Breakpoint> breakpoints_; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 static inline const char* XRegNameForCode(unsigned code, | 600 static inline const char* XRegNameForCode(unsigned code, |
| 610 Reg31Mode mode = Reg31IsZeroRegister); | 601 Reg31Mode mode = Reg31IsZeroRegister); |
| 611 static inline const char* SRegNameForCode(unsigned code); | 602 static inline const char* SRegNameForCode(unsigned code); |
| 612 static inline const char* DRegNameForCode(unsigned code); | 603 static inline const char* DRegNameForCode(unsigned code); |
| 613 static inline const char* VRegNameForCode(unsigned code); | 604 static inline const char* VRegNameForCode(unsigned code); |
| 614 static inline int CodeFromName(const char* name); | 605 static inline int CodeFromName(const char* name); |
| 615 | 606 |
| 616 protected: | 607 protected: |
| 617 // Simulation helpers ------------------------------------ | 608 // Simulation helpers ------------------------------------ |
| 618 bool ConditionPassed(Condition cond) { | 609 bool ConditionPassed(Condition cond) { |
| 610 SimSystemRegister& flags = nzcv(); |
| 619 switch (cond) { | 611 switch (cond) { |
| 620 case eq: | 612 case eq: |
| 621 return Z(); | 613 return flags.Z(); |
| 622 case ne: | 614 case ne: |
| 623 return !Z(); | 615 return !flags.Z(); |
| 624 case hs: | 616 case hs: |
| 625 return C(); | 617 return flags.C(); |
| 626 case lo: | 618 case lo: |
| 627 return !C(); | 619 return !flags.C(); |
| 628 case mi: | 620 case mi: |
| 629 return N(); | 621 return flags.N(); |
| 630 case pl: | 622 case pl: |
| 631 return !N(); | 623 return !flags.N(); |
| 632 case vs: | 624 case vs: |
| 633 return V(); | 625 return flags.V(); |
| 634 case vc: | 626 case vc: |
| 635 return !V(); | 627 return !flags.V(); |
| 636 case hi: | 628 case hi: |
| 637 return C() && !Z(); | 629 return flags.C() && !flags.Z(); |
| 638 case ls: | 630 case ls: |
| 639 return !(C() && !Z()); | 631 return !(flags.C() && !flags.Z()); |
| 640 case ge: | 632 case ge: |
| 641 return N() == V(); | 633 return flags.N() == flags.V(); |
| 642 case lt: | 634 case lt: |
| 643 return N() != V(); | 635 return flags.N() != flags.V(); |
| 644 case gt: | 636 case gt: |
| 645 return !Z() && (N() == V()); | 637 return !flags.Z() && (flags.N() == flags.V()); |
| 646 case le: | 638 case le: |
| 647 return !(!Z() && (N() == V())); | 639 return !(!flags.Z() && (flags.N() == flags.V())); |
| 648 case nv: // Fall through. | 640 case nv: // Fall through. |
| 649 case al: | 641 case al: |
| 650 return true; | 642 return true; |
| 651 default: | 643 default: |
| 652 UNREACHABLE(); | 644 UNREACHABLE(); |
| 653 return false; | 645 return false; |
| 654 } | 646 } |
| 655 } | 647 } |
| 656 | 648 |
| 657 bool ConditionFailed(Condition cond) { | 649 bool ConditionFailed(Condition cond) { |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 static void UnregisterCTryCatch() { | 899 static void UnregisterCTryCatch() { |
| 908 Simulator::current(Isolate::Current())->PopAddress(); | 900 Simulator::current(Isolate::Current())->PopAddress(); |
| 909 } | 901 } |
| 910 }; | 902 }; |
| 911 | 903 |
| 912 #endif // !defined(USE_SIMULATOR) | 904 #endif // !defined(USE_SIMULATOR) |
| 913 | 905 |
| 914 } } // namespace v8::internal | 906 } } // namespace v8::internal |
| 915 | 907 |
| 916 #endif // V8_A64_SIMULATOR_A64_H_ | 908 #endif // V8_A64_SIMULATOR_A64_H_ |
| OLD | NEW |