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

Side by Side Diff: src/interpreter/interpreter.cc

Issue 1385623002: [Interpreter]: Add support for strict mode load / store ICs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/interpreter.h" 5 #include "src/interpreter/interpreter.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler.h" 8 #include "src/compiler.h"
9 #include "src/compiler/interpreter-assembler.h" 9 #include "src/compiler/interpreter-assembler.h"
10 #include "src/factory.h" 10 #include "src/factory.h"
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 // 223 //
224 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name 224 // Calls the LoadIC at FeedBackVector slot <slot> for <object> and the name
225 // in the accumulator. 225 // in the accumulator.
226 void Interpreter::DoLoadIC(compiler::InterpreterAssembler* assembler) { 226 void Interpreter::DoLoadIC(compiler::InterpreterAssembler* assembler) {
227 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, 227 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
228 SLOPPY, UNINITIALIZED); 228 SLOPPY, UNINITIALIZED);
229 DoPropertyLoadIC(ic, assembler); 229 DoPropertyLoadIC(ic, assembler);
230 } 230 }
231 231
232 232
233 // LoadICStrict <object> <slot>
234 //
235 // Calls the strict mode LoadIC at FeedBackVector slot <slot> for <object> and
236 // the name in the accumulator.
237 void Interpreter::DoLoadICStrict(compiler::InterpreterAssembler* assembler) {
238 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
239 STRICT, UNINITIALIZED);
240 DoPropertyLoadIC(ic, assembler);
241 }
242
243
233 // KeyedLoadIC <object> <slot> 244 // KeyedLoadIC <object> <slot>
234 // 245 //
235 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key 246 // Calls the KeyedLoadIC at FeedBackVector slot <slot> for <object> and the key
236 // in the accumulator. 247 // in the accumulator.
237 void Interpreter::DoKeyedLoadIC(compiler::InterpreterAssembler* assembler) { 248 void Interpreter::DoKeyedLoadIC(compiler::InterpreterAssembler* assembler) {
238 Callable ic = 249 Callable ic =
239 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); 250 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
240 DoPropertyLoadIC(ic, assembler); 251 DoPropertyLoadIC(ic, assembler);
241 } 252 }
242 253
243 254
255 // KeyedLoadICStrict <object> <slot>
256 //
257 // Calls the strict mode KeyedLoadIC at FeedBackVector slot <slot> for <object>
258 // and the key in the accumulator.
259 void Interpreter::DoKeyedLoadICStrict(
260 compiler::InterpreterAssembler* assembler) {
261 Callable ic =
262 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
263 DoPropertyLoadIC(ic, assembler);
264 }
265
266
244 void Interpreter::DoPropertyStoreIC(Callable ic, 267 void Interpreter::DoPropertyStoreIC(Callable ic,
245 compiler::InterpreterAssembler* assembler) { 268 compiler::InterpreterAssembler* assembler) {
246 Node* code_target = __ HeapConstant(ic.code()); 269 Node* code_target = __ HeapConstant(ic.code());
247 Node* object_reg_index = __ BytecodeOperandReg8(0); 270 Node* object_reg_index = __ BytecodeOperandReg8(0);
248 Node* object = __ LoadRegister(object_reg_index); 271 Node* object = __ LoadRegister(object_reg_index);
249 Node* name_reg_index = __ BytecodeOperandReg8(1); 272 Node* name_reg_index = __ BytecodeOperandReg8(1);
250 Node* name = __ LoadRegister(name_reg_index); 273 Node* name = __ LoadRegister(name_reg_index);
251 Node* value = __ GetAccumulator(); 274 Node* value = __ GetAccumulator();
252 Node* raw_slot = __ BytecodeOperandIdx8(2); 275 Node* raw_slot = __ BytecodeOperandIdx8(2);
253 Node* smi_slot = __ SmiTag(raw_slot); 276 Node* smi_slot = __ SmiTag(raw_slot);
254 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 277 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
255 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value, 278 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value,
256 smi_slot, type_feedback_vector); 279 smi_slot, type_feedback_vector);
257 __ SetAccumulator(result); 280 __ SetAccumulator(result);
258 __ Dispatch(); 281 __ Dispatch();
259 } 282 }
260 283
261 284
262 // StoreIC <object> <name> <slot> 285 // StoreIC <object> <name> <slot>
263 // 286 //
264 // Calls the StoreIC at FeedBackVector slot <slot> for <object> and the name 287 // Calls the StoreIC at FeedBackVector slot <slot> for <object> and the name
265 // <name> with the value in the accumulator. 288 // <name> with the value in the accumulator.
266 void Interpreter::DoStoreIC(compiler::InterpreterAssembler* assembler) { 289 void Interpreter::DoStoreIC(compiler::InterpreterAssembler* assembler) {
267 Callable ic = 290 Callable ic =
268 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); 291 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
269 DoPropertyStoreIC(ic, assembler); 292 DoPropertyStoreIC(ic, assembler);
270 } 293 }
271 294
272 295
296 // StoreICStrict <object> <name> <slot>
297 //
298 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and
299 // the name <name> with the value in the accumulator.
300 void Interpreter::DoStoreICStrict(compiler::InterpreterAssembler* assembler) {
301 Callable ic =
302 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
303 DoPropertyStoreIC(ic, assembler);
304 }
305
306
273 // KeyedStoreIC <object> <key> <slot> 307 // KeyedStoreIC <object> <key> <slot>
274 // 308 //
275 // Calls the KeyStoreIC at FeedBackVector slot <slot> for <object> and the key 309 // Calls the KeyStoreIC at FeedBackVector slot <slot> for <object> and the key
276 // <key> with the value in the accumulator. 310 // <key> with the value in the accumulator.
277 void Interpreter::DoKeyedStoreIC(compiler::InterpreterAssembler* assembler) { 311 void Interpreter::DoKeyedStoreIC(compiler::InterpreterAssembler* assembler) {
278 Callable ic = 312 Callable ic =
279 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); 313 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
280 DoPropertyStoreIC(ic, assembler); 314 DoPropertyStoreIC(ic, assembler);
281 } 315 }
282 316
283 317
318 // KeyedStoreICStore <object> <key> <slot>
319 //
320 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object>
321 // and the key <key> with the value in the accumulator.
322 void Interpreter::DoKeyedStoreICStrict(
323 compiler::InterpreterAssembler* assembler) {
324 Callable ic =
325 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
326 DoPropertyStoreIC(ic, assembler);
327 }
328
329
284 void Interpreter::DoBinaryOp(Runtime::FunctionId function_id, 330 void Interpreter::DoBinaryOp(Runtime::FunctionId function_id,
285 compiler::InterpreterAssembler* assembler) { 331 compiler::InterpreterAssembler* assembler) {
286 // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized 332 // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized
287 // operations, instead of calling builtins directly. 333 // operations, instead of calling builtins directly.
288 Node* reg_index = __ BytecodeOperandReg8(0); 334 Node* reg_index = __ BytecodeOperandReg8(0);
289 Node* lhs = __ LoadRegister(reg_index); 335 Node* lhs = __ LoadRegister(reg_index);
290 Node* rhs = __ GetAccumulator(); 336 Node* rhs = __ GetAccumulator();
291 Node* result = __ CallRuntime(function_id, lhs, rhs); 337 Node* result = __ CallRuntime(function_id, lhs, rhs);
292 __ SetAccumulator(result); 338 __ SetAccumulator(result);
293 __ Dispatch(); 339 __ Dispatch();
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 // 572 //
527 // Return the value in register 0. 573 // Return the value in register 0.
528 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { 574 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) {
529 __ Return(); 575 __ Return();
530 } 576 }
531 577
532 578
533 } // namespace interpreter 579 } // namespace interpreter
534 } // namespace internal 580 } // namespace internal
535 } // namespace v8 581 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698