OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 movq(kScratchRegister, Immediate(x)); | 113 movq(kScratchRegister, Immediate(x)); |
114 } else if (is_uint32(x)) { | 114 } else if (is_uint32(x)) { |
115 movl(kScratchRegister, Immediate(x)); | 115 movl(kScratchRegister, Immediate(x)); |
116 } else { | 116 } else { |
117 movq(kScratchRegister, x, RelocInfo::NONE); | 117 movq(kScratchRegister, x, RelocInfo::NONE); |
118 } | 118 } |
119 movq(dst, kScratchRegister); | 119 movq(dst, kScratchRegister); |
120 } | 120 } |
121 | 121 |
122 | 122 |
| 123 void MacroAssembler::Jump(ExternalReference ext) { |
| 124 movq(kScratchRegister, ext); |
| 125 jmp(kScratchRegister); |
| 126 } |
| 127 |
| 128 |
| 129 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) { |
| 130 movq(kScratchRegister, destination, rmode); |
| 131 jmp(kScratchRegister); |
| 132 } |
| 133 |
| 134 |
| 135 void MacroAssembler::Call(ExternalReference ext) { |
| 136 movq(kScratchRegister, ext); |
| 137 call(kScratchRegister); |
| 138 } |
| 139 |
| 140 |
| 141 void MacroAssembler::Call(Address destination, RelocInfo::Mode rmode) { |
| 142 movq(kScratchRegister, destination, rmode); |
| 143 call(kScratchRegister); |
| 144 } |
| 145 |
| 146 |
123 void MacroAssembler::PushTryHandler(CodeLocation try_location, | 147 void MacroAssembler::PushTryHandler(CodeLocation try_location, |
124 HandlerType type) { | 148 HandlerType type) { |
125 // Adjust this code if not the case. | 149 // Adjust this code if not the case. |
126 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); | 150 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); |
127 | 151 |
128 // The pc (return address) is already on TOS. This code pushes state, | 152 // The pc (return address) is already on TOS. This code pushes state, |
129 // frame pointer and current handler. Check that they are expected | 153 // frame pointer and current handler. Check that they are expected |
130 // next on the stack, in that order. | 154 // next on the stack, in that order. |
131 ASSERT_EQ(StackHandlerConstants::kStateOffset, | 155 ASSERT_EQ(StackHandlerConstants::kStateOffset, |
132 StackHandlerConstants::kPCOffset - kPointerSize); | 156 StackHandlerConstants::kPCOffset - kPointerSize); |
(...skipping 18 matching lines...) Expand all Loading... |
151 push(Immediate(0)); // NULL frame pointer. | 175 push(Immediate(0)); // NULL frame pointer. |
152 } | 176 } |
153 // Save the current handler. | 177 // Save the current handler. |
154 movq(kScratchRegister, ExternalReference(Top::k_handler_address)); | 178 movq(kScratchRegister, ExternalReference(Top::k_handler_address)); |
155 push(Operand(kScratchRegister, 0)); | 179 push(Operand(kScratchRegister, 0)); |
156 // Link this handler. | 180 // Link this handler. |
157 movq(Operand(kScratchRegister, 0), rsp); | 181 movq(Operand(kScratchRegister, 0), rsp); |
158 } | 182 } |
159 | 183 |
160 | 184 |
| 185 void MacroAssembler::Ret() { |
| 186 ret(0); |
| 187 } |
| 188 |
| 189 |
| 190 void MacroAssembler::SetCounter(StatsCounter* counter, int value) { |
| 191 if (FLAG_native_code_counters && counter->Enabled()) { |
| 192 movq(kScratchRegister, ExternalReference(counter)); |
| 193 movl(Operand(kScratchRegister, 0), Immediate(value)); |
| 194 } |
| 195 } |
| 196 |
| 197 |
| 198 void MacroAssembler::IncrementCounter(StatsCounter* counter, int value) { |
| 199 ASSERT(value > 0); |
| 200 if (FLAG_native_code_counters && counter->Enabled()) { |
| 201 movq(kScratchRegister, ExternalReference(counter)); |
| 202 Operand operand(kScratchRegister, 0); |
| 203 if (value == 1) { |
| 204 incl(operand); |
| 205 } else { |
| 206 addl(operand, Immediate(value)); |
| 207 } |
| 208 } |
| 209 } |
| 210 |
| 211 |
| 212 void MacroAssembler::DecrementCounter(StatsCounter* counter, int value) { |
| 213 ASSERT(value > 0); |
| 214 if (FLAG_native_code_counters && counter->Enabled()) { |
| 215 movq(kScratchRegister, ExternalReference(counter)); |
| 216 Operand operand(kScratchRegister, 0); |
| 217 if (value == 1) { |
| 218 decl(operand); |
| 219 } else { |
| 220 subl(operand, Immediate(value)); |
| 221 } |
| 222 } |
| 223 } |
| 224 |
| 225 |
161 #ifdef ENABLE_DEBUGGER_SUPPORT | 226 #ifdef ENABLE_DEBUGGER_SUPPORT |
162 | 227 |
163 void MacroAssembler::PushRegistersFromMemory(RegList regs) { | 228 void MacroAssembler::PushRegistersFromMemory(RegList regs) { |
164 ASSERT((regs & ~kJSCallerSaved) == 0); | 229 ASSERT((regs & ~kJSCallerSaved) == 0); |
165 // Push the content of the memory location to the stack. | 230 // Push the content of the memory location to the stack. |
166 for (int i = 0; i < kNumJSCallerSaved; i++) { | 231 for (int i = 0; i < kNumJSCallerSaved; i++) { |
167 int r = JSCallerSavedCode(i); | 232 int r = JSCallerSavedCode(i); |
168 if ((regs & (1 << r)) != 0) { | 233 if ((regs & (1 << r)) != 0) { |
169 ExternalReference reg_addr = | 234 ExternalReference reg_addr = |
170 ExternalReference(Debug_Address::Register(i)); | 235 ExternalReference(Debug_Address::Register(i)); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 push(rbp); | 323 push(rbp); |
259 movq(rbp, rsp); | 324 movq(rbp, rsp); |
260 push(rsi); // Context. | 325 push(rsi); // Context. |
261 push(Immediate(Smi::FromInt(type))); | 326 push(Immediate(Smi::FromInt(type))); |
262 movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); | 327 movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); |
263 push(kScratchRegister); | 328 push(kScratchRegister); |
264 if (FLAG_debug_code) { | 329 if (FLAG_debug_code) { |
265 movq(kScratchRegister, | 330 movq(kScratchRegister, |
266 Factory::undefined_value(), | 331 Factory::undefined_value(), |
267 RelocInfo::EMBEDDED_OBJECT); | 332 RelocInfo::EMBEDDED_OBJECT); |
268 cmp(Operand(rsp, 0), kScratchRegister); | 333 cmpq(Operand(rsp, 0), kScratchRegister); |
269 Check(not_equal, "code object not properly patched"); | 334 Check(not_equal, "code object not properly patched"); |
270 } | 335 } |
271 } | 336 } |
272 | 337 |
273 | 338 |
274 void MacroAssembler::LeaveFrame(StackFrame::Type type) { | 339 void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
275 if (FLAG_debug_code) { | 340 if (FLAG_debug_code) { |
276 movq(kScratchRegister, Immediate(Smi::FromInt(type))); | 341 movq(kScratchRegister, Immediate(Smi::FromInt(type))); |
277 cmp(Operand(rbp, StandardFrameConstants::kMarkerOffset), kScratchRegister); | 342 cmpq(Operand(rbp, StandardFrameConstants::kMarkerOffset), kScratchRegister); |
278 Check(equal, "stack frame types must match"); | 343 Check(equal, "stack frame types must match"); |
279 } | 344 } |
280 movq(rsp, rbp); | 345 movq(rsp, rbp); |
281 pop(rbp); | 346 pop(rbp); |
282 } | 347 } |
283 | 348 |
284 | 349 |
285 | 350 |
286 void MacroAssembler::EnterExitFrame(StackFrame::Type type) { | 351 void MacroAssembler::EnterExitFrame(StackFrame::Type type) { |
287 ASSERT(type == StackFrame::EXIT || type == StackFrame::EXIT_DEBUG); | 352 ASSERT(type == StackFrame::EXIT || type == StackFrame::EXIT_DEBUG); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 // CopyRegistersFromStackToMemory() but it isn't! esp is assumed | 386 // CopyRegistersFromStackToMemory() but it isn't! esp is assumed |
322 // correct here, but computed for the other call. Very error | 387 // correct here, but computed for the other call. Very error |
323 // prone! FIX THIS. Actually there are deeper problems with | 388 // prone! FIX THIS. Actually there are deeper problems with |
324 // register saving than this asymmetry (see the bug report | 389 // register saving than this asymmetry (see the bug report |
325 // associated with this issue). | 390 // associated with this issue). |
326 PushRegistersFromMemory(kJSCallerSaved); | 391 PushRegistersFromMemory(kJSCallerSaved); |
327 } | 392 } |
328 #endif | 393 #endif |
329 | 394 |
330 // Reserve space for two arguments: argc and argv. | 395 // Reserve space for two arguments: argc and argv. |
331 sub(rsp, Immediate(2 * kPointerSize)); | 396 subq(rsp, Immediate(2 * kPointerSize)); |
332 | 397 |
333 // Get the required frame alignment for the OS. | 398 // Get the required frame alignment for the OS. |
334 static const int kFrameAlignment = OS::ActivationFrameAlignment(); | 399 static const int kFrameAlignment = OS::ActivationFrameAlignment(); |
335 if (kFrameAlignment > 0) { | 400 if (kFrameAlignment > 0) { |
336 ASSERT(IsPowerOf2(kFrameAlignment)); | 401 ASSERT(IsPowerOf2(kFrameAlignment)); |
337 movq(r10, Immediate(-kFrameAlignment)); | 402 movq(r10, Immediate(-kFrameAlignment)); |
338 and_(rsp, r10); | 403 and_(rsp, r10); |
339 } | 404 } |
340 | 405 |
341 // Patch the saved entry sp. | 406 // Patch the saved entry sp. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 push(rcx); | 441 push(rcx); |
377 | 442 |
378 // Clear the top frame. | 443 // Clear the top frame. |
379 ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address); | 444 ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address); |
380 movq(kScratchRegister, c_entry_fp_address); | 445 movq(kScratchRegister, c_entry_fp_address); |
381 movq(Operand(kScratchRegister, 0), Immediate(0)); | 446 movq(Operand(kScratchRegister, 0), Immediate(0)); |
382 } | 447 } |
383 | 448 |
384 | 449 |
385 } } // namespace v8::internal | 450 } } // namespace v8::internal |
OLD | NEW |