blob: f19c32805342ec9a33f14c8c3b336a63b15be520 [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 kIA32Add:
18 case kIA32And:
19 case kIA32Cmp:
Ben Murdochda12d292016-06-02 14:46:10 +010020 case kIA32Cmp16:
21 case kIA32Cmp8:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022 case kIA32Test:
Ben Murdochda12d292016-06-02 14:46:10 +010023 case kIA32Test16:
24 case kIA32Test8:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025 case kIA32Or:
26 case kIA32Xor:
27 case kIA32Sub:
28 case kIA32Imul:
29 case kIA32ImulHigh:
30 case kIA32UmulHigh:
31 case kIA32Idiv:
32 case kIA32Udiv:
33 case kIA32Not:
34 case kIA32Neg:
35 case kIA32Shl:
36 case kIA32Shr:
37 case kIA32Sar:
Ben Murdochda12d292016-06-02 14:46:10 +010038 case kIA32AddPair:
39 case kIA32SubPair:
40 case kIA32MulPair:
41 case kIA32ShlPair:
42 case kIA32ShrPair:
43 case kIA32SarPair:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044 case kIA32Ror:
45 case kIA32Lzcnt:
46 case kIA32Tzcnt:
47 case kIA32Popcnt:
48 case kIA32Lea:
49 case kSSEFloat32Cmp:
50 case kSSEFloat32Add:
51 case kSSEFloat32Sub:
52 case kSSEFloat32Mul:
53 case kSSEFloat32Div:
54 case kSSEFloat32Max:
55 case kSSEFloat32Min:
56 case kSSEFloat32Abs:
57 case kSSEFloat32Neg:
58 case kSSEFloat32Sqrt:
59 case kSSEFloat32Round:
60 case kSSEFloat64Cmp:
61 case kSSEFloat64Add:
62 case kSSEFloat64Sub:
63 case kSSEFloat64Mul:
64 case kSSEFloat64Div:
65 case kSSEFloat64Mod:
66 case kSSEFloat64Max:
67 case kSSEFloat64Min:
68 case kSSEFloat64Abs:
69 case kSSEFloat64Neg:
70 case kSSEFloat64Sqrt:
71 case kSSEFloat64Round:
72 case kSSEFloat32ToFloat64:
73 case kSSEFloat64ToFloat32:
Ben Murdoch097c5b22016-05-18 11:27:45 +010074 case kSSEFloat32ToInt32:
75 case kSSEFloat32ToUint32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000076 case kSSEFloat64ToInt32:
77 case kSSEFloat64ToUint32:
Ben Murdoch097c5b22016-05-18 11:27:45 +010078 case kSSEInt32ToFloat32:
79 case kSSEUint32ToFloat32:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 case kSSEInt32ToFloat64:
81 case kSSEUint32ToFloat64:
82 case kSSEFloat64ExtractLowWord32:
83 case kSSEFloat64ExtractHighWord32:
84 case kSSEFloat64InsertLowWord32:
85 case kSSEFloat64InsertHighWord32:
86 case kSSEFloat64LoadLowWord32:
Ben Murdoch61f157c2016-09-16 13:49:30 +010087 case kSSEFloat64SilenceNaN:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088 case kAVXFloat32Add:
89 case kAVXFloat32Sub:
90 case kAVXFloat32Mul:
91 case kAVXFloat32Div:
92 case kAVXFloat32Max:
93 case kAVXFloat32Min:
94 case kAVXFloat64Add:
95 case kAVXFloat64Sub:
96 case kAVXFloat64Mul:
97 case kAVXFloat64Div:
98 case kAVXFloat64Max:
99 case kAVXFloat64Min:
100 case kAVXFloat64Abs:
101 case kAVXFloat64Neg:
102 case kAVXFloat32Abs:
103 case kAVXFloat32Neg:
104 case kIA32BitcastFI:
105 case kIA32BitcastIF:
106 return (instr->addressing_mode() == kMode_None)
107 ? kNoOpcodeFlags
108 : kIsLoadOperation | kHasSideEffect;
109
110 case kIA32Movsxbl:
111 case kIA32Movzxbl:
112 case kIA32Movb:
113 case kIA32Movsxwl:
114 case kIA32Movzxwl:
115 case kIA32Movw:
116 case kIA32Movl:
117 case kIA32Movss:
118 case kIA32Movsd:
119 // Moves are used for memory load/store operations.
120 return instr->HasOutput() ? kIsLoadOperation : kHasSideEffect;
121
122 case kIA32StackCheck:
123 return kIsLoadOperation;
124
125 case kIA32Push:
126 case kIA32PushFloat32:
127 case kIA32PushFloat64:
128 case kIA32Poke:
129 return kHasSideEffect;
130
Ben Murdochc5610432016-08-08 18:44:38 +0100131 case kIA32Xchgb:
132 case kIA32Xchgw:
133 case kIA32Xchgl:
134 return kIsLoadOperation | kHasSideEffect;
135
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136#define CASE(Name) case k##Name:
137 COMMON_ARCH_OPCODE_LIST(CASE)
138#undef CASE
139 // Already covered in architecture independent code.
140 UNREACHABLE();
141 }
142
143 UNREACHABLE();
144 return kNoOpcodeFlags;
145}
146
147
148int InstructionScheduler::GetInstructionLatency(const Instruction* instr) {
149 // TODO(all): Add instruction cost modeling.
150 return 1;
151}
152
153} // namespace compiler
154} // namespace internal
155} // namespace v8