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 |