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

Side by Side Diff: src/mips64/full-codegen-mips64.cc

Issue 644583004: MIPS: Introduce FeedbackVectorSlot type - better than int. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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
« no previous file with comments | « no previous file | src/mips64/lithium-codegen-mips64.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 2012 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 // Note on Mips implementation: 9 // Note on Mips implementation:
10 // 10 //
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 VisitStatements(clause->statements()); 1081 VisitStatements(clause->statements());
1082 } 1082 }
1083 1083
1084 __ bind(nested_statement.break_label()); 1084 __ bind(nested_statement.break_label());
1085 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); 1085 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1086 } 1086 }
1087 1087
1088 1088
1089 void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { 1089 void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
1090 Comment cmnt(masm_, "[ ForInStatement"); 1090 Comment cmnt(masm_, "[ ForInStatement");
1091 int slot = stmt->ForInFeedbackSlot(); 1091 FeedbackVectorSlot slot = stmt->ForInFeedbackSlot();
1092 SetStatementPosition(stmt); 1092 SetStatementPosition(stmt);
1093 1093
1094 Label loop, exit; 1094 Label loop, exit;
1095 ForIn loop_statement(this, stmt); 1095 ForIn loop_statement(this, stmt);
1096 increment_loop_depth(); 1096 increment_loop_depth();
1097 1097
1098 // Get the object to enumerate over. If the object is null or undefined, skip 1098 // Get the object to enumerate over. If the object is null or undefined, skip
1099 // over the loop. See ECMA-262 version 5, section 12.6.4. 1099 // over the loop. See ECMA-262 version 5, section 12.6.4.
1100 VisitForAccumulatorValue(stmt->enumerable()); 1100 VisitForAccumulatorValue(stmt->enumerable());
1101 __ mov(a0, result_register()); // Result as param to InvokeBuiltin below. 1101 __ mov(a0, result_register()); // Result as param to InvokeBuiltin below.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 __ bind(&no_descriptors); 1169 __ bind(&no_descriptors);
1170 __ Drop(1); 1170 __ Drop(1);
1171 __ jmp(&exit); 1171 __ jmp(&exit);
1172 1172
1173 // We got a fixed array in register v0. Iterate through that. 1173 // We got a fixed array in register v0. Iterate through that.
1174 Label non_proxy; 1174 Label non_proxy;
1175 __ bind(&fixed_array); 1175 __ bind(&fixed_array);
1176 1176
1177 __ li(a1, FeedbackVector()); 1177 __ li(a1, FeedbackVector());
1178 __ li(a2, Operand(TypeFeedbackVector::MegamorphicSentinel(isolate()))); 1178 __ li(a2, Operand(TypeFeedbackVector::MegamorphicSentinel(isolate())));
1179 __ sd(a2, FieldMemOperand(a1, FixedArray::OffsetOfElementAt(slot))); 1179 __ sd(a2, FieldMemOperand(a1, FixedArray::OffsetOfElementAt(slot.ToInt())));
1180 1180
1181 __ li(a1, Operand(Smi::FromInt(1))); // Smi indicates slow check 1181 __ li(a1, Operand(Smi::FromInt(1))); // Smi indicates slow check
1182 __ ld(a2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object 1182 __ ld(a2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object
1183 STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_SPEC_OBJECT_TYPE); 1183 STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_SPEC_OBJECT_TYPE);
1184 __ GetObjectType(a2, a3, a3); 1184 __ GetObjectType(a2, a3, a3);
1185 __ Branch(&non_proxy, gt, a3, Operand(LAST_JS_PROXY_TYPE)); 1185 __ Branch(&non_proxy, gt, a3, Operand(LAST_JS_PROXY_TYPE));
1186 __ li(a1, Operand(Smi::FromInt(0))); // Zero indicates proxy 1186 __ li(a1, Operand(Smi::FromInt(0))); // Zero indicates proxy
1187 __ bind(&non_proxy); 1187 __ bind(&non_proxy);
1188 __ Push(a1, v0); // Smi and array 1188 __ Push(a1, v0); // Smi and array
1189 __ ld(a1, FieldMemOperand(v0, FixedArray::kLengthOffset)); 1189 __ ld(a1, FieldMemOperand(v0, FixedArray::kLengthOffset));
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 Comment cnmt(masm_, "[ SuperReference "); 1341 Comment cnmt(masm_, "[ SuperReference ");
1342 1342
1343 __ ld(LoadDescriptor::ReceiverRegister(), 1343 __ ld(LoadDescriptor::ReceiverRegister(),
1344 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); 1344 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
1345 1345
1346 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); 1346 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
1347 __ li(LoadDescriptor::NameRegister(), home_object_symbol); 1347 __ li(LoadDescriptor::NameRegister(), home_object_symbol);
1348 1348
1349 if (FLAG_vector_ics) { 1349 if (FLAG_vector_ics) {
1350 __ li(VectorLoadICDescriptor::SlotRegister(), 1350 __ li(VectorLoadICDescriptor::SlotRegister(),
1351 Operand(Smi::FromInt(expr->HomeObjectFeedbackSlot()))); 1351 Operand(SmiFromSlot(expr->HomeObjectFeedbackSlot())));
1352 CallLoadIC(NOT_CONTEXTUAL); 1352 CallLoadIC(NOT_CONTEXTUAL);
1353 } else { 1353 } else {
1354 CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId()); 1354 CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId());
1355 } 1355 }
1356 1356
1357 Label done; 1357 Label done;
1358 __ Branch(&done, ne, v0, Operand(isolate()->factory()->undefined_value())); 1358 __ Branch(&done, ne, v0, Operand(isolate()->factory()->undefined_value()));
1359 __ CallRuntime(Runtime::kThrowNonMethodError, 0); 1359 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
1360 __ bind(&done); 1360 __ bind(&done);
1361 } 1361 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 // Load next context in chain. 1403 // Load next context in chain.
1404 __ ld(next, ContextOperand(next, Context::PREVIOUS_INDEX)); 1404 __ ld(next, ContextOperand(next, Context::PREVIOUS_INDEX));
1405 __ Branch(&loop); 1405 __ Branch(&loop);
1406 __ bind(&fast); 1406 __ bind(&fast);
1407 } 1407 }
1408 1408
1409 __ ld(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 1409 __ ld(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
1410 __ li(LoadDescriptor::NameRegister(), Operand(proxy->var()->name())); 1410 __ li(LoadDescriptor::NameRegister(), Operand(proxy->var()->name()));
1411 if (FLAG_vector_ics) { 1411 if (FLAG_vector_ics) {
1412 __ li(VectorLoadICDescriptor::SlotRegister(), 1412 __ li(VectorLoadICDescriptor::SlotRegister(),
1413 Operand(Smi::FromInt(proxy->VariableFeedbackSlot()))); 1413 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1414 } 1414 }
1415 1415
1416 ContextualMode mode = (typeof_state == INSIDE_TYPEOF) 1416 ContextualMode mode = (typeof_state == INSIDE_TYPEOF)
1417 ? NOT_CONTEXTUAL 1417 ? NOT_CONTEXTUAL
1418 : CONTEXTUAL; 1418 : CONTEXTUAL;
1419 CallLoadIC(mode); 1419 CallLoadIC(mode);
1420 } 1420 }
1421 1421
1422 1422
1423 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var, 1423 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 // variables. 1494 // variables.
1495 switch (var->location()) { 1495 switch (var->location()) {
1496 case Variable::UNALLOCATED: { 1496 case Variable::UNALLOCATED: {
1497 Comment cmnt(masm_, "[ Global variable"); 1497 Comment cmnt(masm_, "[ Global variable");
1498 // Use inline caching. Variable name is passed in a2 and the global 1498 // Use inline caching. Variable name is passed in a2 and the global
1499 // object (receiver) in a0. 1499 // object (receiver) in a0.
1500 __ ld(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 1500 __ ld(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
1501 __ li(LoadDescriptor::NameRegister(), Operand(var->name())); 1501 __ li(LoadDescriptor::NameRegister(), Operand(var->name()));
1502 if (FLAG_vector_ics) { 1502 if (FLAG_vector_ics) {
1503 __ li(VectorLoadICDescriptor::SlotRegister(), 1503 __ li(VectorLoadICDescriptor::SlotRegister(),
1504 Operand(Smi::FromInt(proxy->VariableFeedbackSlot()))); 1504 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1505 } 1505 }
1506 CallLoadIC(CONTEXTUAL); 1506 CallLoadIC(CONTEXTUAL);
1507 context()->Plug(v0); 1507 context()->Plug(v0);
1508 break; 1508 break;
1509 } 1509 }
1510 1510
1511 case Variable::PARAMETER: 1511 case Variable::PARAMETER:
1512 case Variable::LOCAL: 1512 case Variable::LOCAL:
1513 case Variable::CONTEXT: { 1513 case Variable::CONTEXT: {
1514 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" 1514 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable"
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after
2128 __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next" 2128 __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next"
2129 __ ld(a3, MemOperand(sp, 1 * kPointerSize)); // iter 2129 __ ld(a3, MemOperand(sp, 1 * kPointerSize)); // iter
2130 __ Push(load_name, a3, a0); // "next", iter, received 2130 __ Push(load_name, a3, a0); // "next", iter, received
2131 2131
2132 // result = receiver[f](arg); 2132 // result = receiver[f](arg);
2133 __ bind(&l_call); 2133 __ bind(&l_call);
2134 __ ld(load_receiver, MemOperand(sp, kPointerSize)); 2134 __ ld(load_receiver, MemOperand(sp, kPointerSize));
2135 __ ld(load_name, MemOperand(sp, 2 * kPointerSize)); 2135 __ ld(load_name, MemOperand(sp, 2 * kPointerSize));
2136 if (FLAG_vector_ics) { 2136 if (FLAG_vector_ics) {
2137 __ li(VectorLoadICDescriptor::SlotRegister(), 2137 __ li(VectorLoadICDescriptor::SlotRegister(),
2138 Operand(Smi::FromInt(expr->KeyedLoadFeedbackSlot()))); 2138 Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
2139 } 2139 }
2140 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); 2140 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
2141 CallIC(ic, TypeFeedbackId::None()); 2141 CallIC(ic, TypeFeedbackId::None());
2142 __ mov(a0, v0); 2142 __ mov(a0, v0);
2143 __ mov(a1, a0); 2143 __ mov(a1, a0);
2144 __ sd(a1, MemOperand(sp, 2 * kPointerSize)); 2144 __ sd(a1, MemOperand(sp, 2 * kPointerSize));
2145 CallFunctionStub stub(isolate(), 1, CALL_AS_METHOD); 2145 CallFunctionStub stub(isolate(), 1, CALL_AS_METHOD);
2146 __ CallStub(&stub); 2146 __ CallStub(&stub);
2147 2147
2148 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2148 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2149 __ Drop(1); // The function is still on the stack; drop it. 2149 __ Drop(1); // The function is still on the stack; drop it.
2150 2150
2151 // if (!result.done) goto l_try; 2151 // if (!result.done) goto l_try;
2152 __ Move(load_receiver, v0); 2152 __ Move(load_receiver, v0);
2153 2153
2154 __ push(load_receiver); // save result 2154 __ push(load_receiver); // save result
2155 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done" 2155 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done"
2156 if (FLAG_vector_ics) { 2156 if (FLAG_vector_ics) {
2157 __ li(VectorLoadICDescriptor::SlotRegister(), 2157 __ li(VectorLoadICDescriptor::SlotRegister(),
2158 Operand(Smi::FromInt(expr->DoneFeedbackSlot()))); 2158 Operand(SmiFromSlot(expr->DoneFeedbackSlot())));
2159 } 2159 }
2160 CallLoadIC(NOT_CONTEXTUAL); // v0=result.done 2160 CallLoadIC(NOT_CONTEXTUAL); // v0=result.done
2161 __ mov(a0, v0); 2161 __ mov(a0, v0);
2162 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate()); 2162 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
2163 CallIC(bool_ic); 2163 CallIC(bool_ic);
2164 __ Branch(&l_try, eq, v0, Operand(zero_reg)); 2164 __ Branch(&l_try, eq, v0, Operand(zero_reg));
2165 2165
2166 // result.value 2166 // result.value
2167 __ pop(load_receiver); // result 2167 __ pop(load_receiver); // result
2168 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value" 2168 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value"
2169 if (FLAG_vector_ics) { 2169 if (FLAG_vector_ics) {
2170 __ li(VectorLoadICDescriptor::SlotRegister(), 2170 __ li(VectorLoadICDescriptor::SlotRegister(),
2171 Operand(Smi::FromInt(expr->ValueFeedbackSlot()))); 2171 Operand(SmiFromSlot(expr->ValueFeedbackSlot())));
2172 } 2172 }
2173 CallLoadIC(NOT_CONTEXTUAL); // v0=result.value 2173 CallLoadIC(NOT_CONTEXTUAL); // v0=result.value
2174 context()->DropAndPlug(2, v0); // drop iter and g 2174 context()->DropAndPlug(2, v0); // drop iter and g
2175 break; 2175 break;
2176 } 2176 }
2177 } 2177 }
2178 } 2178 }
2179 2179
2180 2180
2181 void FullCodeGenerator::EmitGeneratorResume(Expression *generator, 2181 void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
2332 2332
2333 2333
2334 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { 2334 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
2335 SetSourcePosition(prop->position()); 2335 SetSourcePosition(prop->position());
2336 Literal* key = prop->key()->AsLiteral(); 2336 Literal* key = prop->key()->AsLiteral();
2337 DCHECK(!prop->IsSuperAccess()); 2337 DCHECK(!prop->IsSuperAccess());
2338 2338
2339 __ li(LoadDescriptor::NameRegister(), Operand(key->value())); 2339 __ li(LoadDescriptor::NameRegister(), Operand(key->value()));
2340 if (FLAG_vector_ics) { 2340 if (FLAG_vector_ics) {
2341 __ li(VectorLoadICDescriptor::SlotRegister(), 2341 __ li(VectorLoadICDescriptor::SlotRegister(),
2342 Operand(Smi::FromInt(prop->PropertyFeedbackSlot()))); 2342 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2343 CallLoadIC(NOT_CONTEXTUAL); 2343 CallLoadIC(NOT_CONTEXTUAL);
2344 } else { 2344 } else {
2345 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); 2345 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId());
2346 } 2346 }
2347 } 2347 }
2348 2348
2349 2349
2350 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { 2350 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
2351 // Stack: receiver, home_object. 2351 // Stack: receiver, home_object.
2352 SetSourcePosition(prop->position()); 2352 SetSourcePosition(prop->position());
2353 Literal* key = prop->key()->AsLiteral(); 2353 Literal* key = prop->key()->AsLiteral();
2354 DCHECK(!key->value()->IsSmi()); 2354 DCHECK(!key->value()->IsSmi());
2355 DCHECK(prop->IsSuperAccess()); 2355 DCHECK(prop->IsSuperAccess());
2356 2356
2357 __ Push(key->value()); 2357 __ Push(key->value());
2358 __ CallRuntime(Runtime::kLoadFromSuper, 3); 2358 __ CallRuntime(Runtime::kLoadFromSuper, 3);
2359 } 2359 }
2360 2360
2361 2361
2362 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { 2362 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
2363 SetSourcePosition(prop->position()); 2363 SetSourcePosition(prop->position());
2364 // Call keyed load IC. It has register arguments receiver and key. 2364 // Call keyed load IC. It has register arguments receiver and key.
2365 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); 2365 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
2366 if (FLAG_vector_ics) { 2366 if (FLAG_vector_ics) {
2367 __ li(VectorLoadICDescriptor::SlotRegister(), 2367 __ li(VectorLoadICDescriptor::SlotRegister(),
2368 Operand(Smi::FromInt(prop->PropertyFeedbackSlot()))); 2368 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2369 CallIC(ic); 2369 CallIC(ic);
2370 } else { 2370 } else {
2371 CallIC(ic, prop->PropertyFeedbackId()); 2371 CallIC(ic, prop->PropertyFeedbackId());
2372 } 2372 }
2373 } 2373 }
2374 2374
2375 2375
2376 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { 2376 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) {
2377 // Stack: receiver, home_object, key. 2377 // Stack: receiver, home_object, key.
2378 SetSourcePosition(prop->position()); 2378 SetSourcePosition(prop->position());
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
2864 { PreservePositionScope scope(masm()->positions_recorder()); 2864 { PreservePositionScope scope(masm()->positions_recorder());
2865 for (int i = 0; i < arg_count; i++) { 2865 for (int i = 0; i < arg_count; i++) {
2866 VisitForStackValue(args->at(i)); 2866 VisitForStackValue(args->at(i));
2867 } 2867 }
2868 } 2868 }
2869 2869
2870 // Record source position of the IC call. 2870 // Record source position of the IC call.
2871 SetSourcePosition(expr->position()); 2871 SetSourcePosition(expr->position());
2872 Handle<Code> ic = CallIC::initialize_stub( 2872 Handle<Code> ic = CallIC::initialize_stub(
2873 isolate(), arg_count, call_type); 2873 isolate(), arg_count, call_type);
2874 __ li(a3, Operand(Smi::FromInt(expr->CallFeedbackSlot()))); 2874 __ li(a3, Operand(SmiFromSlot(expr->CallFeedbackSlot())));
2875 __ ld(a1, MemOperand(sp, (arg_count + 1) * kPointerSize)); 2875 __ ld(a1, MemOperand(sp, (arg_count + 1) * kPointerSize));
2876 // Don't assign a type feedback id to the IC, since type feedback is provided 2876 // Don't assign a type feedback id to the IC, since type feedback is provided
2877 // by the vector above. 2877 // by the vector above.
2878 CallIC(ic); 2878 CallIC(ic);
2879 RecordJSReturnSite(expr); 2879 RecordJSReturnSite(expr);
2880 // Restore context register. 2880 // Restore context register.
2881 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2881 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2882 context()->DropAndPlug(1, v0); 2882 context()->DropAndPlug(1, v0);
2883 } 2883 }
2884 2884
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
3060 // constructor invocation. 3060 // constructor invocation.
3061 SetSourcePosition(expr->position()); 3061 SetSourcePosition(expr->position());
3062 3062
3063 // Load function and argument count into a1 and a0. 3063 // Load function and argument count into a1 and a0.
3064 __ li(a0, Operand(arg_count)); 3064 __ li(a0, Operand(arg_count));
3065 __ ld(a1, MemOperand(sp, arg_count * kPointerSize)); 3065 __ ld(a1, MemOperand(sp, arg_count * kPointerSize));
3066 3066
3067 // Record call targets in unoptimized code. 3067 // Record call targets in unoptimized code.
3068 if (FLAG_pretenuring_call_new) { 3068 if (FLAG_pretenuring_call_new) {
3069 EnsureSlotContainsAllocationSite(expr->AllocationSiteFeedbackSlot()); 3069 EnsureSlotContainsAllocationSite(expr->AllocationSiteFeedbackSlot());
3070 DCHECK(expr->AllocationSiteFeedbackSlot() == 3070 DCHECK(expr->AllocationSiteFeedbackSlot().ToInt() ==
3071 expr->CallNewFeedbackSlot() + 1); 3071 expr->CallNewFeedbackSlot().ToInt() + 1);
3072 } 3072 }
3073 3073
3074 __ li(a2, FeedbackVector()); 3074 __ li(a2, FeedbackVector());
3075 __ li(a3, Operand(Smi::FromInt(expr->CallNewFeedbackSlot()))); 3075 __ li(a3, Operand(SmiFromSlot(expr->CallNewFeedbackSlot())));
3076 3076
3077 CallConstructStub stub(isolate(), RECORD_CONSTRUCTOR_TARGET); 3077 CallConstructStub stub(isolate(), RECORD_CONSTRUCTOR_TARGET);
3078 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); 3078 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL);
3079 PrepareForBailoutForId(expr->ReturnId(), TOS_REG); 3079 PrepareForBailoutForId(expr->ReturnId(), TOS_REG);
3080 context()->Plug(v0); 3080 context()->Plug(v0);
3081 } 3081 }
3082 3082
3083 3083
3084 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { 3084 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) {
3085 ZoneList<Expression*>* args = expr->arguments(); 3085 ZoneList<Expression*>* args = expr->arguments();
(...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after
4299 // Push the builtins object as the receiver. 4299 // Push the builtins object as the receiver.
4300 Register receiver = LoadDescriptor::ReceiverRegister(); 4300 Register receiver = LoadDescriptor::ReceiverRegister();
4301 __ ld(receiver, GlobalObjectOperand()); 4301 __ ld(receiver, GlobalObjectOperand());
4302 __ ld(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); 4302 __ ld(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset));
4303 __ push(receiver); 4303 __ push(receiver);
4304 4304
4305 // Load the function from the receiver. 4305 // Load the function from the receiver.
4306 __ li(LoadDescriptor::NameRegister(), Operand(expr->name())); 4306 __ li(LoadDescriptor::NameRegister(), Operand(expr->name()));
4307 if (FLAG_vector_ics) { 4307 if (FLAG_vector_ics) {
4308 __ li(VectorLoadICDescriptor::SlotRegister(), 4308 __ li(VectorLoadICDescriptor::SlotRegister(),
4309 Operand(Smi::FromInt(expr->CallRuntimeFeedbackSlot()))); 4309 Operand(SmiFromSlot(expr->CallRuntimeFeedbackSlot())));
4310 CallLoadIC(NOT_CONTEXTUAL); 4310 CallLoadIC(NOT_CONTEXTUAL);
4311 } else { 4311 } else {
4312 CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId()); 4312 CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId());
4313 } 4313 }
4314 4314
4315 // Push the target function under the receiver. 4315 // Push the target function under the receiver.
4316 __ ld(at, MemOperand(sp, 0)); 4316 __ ld(at, MemOperand(sp, 0));
4317 __ push(at); 4317 __ push(at);
4318 __ sd(v0, MemOperand(sp, kPointerSize)); 4318 __ sd(v0, MemOperand(sp, kPointerSize));
4319 4319
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
4705 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { 4705 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
4706 DCHECK(!context()->IsEffect()); 4706 DCHECK(!context()->IsEffect());
4707 DCHECK(!context()->IsTest()); 4707 DCHECK(!context()->IsTest());
4708 VariableProxy* proxy = expr->AsVariableProxy(); 4708 VariableProxy* proxy = expr->AsVariableProxy();
4709 if (proxy != NULL && proxy->var()->IsUnallocated()) { 4709 if (proxy != NULL && proxy->var()->IsUnallocated()) {
4710 Comment cmnt(masm_, "[ Global variable"); 4710 Comment cmnt(masm_, "[ Global variable");
4711 __ ld(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 4711 __ ld(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
4712 __ li(LoadDescriptor::NameRegister(), Operand(proxy->name())); 4712 __ li(LoadDescriptor::NameRegister(), Operand(proxy->name()));
4713 if (FLAG_vector_ics) { 4713 if (FLAG_vector_ics) {
4714 __ li(VectorLoadICDescriptor::SlotRegister(), 4714 __ li(VectorLoadICDescriptor::SlotRegister(),
4715 Operand(Smi::FromInt(proxy->VariableFeedbackSlot()))); 4715 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
4716 } 4716 }
4717 // Use a regular load, not a contextual load, to avoid a reference 4717 // Use a regular load, not a contextual load, to avoid a reference
4718 // error. 4718 // error.
4719 CallLoadIC(NOT_CONTEXTUAL); 4719 CallLoadIC(NOT_CONTEXTUAL);
4720 PrepareForBailout(expr, TOS_REG); 4720 PrepareForBailout(expr, TOS_REG);
4721 context()->Plug(v0); 4721 context()->Plug(v0);
4722 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) { 4722 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
4723 Comment cmnt(masm_, "[ Lookup slot"); 4723 Comment cmnt(masm_, "[ Lookup slot");
4724 Label done, slow; 4724 Label done, slow;
4725 4725
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
5141 Assembler::target_address_at(pc_immediate_load_address)) == 5141 Assembler::target_address_at(pc_immediate_load_address)) ==
5142 reinterpret_cast<uint64_t>( 5142 reinterpret_cast<uint64_t>(
5143 isolate->builtins()->OsrAfterStackCheck()->entry())); 5143 isolate->builtins()->OsrAfterStackCheck()->entry()));
5144 return OSR_AFTER_STACK_CHECK; 5144 return OSR_AFTER_STACK_CHECK;
5145 } 5145 }
5146 5146
5147 5147
5148 } } // namespace v8::internal 5148 } } // namespace v8::internal
5149 5149
5150 #endif // V8_TARGET_ARCH_MIPS64 5150 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « no previous file | src/mips64/lithium-codegen-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698