| OLD | NEW |
| 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 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_ | 5 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_ |
| 6 #define V8_COMPILER_MACHINE_OPERATOR_H_ | 6 #define V8_COMPILER_MACHINE_OPERATOR_H_ |
| 7 | 7 |
| 8 #include "src/compiler/machine-type.h" | 8 #include "src/compiler/machine-type.h" |
| 9 #include "src/compiler/opcodes.h" | 9 #include "src/compiler/opcodes.h" |
| 10 #include "src/compiler/operator.h" | 10 #include "src/compiler/operator.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 1) | 66 1) |
| 67 #define BINOP_ACO(name) \ | 67 #define BINOP_ACO(name) \ |
| 68 SIMPLE(name, \ | 68 SIMPLE(name, \ |
| 69 Operator::kAssociative | Operator::kCommutative | Operator::kPure, 2, \ | 69 Operator::kAssociative | Operator::kCommutative | Operator::kPure, 2, \ |
| 70 2) | 70 2) |
| 71 #define UNOP(name) SIMPLE(name, Operator::kPure, 1, 1) | 71 #define UNOP(name) SIMPLE(name, Operator::kPure, 1, 1) |
| 72 | 72 |
| 73 #define WORD_SIZE(x) return is64() ? Word64##x() : Word32##x() | 73 #define WORD_SIZE(x) return is64() ? Word64##x() : Word32##x() |
| 74 #define INT_SIZE(x) return is64() ? Int64##x() : Int32##x() | 74 #define INT_SIZE(x) return is64() ? Int64##x() : Int32##x() |
| 75 | 75 |
| 76 Operator* Load(MachineType rep) { // load [base + index] | 76 const Operator* Load(MachineType rep) { // load [base + index] |
| 77 OP1(Load, MachineType, rep, Operator::kNoWrite, 2, 1); | 77 OP1(Load, MachineType, rep, Operator::kNoWrite, 2, 1); |
| 78 } | 78 } |
| 79 // store [base + index], value | 79 // store [base + index], value |
| 80 Operator* Store(MachineType rep, WriteBarrierKind kind) { | 80 const Operator* Store(MachineType rep, WriteBarrierKind kind) { |
| 81 StoreRepresentation store_rep = {rep, kind}; | 81 StoreRepresentation store_rep = {rep, kind}; |
| 82 OP1(Store, StoreRepresentation, store_rep, Operator::kNoRead, 3, 0); | 82 OP1(Store, StoreRepresentation, store_rep, Operator::kNoRead, 3, 0); |
| 83 } | 83 } |
| 84 | 84 |
| 85 Operator* WordAnd() { WORD_SIZE(And); } | 85 const Operator* WordAnd() { WORD_SIZE(And); } |
| 86 Operator* WordOr() { WORD_SIZE(Or); } | 86 const Operator* WordOr() { WORD_SIZE(Or); } |
| 87 Operator* WordXor() { WORD_SIZE(Xor); } | 87 const Operator* WordXor() { WORD_SIZE(Xor); } |
| 88 Operator* WordShl() { WORD_SIZE(Shl); } | 88 const Operator* WordShl() { WORD_SIZE(Shl); } |
| 89 Operator* WordShr() { WORD_SIZE(Shr); } | 89 const Operator* WordShr() { WORD_SIZE(Shr); } |
| 90 Operator* WordSar() { WORD_SIZE(Sar); } | 90 const Operator* WordSar() { WORD_SIZE(Sar); } |
| 91 Operator* WordRor() { WORD_SIZE(Ror); } | 91 const Operator* WordRor() { WORD_SIZE(Ror); } |
| 92 Operator* WordEqual() { WORD_SIZE(Equal); } | 92 const Operator* WordEqual() { WORD_SIZE(Equal); } |
| 93 | 93 |
| 94 Operator* Word32And() { BINOP_AC(Word32And); } | 94 const Operator* Word32And() { BINOP_AC(Word32And); } |
| 95 Operator* Word32Or() { BINOP_AC(Word32Or); } | 95 const Operator* Word32Or() { BINOP_AC(Word32Or); } |
| 96 Operator* Word32Xor() { BINOP_AC(Word32Xor); } | 96 const Operator* Word32Xor() { BINOP_AC(Word32Xor); } |
| 97 Operator* Word32Shl() { BINOP(Word32Shl); } | 97 const Operator* Word32Shl() { BINOP(Word32Shl); } |
| 98 Operator* Word32Shr() { BINOP(Word32Shr); } | 98 const Operator* Word32Shr() { BINOP(Word32Shr); } |
| 99 Operator* Word32Sar() { BINOP(Word32Sar); } | 99 const Operator* Word32Sar() { BINOP(Word32Sar); } |
| 100 Operator* Word32Ror() { BINOP(Word32Ror); } | 100 const Operator* Word32Ror() { BINOP(Word32Ror); } |
| 101 Operator* Word32Equal() { BINOP_C(Word32Equal); } | 101 const Operator* Word32Equal() { BINOP_C(Word32Equal); } |
| 102 | 102 |
| 103 Operator* Word64And() { BINOP_AC(Word64And); } | 103 const Operator* Word64And() { BINOP_AC(Word64And); } |
| 104 Operator* Word64Or() { BINOP_AC(Word64Or); } | 104 const Operator* Word64Or() { BINOP_AC(Word64Or); } |
| 105 Operator* Word64Xor() { BINOP_AC(Word64Xor); } | 105 const Operator* Word64Xor() { BINOP_AC(Word64Xor); } |
| 106 Operator* Word64Shl() { BINOP(Word64Shl); } | 106 const Operator* Word64Shl() { BINOP(Word64Shl); } |
| 107 Operator* Word64Shr() { BINOP(Word64Shr); } | 107 const Operator* Word64Shr() { BINOP(Word64Shr); } |
| 108 Operator* Word64Sar() { BINOP(Word64Sar); } | 108 const Operator* Word64Sar() { BINOP(Word64Sar); } |
| 109 Operator* Word64Ror() { BINOP(Word64Ror); } | 109 const Operator* Word64Ror() { BINOP(Word64Ror); } |
| 110 Operator* Word64Equal() { BINOP_C(Word64Equal); } | 110 const Operator* Word64Equal() { BINOP_C(Word64Equal); } |
| 111 | 111 |
| 112 Operator* Int32Add() { BINOP_AC(Int32Add); } | 112 const Operator* Int32Add() { BINOP_AC(Int32Add); } |
| 113 Operator* Int32AddWithOverflow() { BINOP_ACO(Int32AddWithOverflow); } | 113 const Operator* Int32AddWithOverflow() { BINOP_ACO(Int32AddWithOverflow); } |
| 114 Operator* Int32Sub() { BINOP(Int32Sub); } | 114 const Operator* Int32Sub() { BINOP(Int32Sub); } |
| 115 Operator* Int32SubWithOverflow() { BINOP_O(Int32SubWithOverflow); } | 115 const Operator* Int32SubWithOverflow() { BINOP_O(Int32SubWithOverflow); } |
| 116 Operator* Int32Mul() { BINOP_AC(Int32Mul); } | 116 const Operator* Int32Mul() { BINOP_AC(Int32Mul); } |
| 117 Operator* Int32Div() { BINOP(Int32Div); } | 117 const Operator* Int32Div() { BINOP(Int32Div); } |
| 118 Operator* Int32UDiv() { BINOP(Int32UDiv); } | 118 const Operator* Int32UDiv() { BINOP(Int32UDiv); } |
| 119 Operator* Int32Mod() { BINOP(Int32Mod); } | 119 const Operator* Int32Mod() { BINOP(Int32Mod); } |
| 120 Operator* Int32UMod() { BINOP(Int32UMod); } | 120 const Operator* Int32UMod() { BINOP(Int32UMod); } |
| 121 Operator* Int32LessThan() { BINOP(Int32LessThan); } | 121 const Operator* Int32LessThan() { BINOP(Int32LessThan); } |
| 122 Operator* Int32LessThanOrEqual() { BINOP(Int32LessThanOrEqual); } | 122 const Operator* Int32LessThanOrEqual() { BINOP(Int32LessThanOrEqual); } |
| 123 Operator* Uint32LessThan() { BINOP(Uint32LessThan); } | 123 const Operator* Uint32LessThan() { BINOP(Uint32LessThan); } |
| 124 Operator* Uint32LessThanOrEqual() { BINOP(Uint32LessThanOrEqual); } | 124 const Operator* Uint32LessThanOrEqual() { BINOP(Uint32LessThanOrEqual); } |
| 125 | 125 |
| 126 Operator* Int64Add() { BINOP_AC(Int64Add); } | 126 const Operator* Int64Add() { BINOP_AC(Int64Add); } |
| 127 Operator* Int64Sub() { BINOP(Int64Sub); } | 127 const Operator* Int64Sub() { BINOP(Int64Sub); } |
| 128 Operator* Int64Mul() { BINOP_AC(Int64Mul); } | 128 const Operator* Int64Mul() { BINOP_AC(Int64Mul); } |
| 129 Operator* Int64Div() { BINOP(Int64Div); } | 129 const Operator* Int64Div() { BINOP(Int64Div); } |
| 130 Operator* Int64UDiv() { BINOP(Int64UDiv); } | 130 const Operator* Int64UDiv() { BINOP(Int64UDiv); } |
| 131 Operator* Int64Mod() { BINOP(Int64Mod); } | 131 const Operator* Int64Mod() { BINOP(Int64Mod); } |
| 132 Operator* Int64UMod() { BINOP(Int64UMod); } | 132 const Operator* Int64UMod() { BINOP(Int64UMod); } |
| 133 Operator* Int64LessThan() { BINOP(Int64LessThan); } | 133 const Operator* Int64LessThan() { BINOP(Int64LessThan); } |
| 134 Operator* Int64LessThanOrEqual() { BINOP(Int64LessThanOrEqual); } | 134 const Operator* Int64LessThanOrEqual() { BINOP(Int64LessThanOrEqual); } |
| 135 | 135 |
| 136 // Signed comparison of word-sized integer values, translates to int32/int64 | 136 // Signed comparison of word-sized integer values, translates to int32/int64 |
| 137 // comparisons depending on the word-size of the machine. | 137 // comparisons depending on the word-size of the machine. |
| 138 Operator* IntLessThan() { INT_SIZE(LessThan); } | 138 const Operator* IntLessThan() { INT_SIZE(LessThan); } |
| 139 Operator* IntLessThanOrEqual() { INT_SIZE(LessThanOrEqual); } | 139 const Operator* IntLessThanOrEqual() { INT_SIZE(LessThanOrEqual); } |
| 140 | 140 |
| 141 // Convert representation of integers between float64 and int32/uint32. | 141 // Convert representation of integers between float64 and int32/uint32. |
| 142 // The precise rounding mode and handling of out of range inputs are *not* | 142 // The precise rounding mode and handling of out of range inputs are *not* |
| 143 // defined for these operators, since they are intended only for use with | 143 // defined for these operators, since they are intended only for use with |
| 144 // integers. | 144 // integers. |
| 145 Operator* ChangeInt32ToFloat64() { UNOP(ChangeInt32ToFloat64); } | 145 const Operator* ChangeInt32ToFloat64() { UNOP(ChangeInt32ToFloat64); } |
| 146 Operator* ChangeUint32ToFloat64() { UNOP(ChangeUint32ToFloat64); } | 146 const Operator* ChangeUint32ToFloat64() { UNOP(ChangeUint32ToFloat64); } |
| 147 Operator* ChangeFloat64ToInt32() { UNOP(ChangeFloat64ToInt32); } | 147 const Operator* ChangeFloat64ToInt32() { UNOP(ChangeFloat64ToInt32); } |
| 148 Operator* ChangeFloat64ToUint32() { UNOP(ChangeFloat64ToUint32); } | 148 const Operator* ChangeFloat64ToUint32() { UNOP(ChangeFloat64ToUint32); } |
| 149 | 149 |
| 150 // Sign/zero extend int32/uint32 to int64/uint64. | 150 // Sign/zero extend int32/uint32 to int64/uint64. |
| 151 Operator* ChangeInt32ToInt64() { UNOP(ChangeInt32ToInt64); } | 151 const Operator* ChangeInt32ToInt64() { UNOP(ChangeInt32ToInt64); } |
| 152 Operator* ChangeUint32ToUint64() { UNOP(ChangeUint32ToUint64); } | 152 const Operator* ChangeUint32ToUint64() { UNOP(ChangeUint32ToUint64); } |
| 153 | 153 |
| 154 // Truncate double to int32 using JavaScript semantics. | 154 // Truncate double to int32 using JavaScript semantics. |
| 155 Operator* TruncateFloat64ToInt32() { UNOP(TruncateFloat64ToInt32); } | 155 const Operator* TruncateFloat64ToInt32() { UNOP(TruncateFloat64ToInt32); } |
| 156 | 156 |
| 157 // Truncate the high order bits and convert the remaining bits to int32. | 157 // Truncate the high order bits and convert the remaining bits to int32. |
| 158 Operator* TruncateInt64ToInt32() { UNOP(TruncateInt64ToInt32); } | 158 const Operator* TruncateInt64ToInt32() { UNOP(TruncateInt64ToInt32); } |
| 159 | 159 |
| 160 // Floating point operators always operate with IEEE 754 round-to-nearest. | 160 // Floating point operators always operate with IEEE 754 round-to-nearest. |
| 161 Operator* Float64Add() { BINOP_C(Float64Add); } | 161 const Operator* Float64Add() { BINOP_C(Float64Add); } |
| 162 Operator* Float64Sub() { BINOP(Float64Sub); } | 162 const Operator* Float64Sub() { BINOP(Float64Sub); } |
| 163 Operator* Float64Mul() { BINOP_C(Float64Mul); } | 163 const Operator* Float64Mul() { BINOP_C(Float64Mul); } |
| 164 Operator* Float64Div() { BINOP(Float64Div); } | 164 const Operator* Float64Div() { BINOP(Float64Div); } |
| 165 Operator* Float64Mod() { BINOP(Float64Mod); } | 165 const Operator* Float64Mod() { BINOP(Float64Mod); } |
| 166 | 166 |
| 167 // Floating point comparisons complying to IEEE 754. | 167 // Floating point comparisons complying to IEEE 754. |
| 168 Operator* Float64Equal() { BINOP_C(Float64Equal); } | 168 const Operator* Float64Equal() { BINOP_C(Float64Equal); } |
| 169 Operator* Float64LessThan() { BINOP(Float64LessThan); } | 169 const Operator* Float64LessThan() { BINOP(Float64LessThan); } |
| 170 Operator* Float64LessThanOrEqual() { BINOP(Float64LessThanOrEqual); } | 170 const Operator* Float64LessThanOrEqual() { BINOP(Float64LessThanOrEqual); } |
| 171 | 171 |
| 172 inline bool is32() const { return word_ == kRepWord32; } | 172 inline bool is32() const { return word_ == kRepWord32; } |
| 173 inline bool is64() const { return word_ == kRepWord64; } | 173 inline bool is64() const { return word_ == kRepWord64; } |
| 174 inline MachineType word() const { return word_; } | 174 inline MachineType word() const { return word_; } |
| 175 | 175 |
| 176 #undef WORD_SIZE | 176 #undef WORD_SIZE |
| 177 #undef INT_SIZE | 177 #undef INT_SIZE |
| 178 #undef UNOP | 178 #undef UNOP |
| 179 #undef BINOP | 179 #undef BINOP |
| 180 #undef OP1 | 180 #undef OP1 |
| 181 #undef SIMPLE | 181 #undef SIMPLE |
| 182 | 182 |
| 183 private: | 183 private: |
| 184 Zone* zone_; | 184 Zone* zone_; |
| 185 MachineType word_; | 185 MachineType word_; |
| 186 }; | 186 }; |
| 187 } | 187 |
| 188 } | 188 } // namespace compiler |
| 189 } // namespace v8::internal::compiler | 189 } // namespace internal |
| 190 } // namespace v8 |
| 190 | 191 |
| 191 #endif // V8_COMPILER_MACHINE_OPERATOR_H_ | 192 #endif // V8_COMPILER_MACHINE_OPERATOR_H_ |
| OLD | NEW |