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

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

Issue 974313002: [turbofan] Support for %_DoubleHi, %_DoubleLo and %_ConstructDouble. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed Svens comment. Created 5 years, 9 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/verifier.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/scopes.h" 10 #include "src/scopes.h"
11 #include "src/x64/assembler-x64.h" 11 #include "src/x64/assembler-x64.h"
12 #include "src/x64/macro-assembler-x64.h" 12 #include "src/x64/macro-assembler-x64.h"
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 namespace compiler { 16 namespace compiler {
17 17
18 #define __ masm()-> 18 #define __ masm()->
19 19
20 20
21 #define kScratchDoubleReg xmm0
22
23
21 // Adds X64 specific methods for decoding operands. 24 // Adds X64 specific methods for decoding operands.
22 class X64OperandConverter : public InstructionOperandConverter { 25 class X64OperandConverter : public InstructionOperandConverter {
23 public: 26 public:
24 X64OperandConverter(CodeGenerator* gen, Instruction* instr) 27 X64OperandConverter(CodeGenerator* gen, Instruction* instr)
25 : InstructionOperandConverter(gen, instr) {} 28 : InstructionOperandConverter(gen, instr) {}
26 29
27 Immediate InputImmediate(size_t index) { 30 Immediate InputImmediate(size_t index) {
28 return ToImmediate(instr_->InputAt(index)); 31 return ToImmediate(instr_->InputAt(index));
29 } 32 }
30 33
31 Operand InputOperand(size_t index) { 34 Operand InputOperand(size_t index, int extra = 0) {
32 return ToOperand(instr_->InputAt(index)); 35 return ToOperand(instr_->InputAt(index), extra);
33 } 36 }
34 37
35 Operand OutputOperand() { return ToOperand(instr_->Output()); } 38 Operand OutputOperand() { return ToOperand(instr_->Output()); }
36 39
37 Immediate ToImmediate(InstructionOperand* operand) { 40 Immediate ToImmediate(InstructionOperand* operand) {
38 return Immediate(ToConstant(operand).ToInt32()); 41 return Immediate(ToConstant(operand).ToInt32());
39 } 42 }
40 43
41 Operand ToOperand(InstructionOperand* op, int extra = 0) { 44 Operand ToOperand(InstructionOperand* op, int extra = 0) {
42 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); 45 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 } 804 }
802 break; 805 break;
803 case kSSEUint32ToFloat64: 806 case kSSEUint32ToFloat64:
804 if (instr->InputAt(0)->IsRegister()) { 807 if (instr->InputAt(0)->IsRegister()) {
805 __ movl(kScratchRegister, i.InputRegister(0)); 808 __ movl(kScratchRegister, i.InputRegister(0));
806 } else { 809 } else {
807 __ movl(kScratchRegister, i.InputOperand(0)); 810 __ movl(kScratchRegister, i.InputOperand(0));
808 } 811 }
809 __ cvtqsi2sd(i.OutputDoubleRegister(), kScratchRegister); 812 __ cvtqsi2sd(i.OutputDoubleRegister(), kScratchRegister);
810 break; 813 break;
814 case kSSEFloat64ExtractLowWord32:
815 if (instr->InputAt(0)->IsDoubleStackSlot()) {
816 __ movl(i.OutputRegister(), i.InputOperand(0));
817 } else {
818 __ movd(i.OutputRegister(), i.InputDoubleRegister(0));
819 }
820 break;
821 case kSSEFloat64ExtractHighWord32:
822 if (instr->InputAt(0)->IsDoubleStackSlot()) {
823 __ movl(i.OutputRegister(), i.InputOperand(0, kDoubleSize / 2));
824 } else {
825 __ Pextrd(i.OutputRegister(), i.InputDoubleRegister(0), 1);
826 }
827 break;
828 case kSSEFloat64InsertLowWord32:
829 if (instr->InputAt(1)->IsRegister()) {
830 __ Pinsrd(i.OutputDoubleRegister(), i.InputRegister(1), 0);
831 } else {
832 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 0);
833 }
834 break;
835 case kSSEFloat64InsertHighWord32:
836 if (instr->InputAt(1)->IsRegister()) {
837 __ Pinsrd(i.OutputDoubleRegister(), i.InputRegister(1), 1);
838 } else {
839 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 1);
840 }
841 break;
842 case kSSEFloat64LoadLowWord32:
843 if (instr->InputAt(0)->IsRegister()) {
844 __ movd(i.OutputDoubleRegister(), i.InputRegister(0));
845 } else {
846 __ movd(i.OutputDoubleRegister(), i.InputOperand(0));
847 }
848 break;
811 case kAVXFloat64Add: 849 case kAVXFloat64Add:
812 ASSEMBLE_AVX_DOUBLE_BINOP(vaddsd); 850 ASSEMBLE_AVX_DOUBLE_BINOP(vaddsd);
813 break; 851 break;
814 case kAVXFloat64Sub: 852 case kAVXFloat64Sub:
815 ASSEMBLE_AVX_DOUBLE_BINOP(vsubsd); 853 ASSEMBLE_AVX_DOUBLE_BINOP(vsubsd);
816 break; 854 break;
817 case kAVXFloat64Mul: 855 case kAVXFloat64Mul:
818 ASSEMBLE_AVX_DOUBLE_BINOP(vmulsd); 856 ASSEMBLE_AVX_DOUBLE_BINOP(vmulsd);
819 break; 857 break;
820 case kAVXFloat64Div: 858 case kAVXFloat64Div:
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 case kCheckedStoreWord32: 1045 case kCheckedStoreWord32:
1008 ASSEMBLE_CHECKED_STORE_INTEGER(movl); 1046 ASSEMBLE_CHECKED_STORE_INTEGER(movl);
1009 break; 1047 break;
1010 case kCheckedStoreFloat32: 1048 case kCheckedStoreFloat32:
1011 ASSEMBLE_CHECKED_STORE_FLOAT(movss); 1049 ASSEMBLE_CHECKED_STORE_FLOAT(movss);
1012 break; 1050 break;
1013 case kCheckedStoreFloat64: 1051 case kCheckedStoreFloat64:
1014 ASSEMBLE_CHECKED_STORE_FLOAT(movsd); 1052 ASSEMBLE_CHECKED_STORE_FLOAT(movsd);
1015 break; 1053 break;
1016 } 1054 }
1017 } 1055 } // NOLINT(readability/fn_size)
1018 1056
1019 1057
1020 // Assembles branches after this instruction. 1058 // Assembles branches after this instruction.
1021 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { 1059 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
1022 X64OperandConverter i(this, instr); 1060 X64OperandConverter i(this, instr);
1023 Label::Distance flabel_distance = 1061 Label::Distance flabel_distance =
1024 branch->fallthru ? Label::kNear : Label::kFar; 1062 branch->fallthru ? Label::kNear : Label::kFar;
1025 Label* tlabel = branch->true_label; 1063 Label* tlabel = branch->true_label;
1026 Label* flabel = branch->false_label; 1064 Label* flabel = branch->false_label;
1027 switch (branch->condition) { 1065 switch (branch->condition) {
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 } 1489 }
1452 } 1490 }
1453 MarkLazyDeoptSite(); 1491 MarkLazyDeoptSite();
1454 } 1492 }
1455 1493
1456 #undef __ 1494 #undef __
1457 1495
1458 } // namespace internal 1496 } // namespace internal
1459 } // namespace compiler 1497 } // namespace compiler
1460 } // namespace v8 1498 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/verifier.cc ('k') | src/compiler/x64/instruction-codes-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698