blob: eecefdbcc1423211f76ca5a5003abea5e0a015bd [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
3// found in the LICENSE file.
4
5#include "src/compiler/instruction-scheduler.h"
6
7namespace v8 {
8namespace internal {
9namespace compiler {
10
11bool InstructionScheduler::SchedulerSupported() { return true; }
12
13
14int InstructionScheduler::GetTargetInstructionFlags(
15 const Instruction* instr) const {
16 switch (instr->arch_opcode()) {
17 case kX64Add:
18 case kX64Add32:
19 case kX64And:
20 case kX64And32:
21 case kX64Cmp:
22 case kX64Cmp32:
Ben Murdochda12d292016-06-02 14:46:10 +010023 case kX64Cmp16:
24 case kX64Cmp8:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025 case kX64Test:
26 case kX64Test32:
Ben Murdochda12d292016-06-02 14:46:10 +010027 case kX64Test16:
28 case kX64Test8:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000029 case kX64Or:
30 case kX64Or32:
31 case kX64Xor:
32 case kX64Xor32:
33 case kX64Sub:
34 case kX64Sub32:
35 case kX64Imul:
36 case kX64Imul32:
37 case kX64ImulHigh32:
38 case kX64UmulHigh32:
39 case kX64Idiv:
40 case kX64Idiv32:
41 case kX64Udiv:
42 case kX64Udiv32:
43 case kX64Not:
44 case kX64Not32:
45 case kX64Neg:
46 case kX64Neg32:
47 case kX64Shl:
48 case kX64Shl32:
49 case kX64Shr:
50 case kX64Shr32:
51 case kX64Sar:
52 case kX64Sar32:
53 case kX64Ror:
54 case kX64Ror32:
55 case kX64Lzcnt:
56 case kX64Lzcnt32:
57 case kX64Tzcnt:
58 case kX64Tzcnt32:
59 case kX64Popcnt:
60 case kX64Popcnt32:
61 case kSSEFloat32Cmp:
62 case kSSEFloat32Add:
63 case kSSEFloat32Sub:
64 case kSSEFloat32Mul:
65 case kSSEFloat32Div:
66 case kSSEFloat32Abs:
67 case kSSEFloat32Neg:
68 case kSSEFloat32Sqrt:
69 case kSSEFloat32Round:
70 case kSSEFloat32Max:
71 case kSSEFloat32Min:
72 case kSSEFloat32ToFloat64:
73 case kSSEFloat64Cmp:
74 case kSSEFloat64Add:
75 case kSSEFloat64Sub:
76 case kSSEFloat64Mul:
77 case kSSEFloat64Div:
78 case kSSEFloat64Mod:
79 case kSSEFloat64Abs:
80 case kSSEFloat64Neg:
81 case kSSEFloat64Sqrt:
82 case kSSEFloat64Round:
83 case kSSEFloat64Max:
84 case kSSEFloat64Min:
85 case kSSEFloat64ToFloat32:
Ben Murdoch097c5b22016-05-18 11:27:45 +010086 case kSSEFloat32ToInt32:
87 case kSSEFloat32ToUint32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088 case kSSEFloat64ToInt32:
89 case kSSEFloat64ToUint32:
90 case kSSEFloat64ToInt64:
91 case kSSEFloat32ToInt64:
92 case kSSEFloat64ToUint64:
93 case kSSEFloat32ToUint64:
94 case kSSEInt32ToFloat64:
Ben Murdoch097c5b22016-05-18 11:27:45 +010095 case kSSEInt32ToFloat32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000096 case kSSEInt64ToFloat32:
97 case kSSEInt64ToFloat64:
98 case kSSEUint64ToFloat32:
99 case kSSEUint64ToFloat64:
100 case kSSEUint32ToFloat64:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100101 case kSSEUint32ToFloat32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000102 case kSSEFloat64ExtractLowWord32:
103 case kSSEFloat64ExtractHighWord32:
104 case kSSEFloat64InsertLowWord32:
105 case kSSEFloat64InsertHighWord32:
106 case kSSEFloat64LoadLowWord32:
Ben Murdoch61f157c2016-09-16 13:49:30 +0100107 case kSSEFloat64SilenceNaN:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108 case kAVXFloat32Cmp:
109 case kAVXFloat32Add:
110 case kAVXFloat32Sub:
111 case kAVXFloat32Mul:
112 case kAVXFloat32Div:
113 case kAVXFloat32Max:
114 case kAVXFloat32Min:
115 case kAVXFloat64Cmp:
116 case kAVXFloat64Add:
117 case kAVXFloat64Sub:
118 case kAVXFloat64Mul:
119 case kAVXFloat64Div:
120 case kAVXFloat64Max:
121 case kAVXFloat64Min:
122 case kAVXFloat64Abs:
123 case kAVXFloat64Neg:
124 case kAVXFloat32Abs:
125 case kAVXFloat32Neg:
126 case kX64BitcastFI:
127 case kX64BitcastDL:
128 case kX64BitcastIF:
129 case kX64BitcastLD:
130 case kX64Lea32:
131 case kX64Lea:
132 case kX64Dec32:
133 case kX64Inc32:
134 return (instr->addressing_mode() == kMode_None)
135 ? kNoOpcodeFlags
136 : kIsLoadOperation | kHasSideEffect;
137
138 case kX64Movsxbl:
139 case kX64Movzxbl:
140 case kX64Movsxwl:
141 case kX64Movzxwl:
142 case kX64Movsxlq:
143 DCHECK(instr->InputCount() >= 1);
144 return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
145 : kIsLoadOperation;
146
147 case kX64Movb:
148 case kX64Movw:
149 return kHasSideEffect;
150
151 case kX64Movl:
152 if (instr->HasOutput()) {
153 DCHECK(instr->InputCount() >= 1);
154 return instr->InputAt(0)->IsRegister() ? kNoOpcodeFlags
155 : kIsLoadOperation;
156 } else {
157 return kHasSideEffect;
158 }
159
160 case kX64Movq:
161 case kX64Movsd:
162 case kX64Movss:
163 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
164
165 case kX64StackCheck:
166 return kIsLoadOperation;
167
168 case kX64Push:
169 case kX64Poke:
170 return kHasSideEffect;
171
Ben Murdochc5610432016-08-08 18:44:38 +0100172 case kX64Xchgb:
173 case kX64Xchgw:
174 case kX64Xchgl:
175 return kIsLoadOperation | kHasSideEffect;
176
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000177#define CASE(Name) case k##Name:
178 COMMON_ARCH_OPCODE_LIST(CASE)
179#undef CASE
180 // Already covered in architecture independent code.
181 UNREACHABLE();
182 }
183
184 UNREACHABLE();
185 return kNoOpcodeFlags;
186}
187
188
189int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
190 // TODO(all): Add instruction cost modeling.
191 return 1;
192}
193
194} // namespace compiler
195} // namespace internal
196} // namespace v8