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

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

Issue 1370893002: [Interpreter] Add support for short (16 bit) operands. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase 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
« no previous file with comments | « src/interpreter/bytecodes.cc ('k') | test/cctest/interpreter/test-bytecode-generator.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 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 Node* smi_int = __ SmiTag(raw_int); 104 Node* smi_int = __ SmiTag(raw_int);
105 __ SetAccumulator(smi_int); 105 __ SetAccumulator(smi_int);
106 __ Dispatch(); 106 __ Dispatch();
107 } 107 }
108 108
109 109
110 // LdaConstant <idx> 110 // LdaConstant <idx>
111 // 111 //
112 // Load constant literal at |idx| in the constant pool into the accumulator. 112 // Load constant literal at |idx| in the constant pool into the accumulator.
113 void Interpreter::DoLdaConstant(compiler::InterpreterAssembler* assembler) { 113 void Interpreter::DoLdaConstant(compiler::InterpreterAssembler* assembler) {
114 Node* index = __ BytecodeOperandIdx(0); 114 Node* index = __ BytecodeOperandIdx8(0);
115 Node* constant = __ LoadConstantPoolEntry(index); 115 Node* constant = __ LoadConstantPoolEntry(index);
116 __ SetAccumulator(constant); 116 __ SetAccumulator(constant);
117 __ Dispatch(); 117 __ Dispatch();
118 } 118 }
119 119
120 120
121 // LdaUndefined 121 // LdaUndefined
122 // 122 //
123 // Load Undefined into the accumulator. 123 // Load Undefined into the accumulator.
124 void Interpreter::DoLdaUndefined(compiler::InterpreterAssembler* assembler) { 124 void Interpreter::DoLdaUndefined(compiler::InterpreterAssembler* assembler) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 Node* false_value = __ HeapConstant(isolate_->factory()->false_value()); 166 Node* false_value = __ HeapConstant(isolate_->factory()->false_value());
167 __ SetAccumulator(false_value); 167 __ SetAccumulator(false_value);
168 __ Dispatch(); 168 __ Dispatch();
169 } 169 }
170 170
171 171
172 // Ldar <src> 172 // Ldar <src>
173 // 173 //
174 // Load accumulator with value from register <src>. 174 // Load accumulator with value from register <src>.
175 void Interpreter::DoLdar(compiler::InterpreterAssembler* assembler) { 175 void Interpreter::DoLdar(compiler::InterpreterAssembler* assembler) {
176 Node* reg_index = __ BytecodeOperandReg(0); 176 Node* reg_index = __ BytecodeOperandReg8(0);
177 Node* value = __ LoadRegister(reg_index); 177 Node* value = __ LoadRegister(reg_index);
178 __ SetAccumulator(value); 178 __ SetAccumulator(value);
179 __ Dispatch(); 179 __ Dispatch();
180 } 180 }
181 181
182 182
183 // Star <dst> 183 // Star <dst>
184 // 184 //
185 // Store accumulator to register <dst>. 185 // Store accumulator to register <dst>.
186 void Interpreter::DoStar(compiler::InterpreterAssembler* assembler) { 186 void Interpreter::DoStar(compiler::InterpreterAssembler* assembler) {
187 Node* reg_index = __ BytecodeOperandReg(0); 187 Node* reg_index = __ BytecodeOperandReg8(0);
188 Node* accumulator = __ GetAccumulator(); 188 Node* accumulator = __ GetAccumulator();
189 __ StoreRegister(accumulator, reg_index); 189 __ StoreRegister(accumulator, reg_index);
190 __ Dispatch(); 190 __ Dispatch();
191 } 191 }
192 192
193 193
194 // LdaGlobal <slot_index> 194 // LdaGlobal <slot_index>
195 // 195 //
196 // Load the global at |slot_index| into the accumulator. 196 // Load the global at |slot_index| into the accumulator.
197 void Interpreter::DoLdaGlobal(compiler::InterpreterAssembler* assembler) { 197 void Interpreter::DoLdaGlobal(compiler::InterpreterAssembler* assembler) {
198 Node* slot_index = __ BytecodeOperandIdx(0); 198 Node* slot_index = __ BytecodeOperandIdx8(0);
199 Node* smi_slot_index = __ SmiTag(slot_index); 199 Node* smi_slot_index = __ SmiTag(slot_index);
200 Node* result = __ CallRuntime(Runtime::kLoadGlobalViaContext, smi_slot_index); 200 Node* result = __ CallRuntime(Runtime::kLoadGlobalViaContext, smi_slot_index);
201 __ SetAccumulator(result); 201 __ SetAccumulator(result);
202 __ Dispatch(); 202 __ Dispatch();
203 } 203 }
204 204
205 205
206 void Interpreter::DoPropertyLoadIC(Callable ic, 206 void Interpreter::DoPropertyLoadIC(Callable ic,
207 compiler::InterpreterAssembler* assembler) { 207 compiler::InterpreterAssembler* assembler) {
208 Node* code_target = __ HeapConstant(ic.code()); 208 Node* code_target = __ HeapConstant(ic.code());
209 Node* reg_index = __ BytecodeOperandReg(0); 209 Node* reg_index = __ BytecodeOperandReg8(0);
210 Node* object = __ LoadRegister(reg_index); 210 Node* object = __ LoadRegister(reg_index);
211 Node* name = __ GetAccumulator(); 211 Node* name = __ GetAccumulator();
212 Node* raw_slot = __ BytecodeOperandIdx(1); 212 Node* raw_slot = __ BytecodeOperandIdx8(1);
213 Node* smi_slot = __ SmiTag(raw_slot); 213 Node* smi_slot = __ SmiTag(raw_slot);
214 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 214 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
215 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot, 215 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot,
216 type_feedback_vector); 216 type_feedback_vector);
217 __ SetAccumulator(result); 217 __ SetAccumulator(result);
218 __ Dispatch(); 218 __ Dispatch();
219 } 219 }
220 220
221 221
222 // LoadIC <object> <slot> 222 // LoadIC <object> <slot>
(...skipping 14 matching lines...) Expand all
237 void Interpreter::DoKeyedLoadIC(compiler::InterpreterAssembler* assembler) { 237 void Interpreter::DoKeyedLoadIC(compiler::InterpreterAssembler* assembler) {
238 Callable ic = 238 Callable ic =
239 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); 239 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
240 DoPropertyLoadIC(ic, assembler); 240 DoPropertyLoadIC(ic, assembler);
241 } 241 }
242 242
243 243
244 void Interpreter::DoPropertyStoreIC(Callable ic, 244 void Interpreter::DoPropertyStoreIC(Callable ic,
245 compiler::InterpreterAssembler* assembler) { 245 compiler::InterpreterAssembler* assembler) {
246 Node* code_target = __ HeapConstant(ic.code()); 246 Node* code_target = __ HeapConstant(ic.code());
247 Node* object_reg_index = __ BytecodeOperandReg(0); 247 Node* object_reg_index = __ BytecodeOperandReg8(0);
248 Node* object = __ LoadRegister(object_reg_index); 248 Node* object = __ LoadRegister(object_reg_index);
249 Node* name_reg_index = __ BytecodeOperandReg(1); 249 Node* name_reg_index = __ BytecodeOperandReg8(1);
250 Node* name = __ LoadRegister(name_reg_index); 250 Node* name = __ LoadRegister(name_reg_index);
251 Node* value = __ GetAccumulator(); 251 Node* value = __ GetAccumulator();
252 Node* raw_slot = __ BytecodeOperandIdx(2); 252 Node* raw_slot = __ BytecodeOperandIdx8(2);
253 Node* smi_slot = __ SmiTag(raw_slot); 253 Node* smi_slot = __ SmiTag(raw_slot);
254 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); 254 Node* type_feedback_vector = __ LoadTypeFeedbackVector();
255 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value, 255 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value,
256 smi_slot, type_feedback_vector); 256 smi_slot, type_feedback_vector);
257 __ SetAccumulator(result); 257 __ SetAccumulator(result);
258 __ Dispatch(); 258 __ Dispatch();
259 } 259 }
260 260
261 261
262 // StoreIC <object> <name> <slot> 262 // StoreIC <object> <name> <slot>
(...skipping 15 matching lines...) Expand all
278 Callable ic = 278 Callable ic =
279 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); 279 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
280 DoPropertyStoreIC(ic, assembler); 280 DoPropertyStoreIC(ic, assembler);
281 } 281 }
282 282
283 283
284 void Interpreter::DoBinaryOp(Runtime::FunctionId function_id, 284 void Interpreter::DoBinaryOp(Runtime::FunctionId function_id,
285 compiler::InterpreterAssembler* assembler) { 285 compiler::InterpreterAssembler* assembler) {
286 // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized 286 // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized
287 // operations, instead of calling builtins directly. 287 // operations, instead of calling builtins directly.
288 Node* reg_index = __ BytecodeOperandReg(0); 288 Node* reg_index = __ BytecodeOperandReg8(0);
289 Node* lhs = __ LoadRegister(reg_index); 289 Node* lhs = __ LoadRegister(reg_index);
290 Node* rhs = __ GetAccumulator(); 290 Node* rhs = __ GetAccumulator();
291 Node* result = __ CallRuntime(function_id, lhs, rhs); 291 Node* result = __ CallRuntime(function_id, lhs, rhs);
292 __ SetAccumulator(result); 292 __ SetAccumulator(result);
293 __ Dispatch(); 293 __ Dispatch();
294 } 294 }
295 295
296 296
297 // Add <src> 297 // Add <src>
298 // 298 //
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 void Interpreter::DoMod(compiler::InterpreterAssembler* assembler) { 332 void Interpreter::DoMod(compiler::InterpreterAssembler* assembler) {
333 DoBinaryOp(Runtime::kModulus, assembler); 333 DoBinaryOp(Runtime::kModulus, assembler);
334 } 334 }
335 335
336 336
337 // Call <receiver> <arg_count> 337 // Call <receiver> <arg_count>
338 // 338 //
339 // Call a JS function with receiver and |arg_count| arguments in subsequent 339 // Call a JS function with receiver and |arg_count| arguments in subsequent
340 // registers. The JSfunction or Callable to call is in the accumulator. 340 // registers. The JSfunction or Callable to call is in the accumulator.
341 void Interpreter::DoCall(compiler::InterpreterAssembler* assembler) { 341 void Interpreter::DoCall(compiler::InterpreterAssembler* assembler) {
342 Node* function_reg = __ BytecodeOperandReg(0); 342 Node* function_reg = __ BytecodeOperandReg8(0);
343 Node* function = __ LoadRegister(function_reg); 343 Node* function = __ LoadRegister(function_reg);
344 Node* receiver_reg = __ BytecodeOperandReg(1); 344 Node* receiver_reg = __ BytecodeOperandReg8(1);
345 Node* first_arg = __ RegisterLocation(receiver_reg); 345 Node* first_arg = __ RegisterLocation(receiver_reg);
346 Node* args_count = __ BytecodeOperandCount(2); 346 Node* args_count = __ BytecodeOperandCount8(2);
347 Node* result = __ CallJS(function, first_arg, args_count); 347 Node* result = __ CallJS(function, first_arg, args_count);
348 __ SetAccumulator(result); 348 __ SetAccumulator(result);
349 __ Dispatch(); 349 __ Dispatch();
350 } 350 }
351 351
352 352
353 // TestEqual <src> 353 // TestEqual <src>
354 // 354 //
355 // Test if the value in the <src> register equals the accumulator. 355 // Test if the value in the <src> register equals the accumulator.
356 void Interpreter::DoTestEqual(compiler::InterpreterAssembler* assembler) { 356 void Interpreter::DoTestEqual(compiler::InterpreterAssembler* assembler) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 void Interpreter::DoJump(compiler::InterpreterAssembler* assembler) { 454 void Interpreter::DoJump(compiler::InterpreterAssembler* assembler) {
455 Node* relative_jump = __ BytecodeOperandImm8(0); 455 Node* relative_jump = __ BytecodeOperandImm8(0);
456 __ Jump(relative_jump); 456 __ Jump(relative_jump);
457 } 457 }
458 458
459 459
460 // JumpConstant <idx> 460 // JumpConstant <idx>
461 // 461 //
462 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool. 462 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool.
463 void Interpreter::DoJumpConstant(compiler::InterpreterAssembler* assembler) { 463 void Interpreter::DoJumpConstant(compiler::InterpreterAssembler* assembler) {
464 Node* index = __ BytecodeOperandIdx(0); 464 Node* index = __ BytecodeOperandIdx8(0);
465 Node* constant = __ LoadConstantPoolEntry(index); 465 Node* constant = __ LoadConstantPoolEntry(index);
466 Node* relative_jump = __ SmiUntag(constant); 466 Node* relative_jump = __ SmiUntag(constant);
467 __ Jump(relative_jump); 467 __ Jump(relative_jump);
468 } 468 }
469 469
470 470
471 // JumpIfTrue <imm8> 471 // JumpIfTrue <imm8>
472 // 472 //
473 // Jump by number of bytes represented by an immediate operand if the 473 // Jump by number of bytes represented by an immediate operand if the
474 // accumulator contains true. 474 // accumulator contains true.
475 void Interpreter::DoJumpIfTrue(compiler::InterpreterAssembler* assembler) { 475 void Interpreter::DoJumpIfTrue(compiler::InterpreterAssembler* assembler) {
476 Node* accumulator = __ GetAccumulator(); 476 Node* accumulator = __ GetAccumulator();
477 Node* relative_jump = __ BytecodeOperandImm8(0); 477 Node* relative_jump = __ BytecodeOperandImm8(0);
478 Node* true_value = __ BooleanConstant(true); 478 Node* true_value = __ BooleanConstant(true);
479 __ JumpIfWordEqual(accumulator, true_value, relative_jump); 479 __ JumpIfWordEqual(accumulator, true_value, relative_jump);
480 } 480 }
481 481
482 482
483 // JumpIfTrueConstant <idx> 483 // JumpIfTrueConstant <idx>
484 // 484 //
485 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool 485 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool
486 // if the accumulator contains true. 486 // if the accumulator contains true.
487 void Interpreter::DoJumpIfTrueConstant( 487 void Interpreter::DoJumpIfTrueConstant(
488 compiler::InterpreterAssembler* assembler) { 488 compiler::InterpreterAssembler* assembler) {
489 Node* accumulator = __ GetAccumulator(); 489 Node* accumulator = __ GetAccumulator();
490 Node* index = __ BytecodeOperandIdx(0); 490 Node* index = __ BytecodeOperandIdx8(0);
491 Node* constant = __ LoadConstantPoolEntry(index); 491 Node* constant = __ LoadConstantPoolEntry(index);
492 Node* relative_jump = __ SmiUntag(constant); 492 Node* relative_jump = __ SmiUntag(constant);
493 Node* true_value = __ BooleanConstant(true); 493 Node* true_value = __ BooleanConstant(true);
494 __ JumpIfWordEqual(accumulator, true_value, relative_jump); 494 __ JumpIfWordEqual(accumulator, true_value, relative_jump);
495 } 495 }
496 496
497 497
498 // JumpIfFalse <imm8> 498 // JumpIfFalse <imm8>
499 // 499 //
500 // Jump by number of bytes represented by an immediate operand if the 500 // Jump by number of bytes represented by an immediate operand if the
501 // accumulator contains false. 501 // accumulator contains false.
502 void Interpreter::DoJumpIfFalse(compiler::InterpreterAssembler* assembler) { 502 void Interpreter::DoJumpIfFalse(compiler::InterpreterAssembler* assembler) {
503 Node* accumulator = __ GetAccumulator(); 503 Node* accumulator = __ GetAccumulator();
504 Node* relative_jump = __ BytecodeOperandImm8(0); 504 Node* relative_jump = __ BytecodeOperandImm8(0);
505 Node* false_value = __ BooleanConstant(false); 505 Node* false_value = __ BooleanConstant(false);
506 __ JumpIfWordEqual(accumulator, false_value, relative_jump); 506 __ JumpIfWordEqual(accumulator, false_value, relative_jump);
507 } 507 }
508 508
509 509
510 // JumpIfFalseConstant <idx> 510 // JumpIfFalseConstant <idx>
511 // 511 //
512 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool 512 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool
513 // if the accumulator contains false. 513 // if the accumulator contains false.
514 void Interpreter::DoJumpIfFalseConstant( 514 void Interpreter::DoJumpIfFalseConstant(
515 compiler::InterpreterAssembler* assembler) { 515 compiler::InterpreterAssembler* assembler) {
516 Node* accumulator = __ GetAccumulator(); 516 Node* accumulator = __ GetAccumulator();
517 Node* index = __ BytecodeOperandIdx(0); 517 Node* index = __ BytecodeOperandIdx8(0);
518 Node* constant = __ LoadConstantPoolEntry(index); 518 Node* constant = __ LoadConstantPoolEntry(index);
519 Node* relative_jump = __ SmiUntag(constant); 519 Node* relative_jump = __ SmiUntag(constant);
520 Node* false_value = __ BooleanConstant(false); 520 Node* false_value = __ BooleanConstant(false);
521 __ JumpIfWordEqual(accumulator, false_value, relative_jump); 521 __ JumpIfWordEqual(accumulator, false_value, relative_jump);
522 } 522 }
523 523
524 524
525 // Return 525 // Return
526 // 526 //
527 // Return the value in register 0. 527 // Return the value in register 0.
528 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { 528 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) {
529 __ Return(); 529 __ Return();
530 } 530 }
531 531
532 532
533 } // namespace interpreter 533 } // namespace interpreter
534 } // namespace internal 534 } // namespace internal
535 } // namespace v8 535 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecodes.cc ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698