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

Side by Side Diff: src/compiler/interpreter-assembler.cc

Issue 1343363002: [Interpreter] Basic flow control. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Switch test-bytecode-generator/IfConditions to use new style bytecode array check. 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/compiler/interpreter-assembler.h ('k') | src/compiler/raw-machine-assembler.h » ('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/compiler/interpreter-assembler.h" 5 #include "src/compiler/interpreter-assembler.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/compiler/graph.h" 10 #include "src/compiler/graph.h"
(...skipping 14 matching lines...) Expand all
25 namespace compiler { 25 namespace compiler {
26 26
27 27
28 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, 28 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone,
29 interpreter::Bytecode bytecode) 29 interpreter::Bytecode bytecode)
30 : bytecode_(bytecode), 30 : bytecode_(bytecode),
31 raw_assembler_(new RawMachineAssembler( 31 raw_assembler_(new RawMachineAssembler(
32 isolate, new (zone) Graph(zone), 32 isolate, new (zone) Graph(zone),
33 Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr, 33 Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr,
34 InstructionSelector::SupportedMachineOperatorFlags())), 34 InstructionSelector::SupportedMachineOperatorFlags())),
35 end_node_(nullptr), 35 end_nodes_(zone),
36 accumulator_( 36 accumulator_(
37 raw_assembler_->Parameter(Linkage::kInterpreterAccumulatorParameter)), 37 raw_assembler_->Parameter(Linkage::kInterpreterAccumulatorParameter)),
38 code_generated_(false) {} 38 code_generated_(false) {}
39 39
40 40
41 InterpreterAssembler::~InterpreterAssembler() {} 41 InterpreterAssembler::~InterpreterAssembler() {}
42 42
43 43
44 Handle<Code> InterpreterAssembler::GenerateCode() { 44 Handle<Code> InterpreterAssembler::GenerateCode() {
45 DCHECK(!code_generated_); 45 DCHECK(!code_generated_);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 Node* InterpreterAssembler::NumberConstant(double value) { 186 Node* InterpreterAssembler::NumberConstant(double value) {
187 return raw_assembler_->NumberConstant(value); 187 return raw_assembler_->NumberConstant(value);
188 } 188 }
189 189
190 190
191 Node* InterpreterAssembler::HeapConstant(Handle<HeapObject> object) { 191 Node* InterpreterAssembler::HeapConstant(Handle<HeapObject> object) {
192 return raw_assembler_->HeapConstant(object); 192 return raw_assembler_->HeapConstant(object);
193 } 193 }
194 194
195 195
196 Node* InterpreterAssembler::BooleanConstant(bool value) {
197 return raw_assembler_->BooleanConstant(value);
198 }
199
200
196 Node* InterpreterAssembler::SmiShiftBitsConstant() { 201 Node* InterpreterAssembler::SmiShiftBitsConstant() {
197 return Int32Constant(kSmiShiftSize + kSmiTagSize); 202 return Int32Constant(kSmiShiftSize + kSmiTagSize);
198 } 203 }
199 204
200 205
201 Node* InterpreterAssembler::SmiTag(Node* value) { 206 Node* InterpreterAssembler::SmiTag(Node* value) {
202 return raw_assembler_->WordShl(value, SmiShiftBitsConstant()); 207 return raw_assembler_->WordShl(value, SmiShiftBitsConstant());
203 } 208 }
204 209
205 210
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); 346 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter);
342 Node* args[] = { GetAccumulator(), 347 Node* args[] = { GetAccumulator(),
343 RegisterFileRawPointer(), 348 RegisterFileRawPointer(),
344 BytecodeOffset(), 349 BytecodeOffset(),
345 BytecodeArrayTaggedPointer(), 350 BytecodeArrayTaggedPointer(),
346 DispatchTableRawPointer(), 351 DispatchTableRawPointer(),
347 ContextTaggedPointer() }; 352 ContextTaggedPointer() };
348 Node* tail_call = raw_assembler_->TailCallN( 353 Node* tail_call = raw_assembler_->TailCallN(
349 call_descriptor(), exit_trampoline_code_object, args); 354 call_descriptor(), exit_trampoline_code_object, args);
350 // This should always be the end node. 355 // This should always be the end node.
351 SetEndInput(tail_call); 356 AddEndInput(tail_call);
352 } 357 }
353 358
354 359
355 Node* InterpreterAssembler::Advance(int delta) { 360 Node* InterpreterAssembler::Advance(int delta) {
356 return IntPtrAdd(BytecodeOffset(), Int32Constant(delta)); 361 return IntPtrAdd(BytecodeOffset(), Int32Constant(delta));
357 } 362 }
358 363
359 364
365 Node* InterpreterAssembler::Advance(Node* delta) {
366 return raw_assembler_->IntPtrAdd(BytecodeOffset(), delta);
367 }
368
369
370 void InterpreterAssembler::Jump(Node* delta) { DispatchTo(Advance(delta)); }
371
372
373 void InterpreterAssembler::JumpIfWordEqual(Node* lhs, Node* rhs, Node* delta) {
374 RawMachineAssembler::Label match, no_match;
375 Node* condition = raw_assembler_->WordEqual(lhs, rhs);
376 raw_assembler_->Branch(condition, &match, &no_match);
377 raw_assembler_->Bind(&match);
378 DispatchTo(Advance(delta));
379 raw_assembler_->Bind(&no_match);
380 Dispatch();
381 }
382
383
360 void InterpreterAssembler::Dispatch() { 384 void InterpreterAssembler::Dispatch() {
361 Node* new_bytecode_offset = Advance(interpreter::Bytecodes::Size(bytecode_)); 385 DispatchTo(Advance(interpreter::Bytecodes::Size(bytecode_)));
386 }
387
388
389 void InterpreterAssembler::DispatchTo(Node* new_bytecode_offset) {
362 Node* target_bytecode = raw_assembler_->Load( 390 Node* target_bytecode = raw_assembler_->Load(
363 kMachUint8, BytecodeArrayTaggedPointer(), new_bytecode_offset); 391 kMachUint8, BytecodeArrayTaggedPointer(), new_bytecode_offset);
364 392
365 // TODO(rmcilroy): Create a code target dispatch table to avoid conversion 393 // TODO(rmcilroy): Create a code target dispatch table to avoid conversion
366 // from code object on every dispatch. 394 // from code object on every dispatch.
367 Node* target_code_object = raw_assembler_->Load( 395 Node* target_code_object = raw_assembler_->Load(
368 kMachPtr, DispatchTableRawPointer(), 396 kMachPtr, DispatchTableRawPointer(),
369 raw_assembler_->Word32Shl(target_bytecode, 397 raw_assembler_->Word32Shl(target_bytecode,
370 Int32Constant(kPointerSizeLog2))); 398 Int32Constant(kPointerSizeLog2)));
371 399
372 // If the order of the parameters you need to change the call signature below. 400 // If the order of the parameters you need to change the call signature below.
373 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); 401 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter);
374 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); 402 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter);
375 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); 403 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter);
376 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); 404 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter);
377 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); 405 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter);
378 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); 406 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter);
379 Node* args[] = { GetAccumulator(), 407 Node* args[] = { GetAccumulator(),
380 RegisterFileRawPointer(), 408 RegisterFileRawPointer(),
381 new_bytecode_offset, 409 new_bytecode_offset,
382 BytecodeArrayTaggedPointer(), 410 BytecodeArrayTaggedPointer(),
383 DispatchTableRawPointer(), 411 DispatchTableRawPointer(),
384 ContextTaggedPointer() }; 412 ContextTaggedPointer() };
385 Node* tail_call = 413 Node* tail_call =
386 raw_assembler_->TailCallN(call_descriptor(), target_code_object, args); 414 raw_assembler_->TailCallN(call_descriptor(), target_code_object, args);
387 // This should always be the end node. 415 // This should always be the end node.
388 SetEndInput(tail_call); 416 AddEndInput(tail_call);
389 } 417 }
390 418
391 419
392 void InterpreterAssembler::SetEndInput(Node* input) { 420 void InterpreterAssembler::AddEndInput(Node* input) {
393 DCHECK(!end_node_); 421 DCHECK_NOT_NULL(input);
394 end_node_ = input; 422 end_nodes_.push_back(input);
395 } 423 }
396 424
397 425
398 void InterpreterAssembler::End() { 426 void InterpreterAssembler::End() {
399 DCHECK(end_node_); 427 DCHECK(!end_nodes_.empty());
400 // TODO(rmcilroy): Support more than 1 end input. 428 int end_count = static_cast<int>(end_nodes_.size());
401 Node* end = graph()->NewNode(raw_assembler_->common()->End(1), end_node_); 429 Node* end = graph()->NewNode(raw_assembler_->common()->End(end_count),
430 end_count, &end_nodes_[0]);
402 graph()->SetEnd(end); 431 graph()->SetEnd(end);
403 } 432 }
404 433
405 434
406 // RawMachineAssembler delegate helpers: 435 // RawMachineAssembler delegate helpers:
407 Isolate* InterpreterAssembler::isolate() { return raw_assembler_->isolate(); } 436 Isolate* InterpreterAssembler::isolate() { return raw_assembler_->isolate(); }
408 437
409 438
410 Graph* InterpreterAssembler::graph() { return raw_assembler_->graph(); } 439 Graph* InterpreterAssembler::graph() { return raw_assembler_->graph(); }
411 440
412 441
413 CallDescriptor* InterpreterAssembler::call_descriptor() const { 442 CallDescriptor* InterpreterAssembler::call_descriptor() const {
414 return raw_assembler_->call_descriptor(); 443 return raw_assembler_->call_descriptor();
415 } 444 }
416 445
417 446
418 Schedule* InterpreterAssembler::schedule() { 447 Schedule* InterpreterAssembler::schedule() {
419 return raw_assembler_->schedule(); 448 return raw_assembler_->schedule();
420 } 449 }
421 450
422 451
423 Zone* InterpreterAssembler::zone() { return raw_assembler_->zone(); } 452 Zone* InterpreterAssembler::zone() { return raw_assembler_->zone(); }
424 453
425 454
426 } // namespace interpreter 455 } // namespace interpreter
427 } // namespace internal 456 } // namespace internal
428 } // namespace v8 457 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/interpreter-assembler.h ('k') | src/compiler/raw-machine-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698