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

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

Issue 422063005: Contribution of PowerPC port. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 //
3 // Copyright IBM Corp. 2012, 2013. All rights reserved.
4 //
2 // Use of this source code is governed by a BSD-style license that can be 5 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 6 // found in the LICENSE file.
4 7
5 8
6 // Declares a Simulator for ARM instructions if we are not generating a native 9 // Declares a Simulator for PPC instructions if we are not generating a native
7 // ARM binary. This Simulator allows us to run and debug ARM code generation on 10 // PPC binary. This Simulator allows us to run and debug PPC code generation on
8 // regular desktop machines. 11 // regular desktop machines.
9 // V8 calls into generated code by "calling" the CALL_GENERATED_CODE macro, 12 // V8 calls into generated code by "calling" the CALL_GENERATED_CODE macro,
10 // which will start execution in the Simulator or forwards to the real entry 13 // which will start execution in the Simulator or forwards to the real entry
11 // on a ARM HW platform. 14 // on a PPC HW platform.
12 15
13 #ifndef V8_ARM_SIMULATOR_ARM_H_ 16 #ifndef V8_PPC_SIMULATOR_PPC_H_
14 #define V8_ARM_SIMULATOR_ARM_H_ 17 #define V8_PPC_SIMULATOR_PPC_H_
15 18
16 #include "src/allocation.h" 19 #include "src/allocation.h"
17 20
18 #if !defined(USE_SIMULATOR) 21 #if !defined(USE_SIMULATOR)
19 // Running without a simulator on a native arm platform. 22 // Running without a simulator on a native ppc platform.
20 23
21 namespace v8 { 24 namespace v8 {
22 namespace internal { 25 namespace internal {
23 26
24 // When running without a simulator we call the entry directly. 27 // When running without a simulator we call the entry directly.
25 #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \ 28 #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \
26 (entry(p0, p1, p2, p3, p4)) 29 (entry(p0, p1, p2, p3, p4))
27 30
28 typedef int (*arm_regexp_matcher)(String*, int, const byte*, const byte*, 31 typedef int (*ppc_regexp_matcher)(String*, int, const byte*, const byte*,
29 void*, int*, int, Address, int, Isolate*); 32 int*, int, Address, int, void*, Isolate*);
30 33
31 34
32 // Call the generated regexp code directly. The code at the entry address 35 // Call the generated regexp code directly. The code at the entry address
33 // should act as a function matching the type arm_regexp_matcher. 36 // should act as a function matching the type ppc_regexp_matcher.
34 // The fifth argument is a dummy that reserves the space used for 37 // The ninth argument is a dummy that reserves the space used for
35 // the return address added by the ExitFrame in native calls. 38 // the return address added by the ExitFrame in native calls.
36 #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6, p7, p8) \ 39 #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6, p7, p8) \
37 (FUNCTION_CAST<arm_regexp_matcher>(entry)( \ 40 (FUNCTION_CAST<ppc_regexp_matcher>(entry)( \
38 p0, p1, p2, p3, NULL, p4, p5, p6, p7, p8)) 41 p0, p1, p2, p3, p4, p5, p6, p7, NULL, p8))
39 42
40 // The stack limit beyond which we will throw stack overflow errors in 43 // The stack limit beyond which we will throw stack overflow errors in
41 // generated code. Because generated code on arm uses the C stack, we 44 // generated code. Because generated code on ppc uses the C stack, we
42 // just use the C stack limit. 45 // just use the C stack limit.
43 class SimulatorStack : public v8::internal::AllStatic { 46 class SimulatorStack : public v8::internal::AllStatic {
44 public: 47 public:
45 static inline uintptr_t JsLimitFromCLimit(v8::internal::Isolate* isolate, 48 static inline uintptr_t JsLimitFromCLimit(v8::internal::Isolate* isolate,
46 uintptr_t c_limit) { 49 uintptr_t c_limit) {
47 USE(isolate); 50 USE(isolate);
48 return c_limit; 51 return c_limit;
49 } 52 }
50 53
51 static inline uintptr_t RegisterCTryCatch(uintptr_t try_catch_address) { 54 static inline uintptr_t RegisterCTryCatch(uintptr_t try_catch_address) {
52 return try_catch_address; 55 return try_catch_address;
53 } 56 }
54 57
55 static inline void UnregisterCTryCatch() { } 58 static inline void UnregisterCTryCatch() { }
56 }; 59 };
57 60
58 } } // namespace v8::internal 61 } } // namespace v8::internal
59 62
60 #else // !defined(USE_SIMULATOR) 63 #else // !defined(USE_SIMULATOR)
61 // Running with a simulator. 64 // Running with a simulator.
62 65
63 #include "src/arm/constants-arm.h"
64 #include "src/assembler.h" 66 #include "src/assembler.h"
65 #include "src/hashmap.h" 67 #include "src/hashmap.h"
68 #include "src/ppc/constants-ppc.h"
66 69
67 namespace v8 { 70 namespace v8 {
68 namespace internal { 71 namespace internal {
69 72
70 class CachePage { 73 class CachePage {
71 public: 74 public:
72 static const int LINE_VALID = 0; 75 static const int LINE_VALID = 0;
73 static const int LINE_INVALID = 1; 76 static const int LINE_INVALID = 1;
74 77
75 static const int kPageShift = 12; 78 static const int kPageShift = 12;
(...skipping 17 matching lines...) Expand all
93 96
94 private: 97 private:
95 char data_[kPageSize]; // The cached data. 98 char data_[kPageSize]; // The cached data.
96 static const int kValidityMapSize = kPageSize >> kLineShift; 99 static const int kValidityMapSize = kPageSize >> kLineShift;
97 char validity_map_[kValidityMapSize]; // One byte per line. 100 char validity_map_[kValidityMapSize]; // One byte per line.
98 }; 101 };
99 102
100 103
101 class Simulator { 104 class Simulator {
102 public: 105 public:
103 friend class ArmDebugger; 106 friend class PPCDebugger;
104 enum Register { 107 enum Register {
105 no_reg = -1, 108 no_reg = -1,
106 r0 = 0, r1, r2, r3, r4, r5, r6, r7, 109 r0 = 0, sp, r2, r3, r4, r5, r6, r7,
107 r8, r9, r10, r11, r12, r13, r14, r15, 110 r8, r9, r10, r11, r12, r13, r14, r15,
108 num_registers, 111 r16, r17, r18, r19, r20, r21, r22, r23,
109 sp = 13, 112 r24, r25, r26, r27, r28, r29, r30, fp,
110 lr = 14, 113 kNumGPRs = 32,
111 pc = 15,
112 s0 = 0, s1, s2, s3, s4, s5, s6, s7,
113 s8, s9, s10, s11, s12, s13, s14, s15,
114 s16, s17, s18, s19, s20, s21, s22, s23,
115 s24, s25, s26, s27, s28, s29, s30, s31,
116 num_s_registers = 32,
117 d0 = 0, d1, d2, d3, d4, d5, d6, d7, 114 d0 = 0, d1, d2, d3, d4, d5, d6, d7,
118 d8, d9, d10, d11, d12, d13, d14, d15, 115 d8, d9, d10, d11, d12, d13, d14, d15,
119 d16, d17, d18, d19, d20, d21, d22, d23, 116 d16, d17, d18, d19, d20, d21, d22, d23,
120 d24, d25, d26, d27, d28, d29, d30, d31, 117 d24, d25, d26, d27, d28, d29, d30, d31,
121 num_d_registers = 32, 118 kNumFPRs = 32
122 q0 = 0, q1, q2, q3, q4, q5, q6, q7,
123 q8, q9, q10, q11, q12, q13, q14, q15,
124 num_q_registers = 16
125 }; 119 };
126 120
127 explicit Simulator(Isolate* isolate); 121 explicit Simulator(Isolate* isolate);
128 ~Simulator(); 122 ~Simulator();
129 123
130 // The currently executing Simulator instance. Potentially there can be one 124 // The currently executing Simulator instance. Potentially there can be one
131 // for each native thread. 125 // for each native thread.
132 static Simulator* current(v8::internal::Isolate* isolate); 126 static Simulator* current(v8::internal::Isolate* isolate);
133 127
134 // Accessors for register state. Reading the pc value adheres to the ARM 128 // Accessors for register state.
135 // architecture specification and is off by a 8 from the currently executing 129 void set_register(int reg, intptr_t value);
136 // instruction. 130 intptr_t get_register(int reg) const;
137 void set_register(int reg, int32_t value);
138 int32_t get_register(int reg) const;
139 double get_double_from_register_pair(int reg); 131 double get_double_from_register_pair(int reg);
140 void set_register_pair_from_double(int reg, double* value); 132 void set_d_register_from_double(int dreg, const double dbl) {
141 void set_dw_register(int dreg, const int* dbl); 133 ASSERT(dreg >= 0 && dreg < kNumFPRs);
142 134 fp_registers_[dreg] = dbl;
143 // Support for VFP.
144 void get_d_register(int dreg, uint64_t* value);
145 void set_d_register(int dreg, const uint64_t* value);
146 void get_d_register(int dreg, uint32_t* value);
147 void set_d_register(int dreg, const uint32_t* value);
148 void get_q_register(int qreg, uint64_t* value);
149 void set_q_register(int qreg, const uint64_t* value);
150 void get_q_register(int qreg, uint32_t* value);
151 void set_q_register(int qreg, const uint32_t* value);
152
153 void set_s_register(int reg, unsigned int value);
154 unsigned int get_s_register(int reg) const;
155
156 void set_d_register_from_double(int dreg, const double& dbl) {
157 SetVFPRegister<double, 2>(dreg, dbl);
158 } 135 }
159
160 double get_double_from_d_register(int dreg) { 136 double get_double_from_d_register(int dreg) {
161 return GetFromVFPRegister<double, 2>(dreg); 137 return fp_registers_[dreg];
162 }
163
164 void set_s_register_from_float(int sreg, const float flt) {
165 SetVFPRegister<float, 1>(sreg, flt);
166 }
167
168 float get_float_from_s_register(int sreg) {
169 return GetFromVFPRegister<float, 1>(sreg);
170 }
171
172 void set_s_register_from_sinteger(int sreg, const int sint) {
173 SetVFPRegister<int, 1>(sreg, sint);
174 }
175
176 int get_sinteger_from_s_register(int sreg) {
177 return GetFromVFPRegister<int, 1>(sreg);
178 } 138 }
179 139
180 // Special case of set_register and get_register to access the raw PC value. 140 // Special case of set_register and get_register to access the raw PC value.
181 void set_pc(int32_t value); 141 void set_pc(intptr_t value);
182 int32_t get_pc() const; 142 intptr_t get_pc() const;
183 143
184 Address get_sp() { 144 Address get_sp() {
185 return reinterpret_cast<Address>(static_cast<intptr_t>(get_register(sp))); 145 return reinterpret_cast<Address>(static_cast<intptr_t>(get_register(sp)));
186 } 146 }
187 147
188 // Accessor to the internal simulator stack area. 148 // Accessor to the internal simulator stack area.
189 uintptr_t StackLimit() const; 149 uintptr_t StackLimit() const;
190 150
191 // Executes ARM instructions until the PC reaches end_sim_pc. 151 // Executes PPC instructions until the PC reaches end_sim_pc.
192 void Execute(); 152 void Execute();
193 153
194 // Call on program start. 154 // Call on program start.
195 static void Initialize(Isolate* isolate); 155 static void Initialize(Isolate* isolate);
196 156
197 // V8 generally calls into generated JS code with 5 parameters and into 157 // V8 generally calls into generated JS code with 5 parameters and into
198 // generated RegExp code with 7 parameters. This is a convenience function, 158 // generated RegExp code with 7 parameters. This is a convenience function,
199 // which sets up the simulator state and grabs the result on return. 159 // which sets up the simulator state and grabs the result on return.
200 int32_t Call(byte* entry, int argument_count, ...); 160 intptr_t Call(byte* entry, int argument_count, ...);
201 // Alternative: call a 2-argument double function. 161 // Alternative: call a 2-argument double function.
202 void CallFP(byte* entry, double d0, double d1); 162 void CallFP(byte* entry, double d0, double d1);
203 int32_t CallFPReturnsInt(byte* entry, double d0, double d1); 163 int32_t CallFPReturnsInt(byte* entry, double d0, double d1);
204 double CallFPReturnsDouble(byte* entry, double d0, double d1); 164 double CallFPReturnsDouble(byte* entry, double d0, double d1);
205 165
206 // Push an address onto the JS stack. 166 // Push an address onto the JS stack.
207 uintptr_t PushAddress(uintptr_t address); 167 uintptr_t PushAddress(uintptr_t address);
208 168
209 // Pop an address from the JS stack. 169 // Pop an address from the JS stack.
210 uintptr_t PopAddress(); 170 uintptr_t PopAddress();
211 171
212 // Debugger input. 172 // Debugger input.
213 void set_last_debugger_input(char* input); 173 void set_last_debugger_input(char* input);
214 char* last_debugger_input() { return last_debugger_input_; } 174 char* last_debugger_input() { return last_debugger_input_; }
215 175
216 // ICache checking. 176 // ICache checking.
217 static void FlushICache(v8::internal::HashMap* i_cache, void* start, 177 static void FlushICache(v8::internal::HashMap* i_cache, void* start,
218 size_t size); 178 size_t size);
219 179
220 // Returns true if pc register contains one of the 'special_values' defined 180 // Returns true if pc register contains one of the 'special_values' defined
221 // below (bad_lr, end_sim_pc). 181 // below (bad_lr, end_sim_pc).
222 bool has_bad_pc() const; 182 bool has_bad_pc() const;
223 183
224 // EABI variant for double arguments in use.
225 bool use_eabi_hardfloat() {
226 #if USE_EABI_HARDFLOAT
227 return true;
228 #else
229 return false;
230 #endif
231 }
232
233 private: 184 private:
234 enum special_values { 185 enum special_values {
235 // Known bad pc value to ensure that the simulator does not execute 186 // Known bad pc value to ensure that the simulator does not execute
236 // without being properly setup. 187 // without being properly setup.
237 bad_lr = -1, 188 bad_lr = -1,
238 // A pc value used to signal the simulator to stop execution. Generally 189 // A pc value used to signal the simulator to stop execution. Generally
239 // the lr is set to this value on transition from native C code to 190 // the lr is set to this value on transition from native C code to
240 // simulated execution, so that the simulator can "return" to the native 191 // simulated execution, so that the simulator can "return" to the native
241 // C code. 192 // C code.
242 end_sim_pc = -2 193 end_sim_pc = -2
243 }; 194 };
244 195
245 // Unsupported instructions use Format to print an error and stop execution. 196 // Unsupported instructions use Format to print an error and stop execution.
246 void Format(Instruction* instr, const char* format); 197 void Format(Instruction* instr, const char* format);
247 198
248 // Checks if the current instruction should be executed based on its
249 // condition bits.
250 inline bool ConditionallyExecute(Instruction* instr);
251
252 // Helper functions to set the conditional flags in the architecture state. 199 // Helper functions to set the conditional flags in the architecture state.
253 void SetNZFlags(int32_t val);
254 void SetCFlag(bool val);
255 void SetVFlag(bool val);
256 bool CarryFrom(int32_t left, int32_t right, int32_t carry = 0); 200 bool CarryFrom(int32_t left, int32_t right, int32_t carry = 0);
257 bool BorrowFrom(int32_t left, int32_t right); 201 bool BorrowFrom(int32_t left, int32_t right);
258 bool OverflowFrom(int32_t alu_out, 202 bool OverflowFrom(int32_t alu_out,
259 int32_t left, 203 int32_t left,
260 int32_t right, 204 int32_t right,
261 bool addition); 205 bool addition);
262 206
263 inline int GetCarry() {
264 return c_flag_ ? 1 : 0;
265 }
266
267 // Support for VFP.
268 void Compute_FPSCR_Flags(double val1, double val2);
269 void Copy_FPSCR_to_APSR();
270 inline double canonicalizeNaN(double value);
271
272 // Helper functions to decode common "addressing" modes 207 // Helper functions to decode common "addressing" modes
273 int32_t GetShiftRm(Instruction* instr, bool* carry_out); 208 int32_t GetShiftRm(Instruction* instr, bool* carry_out);
274 int32_t GetImm(Instruction* instr, bool* carry_out); 209 int32_t GetImm(Instruction* instr, bool* carry_out);
275 int32_t ProcessPU(Instruction* instr, 210 void ProcessPUW(Instruction* instr,
276 int num_regs, 211 int num_regs,
277 int operand_size, 212 int operand_size,
278 intptr_t* start_address, 213 intptr_t* start_address,
279 intptr_t* end_address); 214 intptr_t* end_address);
280 void HandleRList(Instruction* instr, bool load); 215 void HandleRList(Instruction* instr, bool load);
281 void HandleVList(Instruction* inst); 216 void HandleVList(Instruction* inst);
282 void SoftwareInterrupt(Instruction* instr); 217 void SoftwareInterrupt(Instruction* instr);
283 218
284 // Stop helper functions. 219 // Stop helper functions.
285 inline bool isStopInstruction(Instruction* instr); 220 inline bool isStopInstruction(Instruction* instr);
286 inline bool isWatchedStop(uint32_t bkpt_code); 221 inline bool isWatchedStop(uint32_t bkpt_code);
287 inline bool isEnabledStop(uint32_t bkpt_code); 222 inline bool isEnabledStop(uint32_t bkpt_code);
288 inline void EnableStop(uint32_t bkpt_code); 223 inline void EnableStop(uint32_t bkpt_code);
289 inline void DisableStop(uint32_t bkpt_code); 224 inline void DisableStop(uint32_t bkpt_code);
290 inline void IncreaseStopCounter(uint32_t bkpt_code); 225 inline void IncreaseStopCounter(uint32_t bkpt_code);
291 void PrintStopInfo(uint32_t code); 226 void PrintStopInfo(uint32_t code);
292 227
293 // Read and write memory. 228 // Read and write memory.
294 inline uint8_t ReadBU(int32_t addr); 229 inline uint8_t ReadBU(intptr_t addr);
295 inline int8_t ReadB(int32_t addr); 230 inline int8_t ReadB(intptr_t addr);
296 inline void WriteB(int32_t addr, uint8_t value); 231 inline void WriteB(intptr_t addr, uint8_t value);
297 inline void WriteB(int32_t addr, int8_t value); 232 inline void WriteB(intptr_t addr, int8_t value);
298 233
299 inline uint16_t ReadHU(int32_t addr, Instruction* instr); 234 inline uint16_t ReadHU(intptr_t addr, Instruction* instr);
300 inline int16_t ReadH(int32_t addr, Instruction* instr); 235 inline int16_t ReadH(intptr_t addr, Instruction* instr);
301 // Note: Overloaded on the sign of the value. 236 // Note: Overloaded on the sign of the value.
302 inline void WriteH(int32_t addr, uint16_t value, Instruction* instr); 237 inline void WriteH(intptr_t addr, uint16_t value, Instruction* instr);
303 inline void WriteH(int32_t addr, int16_t value, Instruction* instr); 238 inline void WriteH(intptr_t addr, int16_t value, Instruction* instr);
304 239
305 inline int ReadW(int32_t addr, Instruction* instr); 240 inline uint32_t ReadWU(intptr_t addr, Instruction* instr);
306 inline void WriteW(int32_t addr, int value, Instruction* instr); 241 inline int32_t ReadW(intptr_t addr, Instruction* instr);
242 inline void WriteW(intptr_t addr, uint32_t value, Instruction* instr);
243 inline void WriteW(intptr_t addr, int32_t value, Instruction* instr);
307 244
308 int32_t* ReadDW(int32_t addr); 245 intptr_t* ReadDW(intptr_t addr);
309 void WriteDW(int32_t addr, int32_t value1, int32_t value2); 246 void WriteDW(intptr_t addr, int64_t value);
310 247
311 // Executing is handled based on the instruction type. 248 void Trace(Instruction* instr);
312 // Both type 0 and type 1 rolled into one. 249 void SetCR0(intptr_t result, bool setSO = false);
313 void DecodeType01(Instruction* instr); 250 void ExecuteBranchConditional(Instruction* instr);
314 void DecodeType2(Instruction* instr); 251 void ExecuteExt1(Instruction* instr);
315 void DecodeType3(Instruction* instr); 252 bool ExecuteExt2_10bit(Instruction* instr);
316 void DecodeType4(Instruction* instr); 253 bool ExecuteExt2_9bit_part1(Instruction* instr);
317 void DecodeType5(Instruction* instr); 254 void ExecuteExt2_9bit_part2(Instruction* instr);
318 void DecodeType6(Instruction* instr); 255 void ExecuteExt2(Instruction* instr);
319 void DecodeType7(Instruction* instr); 256 void ExecuteExt4(Instruction* instr);
320 257 #if V8_TARGET_ARCH_PPC64
321 // Support for VFP. 258 void ExecuteExt5(Instruction* instr);
322 void DecodeTypeVFP(Instruction* instr); 259 #endif
323 void DecodeType6CoprocessorIns(Instruction* instr); 260 void ExecuteGeneric(Instruction* instr);
324 void DecodeSpecialCondition(Instruction* instr);
325
326 void DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(Instruction* instr);
327 void DecodeVCMP(Instruction* instr);
328 void DecodeVCVTBetweenDoubleAndSingle(Instruction* instr);
329 void DecodeVCVTBetweenFloatingPointAndInteger(Instruction* instr);
330 261
331 // Executes one instruction. 262 // Executes one instruction.
332 void InstructionDecode(Instruction* instr); 263 void ExecuteInstruction(Instruction* instr);
333 264
334 // ICache. 265 // ICache.
335 static void CheckICache(v8::internal::HashMap* i_cache, Instruction* instr); 266 static void CheckICache(v8::internal::HashMap* i_cache, Instruction* instr);
336 static void FlushOnePage(v8::internal::HashMap* i_cache, intptr_t start, 267 static void FlushOnePage(v8::internal::HashMap* i_cache, intptr_t start,
337 int size); 268 int size);
338 static CachePage* GetCachePage(v8::internal::HashMap* i_cache, void* page); 269 static CachePage* GetCachePage(v8::internal::HashMap* i_cache, void* page);
339 270
340 // Runtime call support. 271 // Runtime call support.
341 static void* RedirectExternalReference( 272 static void* RedirectExternalReference(
342 void* external_function, 273 void* external_function,
343 v8::internal::ExternalReference::Type type); 274 v8::internal::ExternalReference::Type type);
344 275
345 // Handle arguments and return value for runtime FP functions. 276 // Handle arguments and return value for runtime FP functions.
346 void GetFpArgs(double* x, double* y, int32_t* z); 277 void GetFpArgs(double* x, double* y, intptr_t* z);
347 void SetFpResult(const double& result); 278 void SetFpResult(const double& result);
348 void TrashCallerSaveRegisters(); 279 void TrashCallerSaveRegisters();
349 280
350 template<class ReturnType, int register_size>
351 ReturnType GetFromVFPRegister(int reg_index);
352
353 template<class InputType, int register_size>
354 void SetVFPRegister(int reg_index, const InputType& value);
355
356 void CallInternal(byte* entry); 281 void CallInternal(byte* entry);
357 282
358 // Architecture state. 283 // Architecture state.
359 // Saturating instructions require a Q flag to indicate saturation. 284 // Saturating instructions require a Q flag to indicate saturation.
360 // There is currently no way to read the CPSR directly, and thus read the Q 285 // There is currently no way to read the CPSR directly, and thus read the Q
361 // flag, so this is left unimplemented. 286 // flag, so this is left unimplemented.
362 int32_t registers_[16]; 287 intptr_t registers_[kNumGPRs];
363 bool n_flag_; 288 int32_t condition_reg_;
364 bool z_flag_; 289 int32_t fp_condition_reg_;
365 bool c_flag_; 290 intptr_t special_reg_lr_;
366 bool v_flag_; 291 intptr_t special_reg_pc_;
292 intptr_t special_reg_ctr_;
293 int32_t special_reg_xer_;
367 294
368 // VFP architecture state. 295 double fp_registers_[kNumFPRs];
369 unsigned int vfp_registers_[num_d_registers * 2];
370 bool n_flag_FPSCR_;
371 bool z_flag_FPSCR_;
372 bool c_flag_FPSCR_;
373 bool v_flag_FPSCR_;
374
375 // VFP rounding mode. See ARM DDI 0406B Page A2-29.
376 VFPRoundingMode FPSCR_rounding_mode_;
377 bool FPSCR_default_NaN_mode_;
378
379 // VFP FP exception flags architecture state.
380 bool inv_op_vfp_flag_;
381 bool div_zero_vfp_flag_;
382 bool overflow_vfp_flag_;
383 bool underflow_vfp_flag_;
384 bool inexact_vfp_flag_;
385 296
386 // Simulator support. 297 // Simulator support.
387 char* stack_; 298 char* stack_;
388 bool pc_modified_; 299 bool pc_modified_;
389 int icount_; 300 int icount_;
390 301
391 // Debugger input. 302 // Debugger input.
392 char* last_debugger_input_; 303 char* last_debugger_input_;
393 304
394 // Icache simulation 305 // Icache simulation
(...skipping 21 matching lines...) Expand all
416 char* desc; 327 char* desc;
417 }; 328 };
418 StopCountAndDesc watched_stops_[kNumOfWatchedStops]; 329 StopCountAndDesc watched_stops_[kNumOfWatchedStops];
419 }; 330 };
420 331
421 332
422 // When running with the simulator transition into simulated execution at this 333 // When running with the simulator transition into simulated execution at this
423 // point. 334 // point.
424 #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \ 335 #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \
425 reinterpret_cast<Object*>(Simulator::current(Isolate::Current())->Call( \ 336 reinterpret_cast<Object*>(Simulator::current(Isolate::Current())->Call( \
426 FUNCTION_ADDR(entry), 5, p0, p1, p2, p3, p4)) 337 FUNCTION_ADDR(entry), 5, \
427 338 (intptr_t)p0, \
428 #define CALL_GENERATED_FP_INT(entry, p0, p1) \ 339 (intptr_t)p1, \
429 Simulator::current(Isolate::Current())->CallFPReturnsInt( \ 340 (intptr_t)p2, \
430 FUNCTION_ADDR(entry), p0, p1) 341 (intptr_t)p3, \
342 (intptr_t)p4))
431 343
432 #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6, p7, p8) \ 344 #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6, p7, p8) \
433 Simulator::current(Isolate::Current())->Call( \ 345 Simulator::current(Isolate::Current())->Call( \
434 entry, 10, p0, p1, p2, p3, NULL, p4, p5, p6, p7, p8) 346 entry, 10, \
347 (intptr_t)p0, \
348 (intptr_t)p1, \
349 (intptr_t)p2, \
350 (intptr_t)p3, \
351 (intptr_t)p4, \
352 (intptr_t)p5, \
353 (intptr_t)p6, \
354 (intptr_t)p7, \
355 (intptr_t)NULL, \
356 (intptr_t)p8)
435 357
436 358
437 // The simulator has its own stack. Thus it has a different stack limit from 359 // The simulator has its own stack. Thus it has a different stack limit from
438 // the C-based native code. Setting the c_limit to indicate a very small 360 // the C-based native code. Setting the c_limit to indicate a very small
439 // stack cause stack overflow errors, since the simulator ignores the input. 361 // stack cause stack overflow errors, since the simulator ignores the input.
440 // This is unlikely to be an issue in practice, though it might cause testing 362 // This is unlikely to be an issue in practice, though it might cause testing
441 // trouble down the line. 363 // trouble down the line.
442 class SimulatorStack : public v8::internal::AllStatic { 364 class SimulatorStack : public v8::internal::AllStatic {
443 public: 365 public:
444 static inline uintptr_t JsLimitFromCLimit(v8::internal::Isolate* isolate, 366 static inline uintptr_t JsLimitFromCLimit(v8::internal::Isolate* isolate,
445 uintptr_t c_limit) { 367 uintptr_t c_limit) {
446 return Simulator::current(isolate)->StackLimit(); 368 return Simulator::current(isolate)->StackLimit();
447 } 369 }
448 370
449 static inline uintptr_t RegisterCTryCatch(uintptr_t try_catch_address) { 371 static inline uintptr_t RegisterCTryCatch(uintptr_t try_catch_address) {
450 Simulator* sim = Simulator::current(Isolate::Current()); 372 Simulator* sim = Simulator::current(Isolate::Current());
451 return sim->PushAddress(try_catch_address); 373 return sim->PushAddress(try_catch_address);
452 } 374 }
453 375
454 static inline void UnregisterCTryCatch() { 376 static inline void UnregisterCTryCatch() {
455 Simulator::current(Isolate::Current())->PopAddress(); 377 Simulator::current(Isolate::Current())->PopAddress();
456 } 378 }
457 }; 379 };
458 380
459 } } // namespace v8::internal 381 } } // namespace v8::internal
460 382
461 #endif // !defined(USE_SIMULATOR) 383 #endif // !defined(USE_SIMULATOR)
462 #endif // V8_ARM_SIMULATOR_ARM_H_ 384 #endif // V8_PPC_SIMULATOR_PPC_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698