Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "src/compiler/instruction-scheduler.h" |
| 6 | |
| 7 | namespace v8 { |
| 8 | namespace internal { |
| 9 | namespace compiler { |
| 10 | |
| 11 | bool InstructionScheduler::SchedulerSupported() { return true; } |
| 12 | |
| 13 | |
| 14 | int 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 Murdoch | da12d29 | 2016-06-02 14:46:10 +0100 | [diff] [blame] | 23 | case kX64Cmp16: |
| 24 | case kX64Cmp8: |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 25 | case kX64Test: |
| 26 | case kX64Test32: |
Ben Murdoch | da12d29 | 2016-06-02 14:46:10 +0100 | [diff] [blame] | 27 | case kX64Test16: |
| 28 | case kX64Test8: |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 29 | 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 Murdoch | 097c5b2 | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 86 | case kSSEFloat32ToInt32: |
| 87 | case kSSEFloat32ToUint32: |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 88 | case kSSEFloat64ToInt32: |
| 89 | case kSSEFloat64ToUint32: |
| 90 | case kSSEFloat64ToInt64: |
| 91 | case kSSEFloat32ToInt64: |
| 92 | case kSSEFloat64ToUint64: |
| 93 | case kSSEFloat32ToUint64: |
| 94 | case kSSEInt32ToFloat64: |
Ben Murdoch | 097c5b2 | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 95 | case kSSEInt32ToFloat32: |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 96 | case kSSEInt64ToFloat32: |
| 97 | case kSSEInt64ToFloat64: |
| 98 | case kSSEUint64ToFloat32: |
| 99 | case kSSEUint64ToFloat64: |
| 100 | case kSSEUint32ToFloat64: |
Ben Murdoch | 097c5b2 | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 101 | case kSSEUint32ToFloat32: |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 102 | case kSSEFloat64ExtractLowWord32: |
| 103 | case kSSEFloat64ExtractHighWord32: |
| 104 | case kSSEFloat64InsertLowWord32: |
| 105 | case kSSEFloat64InsertHighWord32: |
| 106 | case kSSEFloat64LoadLowWord32: |
Ben Murdoch | 61f157c | 2016-09-16 13:49:30 +0100 | [diff] [blame] | 107 | case kSSEFloat64SilenceNaN: |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 108 | 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 Murdoch | c561043 | 2016-08-08 18:44:38 +0100 | [diff] [blame] | 172 | case kX64Xchgb: |
| 173 | case kX64Xchgw: |
| 174 | case kX64Xchgl: |
| 175 | return kIsLoadOperation | kHasSideEffect; |
| 176 | |
Ben Murdoch | 4a90d5f | 2016-03-22 12:00:34 +0000 | [diff] [blame] | 177 | #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 | |
| 189 | int 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 |