OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2049 mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 2049 mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
2050 mov(ebx, FieldOperand(edx, SharedFunctionInfo::kFormalParameterCountOffset)); | 2050 mov(ebx, FieldOperand(edx, SharedFunctionInfo::kFormalParameterCountOffset)); |
2051 SmiUntag(ebx); | 2051 SmiUntag(ebx); |
2052 | 2052 |
2053 ParameterCount expected(ebx); | 2053 ParameterCount expected(ebx); |
2054 InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), | 2054 InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), |
2055 expected, actual, flag, call_wrapper, call_kind); | 2055 expected, actual, flag, call_wrapper, call_kind); |
2056 } | 2056 } |
2057 | 2057 |
2058 | 2058 |
2059 void MacroAssembler::InvokeFunction(JSFunction* function, | 2059 void MacroAssembler::InvokeFunction(JSFunction* function, |
Vyacheslav Egorov (Chromium)
2011/10/12 12:36:05
probably not gc safe.
check all callers.
| |
2060 const ParameterCount& actual, | 2060 const ParameterCount& actual, |
2061 InvokeFlag flag, | 2061 InvokeFlag flag, |
2062 const CallWrapper& call_wrapper, | 2062 const CallWrapper& call_wrapper, |
2063 CallKind call_kind) { | 2063 CallKind call_kind) { |
2064 // You can't call a function without a valid frame. | 2064 // You can't call a function without a valid frame. |
2065 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 2065 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
2066 | 2066 |
2067 ASSERT(function->is_compiled()); | 2067 ASSERT(function->is_compiled()); |
2068 // Get the function and setup the context. | 2068 // Get the function and setup the context. |
2069 mov(edi, Immediate(Handle<JSFunction>(function))); | 2069 LoadHeapObject(edi, Handle<JSFunction>(function)); |
2070 mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 2070 mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
2071 | 2071 |
2072 ParameterCount expected(function->shared()->formal_parameter_count()); | 2072 ParameterCount expected(function->shared()->formal_parameter_count()); |
2073 if (V8::UseCrankshaft()) { | 2073 if (V8::UseCrankshaft()) { |
2074 // TODO(kasperl): For now, we always call indirectly through the | 2074 // TODO(kasperl): For now, we always call indirectly through the |
2075 // code field in the function to allow recompilation to take effect | 2075 // code field in the function to allow recompilation to take effect |
2076 // without changing any of the call sites. | 2076 // without changing any of the call sites. |
2077 InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), | 2077 InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), |
2078 expected, actual, flag, call_wrapper, call_kind); | 2078 expected, actual, flag, call_wrapper, call_kind); |
2079 } else { | 2079 } else { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2194 | 2194 |
2195 int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { | 2195 int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { |
2196 // The registers are pushed starting with the lowest encoding, | 2196 // The registers are pushed starting with the lowest encoding, |
2197 // which means that lowest encodings are furthest away from | 2197 // which means that lowest encodings are furthest away from |
2198 // the stack pointer. | 2198 // the stack pointer. |
2199 ASSERT(reg_code >= 0 && reg_code < kNumSafepointRegisters); | 2199 ASSERT(reg_code >= 0 && reg_code < kNumSafepointRegisters); |
2200 return kNumSafepointRegisters - reg_code - 1; | 2200 return kNumSafepointRegisters - reg_code - 1; |
2201 } | 2201 } |
2202 | 2202 |
2203 | 2203 |
2204 void MacroAssembler::LoadHeapObject(Register result, | |
2205 Handle<HeapObject> object) { | |
2206 if (isolate()->heap()->InNewSpace(*object)) { | |
2207 Handle<JSGlobalPropertyCell> cell = | |
2208 isolate()->factory()->NewJSGlobalPropertyCell(object); | |
2209 mov(result, Operand::Cell(cell)); | |
2210 } else { | |
2211 mov(result, object); | |
2212 } | |
2213 } | |
2214 | |
2215 | |
2216 void MacroAssembler::PushHeapObject(Handle<HeapObject> object) { | |
2217 if (isolate()->heap()->InNewSpace(*object)) { | |
2218 Handle<JSGlobalPropertyCell> cell = | |
2219 isolate()->factory()->NewJSGlobalPropertyCell(object); | |
2220 push(Operand::Cell(cell)); | |
2221 } else { | |
2222 Push(object); | |
2223 } | |
2224 } | |
2225 | |
2226 | |
2204 void MacroAssembler::Ret() { | 2227 void MacroAssembler::Ret() { |
2205 ret(0); | 2228 ret(0); |
2206 } | 2229 } |
2207 | 2230 |
2208 | 2231 |
2209 void MacroAssembler::Ret(int bytes_dropped, Register scratch) { | 2232 void MacroAssembler::Ret(int bytes_dropped, Register scratch) { |
2210 if (is_uint16(bytes_dropped)) { | 2233 if (is_uint16(bytes_dropped)) { |
2211 ret(bytes_dropped); | 2234 ret(bytes_dropped); |
2212 } else { | 2235 } else { |
2213 pop(scratch); | 2236 pop(scratch); |
(...skipping 13 matching lines...) Expand all Loading... | |
2227 } | 2250 } |
2228 | 2251 |
2229 | 2252 |
2230 void MacroAssembler::Move(Register dst, Register src) { | 2253 void MacroAssembler::Move(Register dst, Register src) { |
2231 if (!dst.is(src)) { | 2254 if (!dst.is(src)) { |
2232 mov(dst, src); | 2255 mov(dst, src); |
2233 } | 2256 } |
2234 } | 2257 } |
2235 | 2258 |
2236 | 2259 |
2237 void MacroAssembler::Move(Register dst, Handle<Object> value) { | |
2238 mov(dst, value); | |
2239 } | |
2240 | |
2241 | |
2242 void MacroAssembler::SetCounter(StatsCounter* counter, int value) { | 2260 void MacroAssembler::SetCounter(StatsCounter* counter, int value) { |
2243 if (FLAG_native_code_counters && counter->Enabled()) { | 2261 if (FLAG_native_code_counters && counter->Enabled()) { |
2244 mov(Operand::StaticVariable(ExternalReference(counter)), Immediate(value)); | 2262 mov(Operand::StaticVariable(ExternalReference(counter)), Immediate(value)); |
2245 } | 2263 } |
2246 } | 2264 } |
2247 | 2265 |
2248 | 2266 |
2249 void MacroAssembler::IncrementCounter(StatsCounter* counter, int value) { | 2267 void MacroAssembler::IncrementCounter(StatsCounter* counter, int value) { |
2250 ASSERT(value > 0); | 2268 ASSERT(value > 0); |
2251 if (FLAG_native_code_counters && counter->Enabled()) { | 2269 if (FLAG_native_code_counters && counter->Enabled()) { |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2711 cmp(length, Operand(bitmap_scratch, MemoryChunk::kSizeOffset)); | 2729 cmp(length, Operand(bitmap_scratch, MemoryChunk::kSizeOffset)); |
2712 Check(less_equal, "Live Bytes Count overflow chunk size"); | 2730 Check(less_equal, "Live Bytes Count overflow chunk size"); |
2713 } | 2731 } |
2714 | 2732 |
2715 bind(&done); | 2733 bind(&done); |
2716 } | 2734 } |
2717 | 2735 |
2718 } } // namespace v8::internal | 2736 } } // namespace v8::internal |
2719 | 2737 |
2720 #endif // V8_TARGET_ARCH_IA32 | 2738 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |