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

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

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

Powered by Google App Engine
This is Rietveld 408576698