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

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

Powered by Google App Engine
This is Rietveld 408576698