Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(701)

Side by Side Diff: src/a64/simulator-a64.h

Issue 199083005: A64: Fix a few simulation inaccuracies. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/a64/instructions-a64.h ('k') | src/a64/simulator-a64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 set_fpreg(code, value); 530 set_fpreg(code, value);
531 } 531 }
532 532
533 bool N() { return nzcv_.N() != 0; } 533 bool N() { return nzcv_.N() != 0; }
534 bool Z() { return nzcv_.Z() != 0; } 534 bool Z() { return nzcv_.Z() != 0; }
535 bool C() { return nzcv_.C() != 0; } 535 bool C() { return nzcv_.C() != 0; }
536 bool V() { return nzcv_.V() != 0; } 536 bool V() { return nzcv_.V() != 0; }
537 SimSystemRegister& nzcv() { return nzcv_; } 537 SimSystemRegister& nzcv() { return nzcv_; }
538 538
539 // TODO(jbramley): Find a way to make the fpcr_ members return the proper 539 // TODO(jbramley): Find a way to make the fpcr_ members return the proper
540 // types, so this accessor is not necessary. 540 // types, so these accessors are not necessary.
541 FPRounding RMode() { return static_cast<FPRounding>(fpcr_.RMode()); } 541 FPRounding RMode() { return static_cast<FPRounding>(fpcr_.RMode()); }
542 bool DN() { return fpcr_.DN() != 0; }
542 SimSystemRegister& fpcr() { return fpcr_; } 543 SimSystemRegister& fpcr() { return fpcr_; }
543 544
544 // Debug helpers 545 // Debug helpers
545 546
546 // Simulator breakpoints. 547 // Simulator breakpoints.
547 struct Breakpoint { 548 struct Breakpoint {
548 Instruction* location; 549 Instruction* location;
549 bool enabled; 550 bool enabled;
550 }; 551 };
551 std::vector<Breakpoint> breakpoints_; 552 std::vector<Breakpoint> breakpoints_;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 Shift shift_type, 701 Shift shift_type,
701 unsigned amount); 702 unsigned amount);
702 int64_t ExtendValue(unsigned reg_width, 703 int64_t ExtendValue(unsigned reg_width,
703 int64_t value, 704 int64_t value,
704 Extend extend_type, 705 Extend extend_type,
705 unsigned left_shift = 0); 706 unsigned left_shift = 0);
706 707
707 uint64_t ReverseBits(uint64_t value, unsigned num_bits); 708 uint64_t ReverseBits(uint64_t value, unsigned num_bits);
708 uint64_t ReverseBytes(uint64_t value, ReverseByteMode mode); 709 uint64_t ReverseBytes(uint64_t value, ReverseByteMode mode);
709 710
711 template <typename T>
712 T FPDefaultNaN() const;
713
710 void FPCompare(double val0, double val1); 714 void FPCompare(double val0, double val1);
711 double FPRoundInt(double value, FPRounding round_mode); 715 double FPRoundInt(double value, FPRounding round_mode);
712 double FPToDouble(float value); 716 double FPToDouble(float value);
713 float FPToFloat(double value, FPRounding round_mode); 717 float FPToFloat(double value, FPRounding round_mode);
714 double FixedToDouble(int64_t src, int fbits, FPRounding round_mode); 718 double FixedToDouble(int64_t src, int fbits, FPRounding round_mode);
715 double UFixedToDouble(uint64_t src, int fbits, FPRounding round_mode); 719 double UFixedToDouble(uint64_t src, int fbits, FPRounding round_mode);
716 float FixedToFloat(int64_t src, int fbits, FPRounding round_mode); 720 float FixedToFloat(int64_t src, int fbits, FPRounding round_mode);
717 float UFixedToFloat(uint64_t src, int fbits, FPRounding round_mode); 721 float UFixedToFloat(uint64_t src, int fbits, FPRounding round_mode);
718 int32_t FPToInt32(double value, FPRounding rmode); 722 int32_t FPToInt32(double value, FPRounding rmode);
719 int64_t FPToInt64(double value, FPRounding rmode); 723 int64_t FPToInt64(double value, FPRounding rmode);
720 uint32_t FPToUInt32(double value, FPRounding rmode); 724 uint32_t FPToUInt32(double value, FPRounding rmode);
721 uint64_t FPToUInt64(double value, FPRounding rmode); 725 uint64_t FPToUInt64(double value, FPRounding rmode);
722 726
723 template <typename T> 727 template <typename T>
728 T FPAdd(T op1, T op2);
729
730 template <typename T>
731 T FPDiv(T op1, T op2);
732
733 template <typename T>
724 T FPMax(T a, T b); 734 T FPMax(T a, T b);
725 735
726 template <typename T> 736 template <typename T>
727 T FPMin(T a, T b); 737 T FPMaxNM(T a, T b);
728 738
729 template <typename T> 739 template <typename T>
730 T FPMaxNM(T a, T b); 740 T FPMin(T a, T b);
731 741
732 template <typename T> 742 template <typename T>
733 T FPMinNM(T a, T b); 743 T FPMinNM(T a, T b);
734 744
745 template <typename T>
746 T FPMul(T op1, T op2);
747
748 template <typename T>
749 T FPMulAdd(T a, T op1, T op2);
750
751 template <typename T>
752 T FPSqrt(T op);
753
754 template <typename T>
755 T FPSub(T op1, T op2);
756
757 // Standard NaN processing.
758 template <typename T>
759 T FPProcessNaN(T op);
760
761 bool FPProcessNaNs(Instruction* instr);
762
763 template <typename T>
764 T FPProcessNaNs(T op1, T op2);
765
766 template <typename T>
767 T FPProcessNaNs3(T op1, T op2, T op3);
768
735 void CheckStackAlignment(); 769 void CheckStackAlignment();
736 770
737 inline void CheckPCSComplianceAndRun(); 771 inline void CheckPCSComplianceAndRun();
738 772
739 #ifdef DEBUG 773 #ifdef DEBUG
740 // Corruption values should have their least significant byte cleared to 774 // Corruption values should have their least significant byte cleared to
741 // allow the code of the register being corrupted to be inserted. 775 // allow the code of the register being corrupted to be inserted.
742 static const uint64_t kCallerSavedRegisterCorruptionValue = 776 static const uint64_t kCallerSavedRegisterCorruptionValue =
743 0xca11edc0de000000UL; 777 0xca11edc0de000000UL;
744 // This value is a NaN in both 32-bit and 64-bit FP. 778 // This value is a NaN in both 32-bit and 64-bit FP.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 SimSystemRegister fpcr_; 811 SimSystemRegister fpcr_;
778 812
779 // Only a subset of FPCR features are supported by the simulator. This helper 813 // Only a subset of FPCR features are supported by the simulator. This helper
780 // checks that the FPCR settings are supported. 814 // checks that the FPCR settings are supported.
781 // 815 //
782 // This is checked when floating-point instructions are executed, not when 816 // This is checked when floating-point instructions are executed, not when
783 // FPCR is set. This allows generated code to modify FPCR for external 817 // FPCR is set. This allows generated code to modify FPCR for external
784 // functions, or to save and restore it when entering and leaving generated 818 // functions, or to save and restore it when entering and leaving generated
785 // code. 819 // code.
786 void AssertSupportedFPCR() { 820 void AssertSupportedFPCR() {
787 ASSERT(fpcr().DN() == 0); // No default-NaN support.
788 ASSERT(fpcr().FZ() == 0); // No flush-to-zero support. 821 ASSERT(fpcr().FZ() == 0); // No flush-to-zero support.
789 ASSERT(fpcr().RMode() == FPTieEven); // Ties-to-even rounding only. 822 ASSERT(fpcr().RMode() == FPTieEven); // Ties-to-even rounding only.
790 823
791 // The simulator does not support half-precision operations so fpcr().AHP() 824 // The simulator does not support half-precision operations so fpcr().AHP()
792 // is irrelevant, and is not checked here. 825 // is irrelevant, and is not checked here.
793 } 826 }
794 827
795 static int CalcNFlag(uint64_t result, unsigned reg_size) { 828 static int CalcNFlag(uint64_t result, unsigned reg_size) {
796 return (result >> (reg_size - 1)) & 1; 829 return (result >> (reg_size - 1)) & 1;
797 } 830 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 static void UnregisterCTryCatch() { 907 static void UnregisterCTryCatch() {
875 Simulator::current(Isolate::Current())->PopAddress(); 908 Simulator::current(Isolate::Current())->PopAddress();
876 } 909 }
877 }; 910 };
878 911
879 #endif // !defined(USE_SIMULATOR) 912 #endif // !defined(USE_SIMULATOR)
880 913
881 } } // namespace v8::internal 914 } } // namespace v8::internal
882 915
883 #endif // V8_A64_SIMULATOR_A64_H_ 916 #endif // V8_A64_SIMULATOR_A64_H_
OLDNEW
« no previous file with comments | « src/a64/instructions-a64.h ('k') | src/a64/simulator-a64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698