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

Side by Side Diff: src/compiler/x64/code-generator-x64.cc

Issue 505713002: [turbofan] Add backend support for signed loads. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix x64. Created 6 years, 3 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 | « src/compiler/machine-type.cc ('k') | src/compiler/x64/instruction-codes-x64.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/compiler/code-generator-impl.h" 7 #include "src/compiler/code-generator-impl.h"
8 #include "src/compiler/gap-resolver.h" 8 #include "src/compiler/gap-resolver.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 if (input.type == kRegister) { 384 if (input.type == kRegister) {
385 __ pushq(input.reg); 385 __ pushq(input.reg);
386 } else { 386 } else {
387 __ pushq(input.operand); 387 __ pushq(input.operand);
388 } 388 }
389 break; 389 break;
390 } 390 }
391 case kX64PushI: 391 case kX64PushI:
392 __ pushq(i.InputImmediate(0)); 392 __ pushq(i.InputImmediate(0));
393 break; 393 break;
394 case kX64Movl: {
395 RegisterOrOperand input = i.InputRegisterOrOperand(0);
396 if (input.type == kRegister) {
397 __ movl(i.OutputRegister(), input.reg);
398 } else {
399 __ movl(i.OutputRegister(), input.operand);
400 }
401 break;
402 }
403 case kX64Movsxlq: {
404 RegisterOrOperand input = i.InputRegisterOrOperand(0);
405 if (input.type == kRegister) {
406 __ movsxlq(i.OutputRegister(), input.reg);
407 } else {
408 __ movsxlq(i.OutputRegister(), input.operand);
409 }
410 break;
411 }
412 case kX64CallCodeObject: { 394 case kX64CallCodeObject: {
413 if (HasImmediateInput(instr, 0)) { 395 if (HasImmediateInput(instr, 0)) {
414 Handle<Code> code = Handle<Code>::cast(i.InputHeapObject(0)); 396 Handle<Code> code = Handle<Code>::cast(i.InputHeapObject(0));
415 __ Call(code, RelocInfo::CODE_TARGET); 397 __ Call(code, RelocInfo::CODE_TARGET);
416 } else { 398 } else {
417 Register reg = i.InputRegister(0); 399 Register reg = i.InputRegister(0);
418 int entry = Code::kHeaderSize - kHeapObjectTag; 400 int entry = Code::kHeaderSize - kHeapObjectTag;
419 __ Call(Operand(reg, entry)); 401 __ Call(Operand(reg, entry));
420 } 402 }
421 403
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 __ cvtlsi2sd(i.OutputDoubleRegister(), input.operand); 507 __ cvtlsi2sd(i.OutputDoubleRegister(), input.operand);
526 } 508 }
527 break; 509 break;
528 } 510 }
529 case kSSEUint32ToFloat64: { 511 case kSSEUint32ToFloat64: {
530 // TODO(turbofan): X64 SSE cvtqsi2sd should support operands. 512 // TODO(turbofan): X64 SSE cvtqsi2sd should support operands.
531 __ cvtqsi2sd(i.OutputDoubleRegister(), i.InputRegister(0)); 513 __ cvtqsi2sd(i.OutputDoubleRegister(), i.InputRegister(0));
532 break; 514 break;
533 } 515 }
534 516
535 case kSSELoad: 517 case kX64Movsd:
536 __ movsd(i.OutputDoubleRegister(), i.MemoryOperand()); 518 if (instr->HasOutput()) {
519 __ movsd(i.OutputDoubleRegister(), i.MemoryOperand());
520 } else {
521 int index = 0;
522 Operand operand = i.MemoryOperand(&index);
523 __ movsd(operand, i.InputDoubleRegister(index));
524 }
537 break; 525 break;
538 case kSSEStore: { 526 case kX64Movsxbl:
527 __ movsxbl(i.OutputRegister(), i.MemoryOperand());
528 break;
529 case kX64Movzxbl:
530 __ movzxbl(i.OutputRegister(), i.MemoryOperand());
531 break;
532 case kX64Movb: {
539 int index = 0; 533 int index = 0;
540 Operand operand = i.MemoryOperand(&index); 534 Operand operand = i.MemoryOperand(&index);
541 __ movsd(operand, i.InputDoubleRegister(index)); 535 if (HasImmediateInput(instr, index)) {
536 __ movb(operand, Immediate(i.InputInt8(index)));
537 } else {
538 __ movb(operand, i.InputRegister(index));
539 }
542 break; 540 break;
543 } 541 }
544 case kX64LoadWord8: 542 case kX64Movsxwl:
545 __ movzxbl(i.OutputRegister(), i.MemoryOperand()); 543 __ movsxwl(i.OutputRegister(), i.MemoryOperand());
546 break; 544 break;
547 case kX64StoreWord8: { 545 case kX64Movzxwl:
546 __ movzxwl(i.OutputRegister(), i.MemoryOperand());
547 break;
548 case kX64Movw: {
548 int index = 0; 549 int index = 0;
549 Operand operand = i.MemoryOperand(&index); 550 Operand operand = i.MemoryOperand(&index);
550 __ movb(operand, i.InputRegister(index)); 551 if (HasImmediateInput(instr, index)) {
552 __ movw(operand, Immediate(i.InputInt16(index)));
553 } else {
554 __ movw(operand, i.InputRegister(index));
555 }
551 break; 556 break;
552 } 557 }
553 case kX64StoreWord8I: { 558 case kX64Movl:
554 int index = 0; 559 if (instr->HasOutput()) {
555 Operand operand = i.MemoryOperand(&index); 560 if (instr->addressing_mode() == kMode_None) {
556 __ movb(operand, Immediate(i.InputInt8(index))); 561 RegisterOrOperand input = i.InputRegisterOrOperand(0);
562 if (input.type == kRegister) {
563 __ movl(i.OutputRegister(), input.reg);
564 } else {
565 __ movl(i.OutputRegister(), input.operand);
566 }
567 } else {
568 __ movl(i.OutputRegister(), i.MemoryOperand());
569 }
570 } else {
571 int index = 0;
572 Operand operand = i.MemoryOperand(&index);
573 if (HasImmediateInput(instr, index)) {
574 __ movl(operand, i.InputImmediate(index));
575 } else {
576 __ movl(operand, i.InputRegister(index));
577 }
578 }
579 break;
580 case kX64Movsxlq: {
581 RegisterOrOperand input = i.InputRegisterOrOperand(0);
582 if (input.type == kRegister) {
583 __ movsxlq(i.OutputRegister(), input.reg);
584 } else {
585 __ movsxlq(i.OutputRegister(), input.operand);
586 }
557 break; 587 break;
558 } 588 }
559 case kX64LoadWord16: 589 case kX64Movq:
560 __ movzxwl(i.OutputRegister(), i.MemoryOperand()); 590 if (instr->HasOutput()) {
591 __ movq(i.OutputRegister(), i.MemoryOperand());
592 } else {
593 int index = 0;
594 Operand operand = i.MemoryOperand(&index);
595 if (HasImmediateInput(instr, index)) {
596 __ movq(operand, i.InputImmediate(index));
597 } else {
598 __ movq(operand, i.InputRegister(index));
599 }
600 }
561 break; 601 break;
562 case kX64StoreWord16: {
563 int index = 0;
564 Operand operand = i.MemoryOperand(&index);
565 __ movw(operand, i.InputRegister(index));
566 break;
567 }
568 case kX64StoreWord16I: {
569 int index = 0;
570 Operand operand = i.MemoryOperand(&index);
571 __ movw(operand, Immediate(i.InputInt16(index)));
572 break;
573 }
574 case kX64LoadWord32:
575 __ movl(i.OutputRegister(), i.MemoryOperand());
576 break;
577 case kX64StoreWord32: {
578 int index = 0;
579 Operand operand = i.MemoryOperand(&index);
580 __ movl(operand, i.InputRegister(index));
581 break;
582 }
583 case kX64StoreWord32I: {
584 int index = 0;
585 Operand operand = i.MemoryOperand(&index);
586 __ movl(operand, i.InputImmediate(index));
587 break;
588 }
589 case kX64LoadWord64:
590 __ movq(i.OutputRegister(), i.MemoryOperand());
591 break;
592 case kX64StoreWord64: {
593 int index = 0;
594 Operand operand = i.MemoryOperand(&index);
595 __ movq(operand, i.InputRegister(index));
596 break;
597 }
598 case kX64StoreWord64I: {
599 int index = 0;
600 Operand operand = i.MemoryOperand(&index);
601 __ movq(operand, i.InputImmediate(index));
602 break;
603 }
604 case kX64StoreWriteBarrier: { 602 case kX64StoreWriteBarrier: {
605 Register object = i.InputRegister(0); 603 Register object = i.InputRegister(0);
606 Register index = i.InputRegister(1); 604 Register index = i.InputRegister(1);
607 Register value = i.InputRegister(2); 605 Register value = i.InputRegister(2);
608 __ movsxlq(index, index); 606 __ movsxlq(index, index);
609 __ movq(Operand(object, index, times_1, 0), value); 607 __ movq(Operand(object, index, times_1, 0), value);
610 __ leaq(index, Operand(object, index, times_1, 0)); 608 __ leaq(index, Operand(object, index, times_1, 0));
611 SaveFPRegsMode mode = code_->frame()->DidAllocateDoubleRegisters() 609 SaveFPRegsMode mode = code_->frame()->DidAllocateDoubleRegisters()
612 ? kSaveFPRegs 610 ? kSaveFPRegs
613 : kDontSaveFPRegs; 611 : kDontSaveFPRegs;
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 } 992 }
995 993
996 994
997 void CodeGenerator::AddNopForSmiCodeInlining() { __ nop(); } 995 void CodeGenerator::AddNopForSmiCodeInlining() { __ nop(); }
998 996
999 #undef __ 997 #undef __
1000 998
1001 } // namespace internal 999 } // namespace internal
1002 } // namespace compiler 1000 } // namespace compiler
1003 } // namespace v8 1001 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/machine-type.cc ('k') | src/compiler/x64/instruction-codes-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698