OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 #ifdef _MIPS_ARCH_MIPS32R2 | 43 #ifdef _MIPS_ARCH_MIPS32R2 |
44 #define mips32r2 1 | 44 #define mips32r2 1 |
45 #else | 45 #else |
46 #define mips32r2 0 | 46 #define mips32r2 0 |
47 #endif | 47 #endif |
48 | 48 |
49 | 49 |
50 #if(defined(__mips_hard_float) && __mips_hard_float != 0) | 50 #if(defined(__mips_hard_float) && __mips_hard_float != 0) |
51 // Use floating-point coprocessor instructions. This flag is raised when | 51 // Use floating-point coprocessor instructions. This flag is raised when |
52 // -mhard-float is passed to the compiler. | 52 // -mhard-float is passed to the compiler. |
53 static const bool IsMipsSoftFloatABI = false; | 53 const bool IsMipsSoftFloatABI = false; |
54 #elif(defined(__mips_soft_float) && __mips_soft_float != 0) | 54 #elif(defined(__mips_soft_float) && __mips_soft_float != 0) |
55 // Not using floating-point coprocessor instructions. This flag is raised when | 55 // Not using floating-point coprocessor instructions. This flag is raised when |
56 // -msoft-float is passed to the compiler. | 56 // -msoft-float is passed to the compiler. |
57 static const bool IsMipsSoftFloatABI = true; | 57 const bool IsMipsSoftFloatABI = true; |
58 #else | 58 #else |
59 static const bool IsMipsSoftFloatABI = true; | 59 const bool IsMipsSoftFloatABI = true; |
60 #endif | 60 #endif |
61 | 61 |
62 | 62 |
63 // Defines constants and accessor classes to assemble, disassemble and | 63 // Defines constants and accessor classes to assemble, disassemble and |
64 // simulate MIPS32 instructions. | 64 // simulate MIPS32 instructions. |
65 // | 65 // |
66 // See: MIPS32 Architecture For Programmers | 66 // See: MIPS32 Architecture For Programmers |
67 // Volume II: The MIPS32 Instruction Set | 67 // Volume II: The MIPS32 Instruction Set |
68 // Try www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf. | 68 // Try www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf. |
69 | 69 |
70 namespace v8 { | 70 namespace v8 { |
71 namespace internal { | 71 namespace internal { |
72 | 72 |
73 // ----------------------------------------------------------------------------- | 73 // ----------------------------------------------------------------------------- |
74 // Registers and FPURegisters. | 74 // Registers and FPURegisters. |
75 | 75 |
76 // Number of general purpose registers. | 76 // Number of general purpose registers. |
77 static const int kNumRegisters = 32; | 77 const int kNumRegisters = 32; |
78 static const int kInvalidRegister = -1; | 78 const int kInvalidRegister = -1; |
79 | 79 |
80 // Number of registers with HI, LO, and pc. | 80 // Number of registers with HI, LO, and pc. |
81 static const int kNumSimuRegisters = 35; | 81 const int kNumSimuRegisters = 35; |
82 | 82 |
83 // In the simulator, the PC register is simulated as the 34th register. | 83 // In the simulator, the PC register is simulated as the 34th register. |
84 static const int kPCRegister = 34; | 84 const int kPCRegister = 34; |
85 | 85 |
86 // Number coprocessor registers. | 86 // Number coprocessor registers. |
87 static const int kNumFPURegisters = 32; | 87 const int kNumFPURegisters = 32; |
88 static const int kInvalidFPURegister = -1; | 88 const int kInvalidFPURegister = -1; |
89 | 89 |
90 // FPU (coprocessor 1) control registers. Currently only FCSR is implemented. | 90 // FPU (coprocessor 1) control registers. Currently only FCSR is implemented. |
91 static const int kFCSRRegister = 31; | 91 const int kFCSRRegister = 31; |
92 static const int kInvalidFPUControlRegister = -1; | 92 const int kInvalidFPUControlRegister = -1; |
93 static const uint32_t kFPUInvalidResult = (uint32_t) (1 << 31) - 1; | 93 const uint32_t kFPUInvalidResult = (uint32_t) (1 << 31) - 1; |
94 | 94 |
95 // FCSR constants. | 95 // FCSR constants. |
96 static const uint32_t kFCSRInexactFlagBit = 2; | 96 const uint32_t kFCSRInexactFlagBit = 2; |
97 static const uint32_t kFCSRUnderflowFlagBit = 3; | 97 const uint32_t kFCSRUnderflowFlagBit = 3; |
98 static const uint32_t kFCSROverflowFlagBit = 4; | 98 const uint32_t kFCSROverflowFlagBit = 4; |
99 static const uint32_t kFCSRDivideByZeroFlagBit = 5; | 99 const uint32_t kFCSRDivideByZeroFlagBit = 5; |
100 static const uint32_t kFCSRInvalidOpFlagBit = 6; | 100 const uint32_t kFCSRInvalidOpFlagBit = 6; |
101 | 101 |
102 static const uint32_t kFCSRInexactFlagMask = 1 << kFCSRInexactFlagBit; | 102 const uint32_t kFCSRInexactFlagMask = 1 << kFCSRInexactFlagBit; |
103 static const uint32_t kFCSRUnderflowFlagMask = 1 << kFCSRUnderflowFlagBit; | 103 const uint32_t kFCSRUnderflowFlagMask = 1 << kFCSRUnderflowFlagBit; |
104 static const uint32_t kFCSROverflowFlagMask = 1 << kFCSROverflowFlagBit; | 104 const uint32_t kFCSROverflowFlagMask = 1 << kFCSROverflowFlagBit; |
105 static const uint32_t kFCSRDivideByZeroFlagMask = 1 << kFCSRDivideByZeroFlagBit; | 105 const uint32_t kFCSRDivideByZeroFlagMask = 1 << kFCSRDivideByZeroFlagBit; |
106 static const uint32_t kFCSRInvalidOpFlagMask = 1 << kFCSRInvalidOpFlagBit; | 106 const uint32_t kFCSRInvalidOpFlagMask = 1 << kFCSRInvalidOpFlagBit; |
107 | 107 |
108 static const uint32_t kFCSRFlagMask = | 108 const uint32_t kFCSRFlagMask = |
109 kFCSRInexactFlagMask | | 109 kFCSRInexactFlagMask | |
110 kFCSRUnderflowFlagMask | | 110 kFCSRUnderflowFlagMask | |
111 kFCSROverflowFlagMask | | 111 kFCSROverflowFlagMask | |
112 kFCSRDivideByZeroFlagMask | | 112 kFCSRDivideByZeroFlagMask | |
113 kFCSRInvalidOpFlagMask; | 113 kFCSRInvalidOpFlagMask; |
114 | 114 |
115 static const uint32_t kFCSRExceptionFlagMask = | 115 const uint32_t kFCSRExceptionFlagMask = kFCSRFlagMask ^ kFCSRInexactFlagMask; |
116 kFCSRFlagMask ^ kFCSRInexactFlagMask; | |
117 | 116 |
118 // Helper functions for converting between register numbers and names. | 117 // Helper functions for converting between register numbers and names. |
119 class Registers { | 118 class Registers { |
120 public: | 119 public: |
121 // Return the name of the register. | 120 // Return the name of the register. |
122 static const char* Name(int reg); | 121 static const char* Name(int reg); |
123 | 122 |
124 // Lookup the register number for the name provided. | 123 // Lookup the register number for the name provided. |
125 static int Number(const char* name); | 124 static int Number(const char* name); |
126 | 125 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 call_rt_redirected = 0xfffff | 169 call_rt_redirected = 0xfffff |
171 }; | 170 }; |
172 | 171 |
173 // On MIPS Simulator breakpoints can have different codes: | 172 // On MIPS Simulator breakpoints can have different codes: |
174 // - Breaks between 0 and kMaxWatchpointCode are treated as simple watchpoints, | 173 // - Breaks between 0 and kMaxWatchpointCode are treated as simple watchpoints, |
175 // the simulator will run through them and print the registers. | 174 // the simulator will run through them and print the registers. |
176 // - Breaks between kMaxWatchpointCode and kMaxStopCode are treated as stop() | 175 // - Breaks between kMaxWatchpointCode and kMaxStopCode are treated as stop() |
177 // instructions (see Assembler::stop()). | 176 // instructions (see Assembler::stop()). |
178 // - Breaks larger than kMaxStopCode are simple breaks, dropping you into the | 177 // - Breaks larger than kMaxStopCode are simple breaks, dropping you into the |
179 // debugger. | 178 // debugger. |
180 static const uint32_t kMaxWatchpointCode = 31; | 179 const uint32_t kMaxWatchpointCode = 31; |
181 static const uint32_t kMaxStopCode = 127; | 180 const uint32_t kMaxStopCode = 127; |
182 STATIC_ASSERT(kMaxWatchpointCode < kMaxStopCode); | 181 STATIC_ASSERT(kMaxWatchpointCode < kMaxStopCode); |
183 | 182 |
184 | 183 |
185 // ----- Fields offset and length. | 184 // ----- Fields offset and length. |
186 static const int kOpcodeShift = 26; | 185 const int kOpcodeShift = 26; |
187 static const int kOpcodeBits = 6; | 186 const int kOpcodeBits = 6; |
188 static const int kRsShift = 21; | 187 const int kRsShift = 21; |
189 static const int kRsBits = 5; | 188 const int kRsBits = 5; |
190 static const int kRtShift = 16; | 189 const int kRtShift = 16; |
191 static const int kRtBits = 5; | 190 const int kRtBits = 5; |
192 static const int kRdShift = 11; | 191 const int kRdShift = 11; |
193 static const int kRdBits = 5; | 192 const int kRdBits = 5; |
194 static const int kSaShift = 6; | 193 const int kSaShift = 6; |
195 static const int kSaBits = 5; | 194 const int kSaBits = 5; |
196 static const int kFunctionShift = 0; | 195 const int kFunctionShift = 0; |
197 static const int kFunctionBits = 6; | 196 const int kFunctionBits = 6; |
198 static const int kLuiShift = 16; | 197 const int kLuiShift = 16; |
199 | 198 |
200 static const int kImm16Shift = 0; | 199 const int kImm16Shift = 0; |
201 static const int kImm16Bits = 16; | 200 const int kImm16Bits = 16; |
202 static const int kImm26Shift = 0; | 201 const int kImm26Shift = 0; |
203 static const int kImm26Bits = 26; | 202 const int kImm26Bits = 26; |
204 static const int kImm28Shift = 0; | 203 const int kImm28Shift = 0; |
205 static const int kImm28Bits = 28; | 204 const int kImm28Bits = 28; |
206 | 205 |
207 // In branches and jumps immediate fields point to words, not bytes, | 206 // In branches and jumps immediate fields point to words, not bytes, |
208 // and are therefore shifted by 2. | 207 // and are therefore shifted by 2. |
209 static const int kImmFieldShift = 2; | 208 const int kImmFieldShift = 2; |
210 | 209 |
211 static const int kFsShift = 11; | 210 const int kFsShift = 11; |
212 static const int kFsBits = 5; | 211 const int kFsBits = 5; |
213 static const int kFtShift = 16; | 212 const int kFtShift = 16; |
214 static const int kFtBits = 5; | 213 const int kFtBits = 5; |
215 static const int kFdShift = 6; | 214 const int kFdShift = 6; |
216 static const int kFdBits = 5; | 215 const int kFdBits = 5; |
217 static const int kFCccShift = 8; | 216 const int kFCccShift = 8; |
218 static const int kFCccBits = 3; | 217 const int kFCccBits = 3; |
219 static const int kFBccShift = 18; | 218 const int kFBccShift = 18; |
220 static const int kFBccBits = 3; | 219 const int kFBccBits = 3; |
221 static const int kFBtrueShift = 16; | 220 const int kFBtrueShift = 16; |
222 static const int kFBtrueBits = 1; | 221 const int kFBtrueBits = 1; |
223 | 222 |
224 // ----- Miscellaneous useful masks. | 223 // ----- Miscellaneous useful masks. |
225 // Instruction bit masks. | 224 // Instruction bit masks. |
226 static const int kOpcodeMask = ((1 << kOpcodeBits) - 1) << kOpcodeShift; | 225 const int kOpcodeMask = ((1 << kOpcodeBits) - 1) << kOpcodeShift; |
227 static const int kImm16Mask = ((1 << kImm16Bits) - 1) << kImm16Shift; | 226 const int kImm16Mask = ((1 << kImm16Bits) - 1) << kImm16Shift; |
228 static const int kImm26Mask = ((1 << kImm26Bits) - 1) << kImm26Shift; | 227 const int kImm26Mask = ((1 << kImm26Bits) - 1) << kImm26Shift; |
229 static const int kImm28Mask = ((1 << kImm28Bits) - 1) << kImm28Shift; | 228 const int kImm28Mask = ((1 << kImm28Bits) - 1) << kImm28Shift; |
230 static const int kRsFieldMask = ((1 << kRsBits) - 1) << kRsShift; | 229 const int kRsFieldMask = ((1 << kRsBits) - 1) << kRsShift; |
231 static const int kRtFieldMask = ((1 << kRtBits) - 1) << kRtShift; | 230 const int kRtFieldMask = ((1 << kRtBits) - 1) << kRtShift; |
232 static const int kRdFieldMask = ((1 << kRdBits) - 1) << kRdShift; | 231 const int kRdFieldMask = ((1 << kRdBits) - 1) << kRdShift; |
233 static const int kSaFieldMask = ((1 << kSaBits) - 1) << kSaShift; | 232 const int kSaFieldMask = ((1 << kSaBits) - 1) << kSaShift; |
234 static const int kFunctionFieldMask = | 233 const int kFunctionFieldMask = ((1 << kFunctionBits) - 1) << kFunctionShift; |
235 ((1 << kFunctionBits) - 1) << kFunctionShift; | |
236 // Misc masks. | 234 // Misc masks. |
237 static const int kHiMask = 0xffff << 16; | 235 const int kHiMask = 0xffff << 16; |
238 static const int kLoMask = 0xffff; | 236 const int kLoMask = 0xffff; |
239 static const int kSignMask = 0x80000000; | 237 const int kSignMask = 0x80000000; |
240 static const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1; | 238 const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1; |
241 | 239 |
242 // ----- MIPS Opcodes and Function Fields. | 240 // ----- MIPS Opcodes and Function Fields. |
243 // We use this presentation to stay close to the table representation in | 241 // We use this presentation to stay close to the table representation in |
244 // MIPS32 Architecture For Programmers, Volume II: The MIPS32 Instruction Set. | 242 // MIPS32 Architecture For Programmers, Volume II: The MIPS32 Instruction Set. |
245 enum Opcode { | 243 enum Opcode { |
246 SPECIAL = 0 << kOpcodeShift, | 244 SPECIAL = 0 << kOpcodeShift, |
247 REGIMM = 1 << kOpcodeShift, | 245 REGIMM = 1 << kOpcodeShift, |
248 | 246 |
249 J = ((0 << 3) + 2) << kOpcodeShift, | 247 J = ((0 << 3) + 2) << kOpcodeShift, |
250 JAL = ((0 << 3) + 3) << kOpcodeShift, | 248 JAL = ((0 << 3) + 3) << kOpcodeShift, |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 RP = 2 << 0, // Round towards Plus Infinity. | 520 RP = 2 << 0, // Round towards Plus Infinity. |
523 RM = 3 << 0, // Round towards Minus Infinity. | 521 RM = 3 << 0, // Round towards Minus Infinity. |
524 | 522 |
525 // Aliases. | 523 // Aliases. |
526 kRoundToNearest = RN, | 524 kRoundToNearest = RN, |
527 kRoundToZero = RZ, | 525 kRoundToZero = RZ, |
528 kRoundToPlusInf = RP, | 526 kRoundToPlusInf = RP, |
529 kRoundToMinusInf = RM | 527 kRoundToMinusInf = RM |
530 }; | 528 }; |
531 | 529 |
532 static const uint32_t kFPURoundingModeMask = 3 << 0; | 530 const uint32_t kFPURoundingModeMask = 3 << 0; |
533 | 531 |
534 enum CheckForInexactConversion { | 532 enum CheckForInexactConversion { |
535 kCheckForInexactConversion, | 533 kCheckForInexactConversion, |
536 kDontCheckForInexactConversion | 534 kDontCheckForInexactConversion |
537 }; | 535 }; |
538 | 536 |
539 | 537 |
540 // ----------------------------------------------------------------------------- | 538 // ----------------------------------------------------------------------------- |
541 // Hints. | 539 // Hints. |
542 | 540 |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 private: | 763 private: |
766 // We need to prevent the creation of instances of class Instruction. | 764 // We need to prevent the creation of instances of class Instruction. |
767 DISALLOW_IMPLICIT_CONSTRUCTORS(Instruction); | 765 DISALLOW_IMPLICIT_CONSTRUCTORS(Instruction); |
768 }; | 766 }; |
769 | 767 |
770 | 768 |
771 // ----------------------------------------------------------------------------- | 769 // ----------------------------------------------------------------------------- |
772 // MIPS assembly various constants. | 770 // MIPS assembly various constants. |
773 | 771 |
774 // C/C++ argument slots size. | 772 // C/C++ argument slots size. |
775 static const int kCArgSlotCount = 4; | 773 const int kCArgSlotCount = 4; |
776 static const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize; | 774 const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize; |
777 // JS argument slots size. | 775 // JS argument slots size. |
778 static const int kJSArgsSlotsSize = 0 * Instruction::kInstrSize; | 776 const int kJSArgsSlotsSize = 0 * Instruction::kInstrSize; |
779 // Assembly builtins argument slots size. | 777 // Assembly builtins argument slots size. |
780 static const int kBArgsSlotsSize = 0 * Instruction::kInstrSize; | 778 const int kBArgsSlotsSize = 0 * Instruction::kInstrSize; |
781 | 779 |
782 static const int kBranchReturnOffset = 2 * Instruction::kInstrSize; | 780 const int kBranchReturnOffset = 2 * Instruction::kInstrSize; |
783 | 781 |
784 static const int kDoubleAlignmentBits = 3; | 782 const int kDoubleAlignmentBits = 3; |
785 static const int kDoubleAlignment = (1 << kDoubleAlignmentBits); | 783 const int kDoubleAlignment = (1 << kDoubleAlignmentBits); |
786 static const int kDoubleAlignmentMask = kDoubleAlignment - 1; | 784 const int kDoubleAlignmentMask = kDoubleAlignment - 1; |
787 | 785 |
788 | 786 |
789 } } // namespace v8::internal | 787 } } // namespace v8::internal |
790 | 788 |
791 #endif // #ifndef V8_MIPS_CONSTANTS_H_ | 789 #endif // #ifndef V8_MIPS_CONSTANTS_H_ |
OLD | NEW |