| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright 2014 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 #ifndef V8_COMPILER_MACHINE_NODE_FACTORY_H_ |  | 
| 6 #define V8_COMPILER_MACHINE_NODE_FACTORY_H_ |  | 
| 7 |  | 
| 8 #ifdef USE_SIMULATOR |  | 
| 9 #define MACHINE_ASSEMBLER_SUPPORTS_CALL_C 0 |  | 
| 10 #else |  | 
| 11 #define MACHINE_ASSEMBLER_SUPPORTS_CALL_C 1 |  | 
| 12 #endif |  | 
| 13 |  | 
| 14 #include "src/v8.h" |  | 
| 15 |  | 
| 16 #include "src/compiler/machine-operator.h" |  | 
| 17 #include "src/compiler/node.h" |  | 
| 18 |  | 
| 19 namespace v8 { |  | 
| 20 namespace internal { |  | 
| 21 namespace compiler { |  | 
| 22 |  | 
| 23 #define ZONE() static_cast<NodeFactory*>(this)->zone() |  | 
| 24 #define COMMON() static_cast<NodeFactory*>(this)->common() |  | 
| 25 #define MACHINE() static_cast<NodeFactory*>(this)->machine() |  | 
| 26 #define MACHINE_SIG() static_cast<NodeFactory*>(this)->machine_sig() |  | 
| 27 #define NEW_NODE_0(op) static_cast<NodeFactory*>(this)->NewNode(op) |  | 
| 28 #define NEW_NODE_1(op, a) static_cast<NodeFactory*>(this)->NewNode(op, a) |  | 
| 29 #define NEW_NODE_2(op, a, b) static_cast<NodeFactory*>(this)->NewNode(op, a, b) |  | 
| 30 #define NEW_NODE_3(op, a, b, c) \ |  | 
| 31   static_cast<NodeFactory*>(this)->NewNode(op, a, b, c) |  | 
| 32 |  | 
| 33 template <typename NodeFactory> |  | 
| 34 class MachineNodeFactory { |  | 
| 35  public: |  | 
| 36   // Constants. |  | 
| 37   Node* PointerConstant(void* value) { |  | 
| 38     return IntPtrConstant(reinterpret_cast<intptr_t>(value)); |  | 
| 39   } |  | 
| 40   Node* IntPtrConstant(intptr_t value) { |  | 
| 41     // TODO(dcarney): mark generated code as unserializable if value != 0. |  | 
| 42     return kPointerSize == 8 ? Int64Constant(value) |  | 
| 43                              : Int32Constant(static_cast<int>(value)); |  | 
| 44   } |  | 
| 45   Node* Int32Constant(int32_t value) { |  | 
| 46     return NEW_NODE_0(COMMON()->Int32Constant(value)); |  | 
| 47   } |  | 
| 48   Node* Int64Constant(int64_t value) { |  | 
| 49     return NEW_NODE_0(COMMON()->Int64Constant(value)); |  | 
| 50   } |  | 
| 51   Node* NumberConstant(double value) { |  | 
| 52     return NEW_NODE_0(COMMON()->NumberConstant(value)); |  | 
| 53   } |  | 
| 54   Node* Float64Constant(double value) { |  | 
| 55     return NEW_NODE_0(COMMON()->Float64Constant(value)); |  | 
| 56   } |  | 
| 57   Node* HeapConstant(Handle<Object> object) { |  | 
| 58     Unique<Object> val = Unique<Object>::CreateUninitialized(object); |  | 
| 59     return NEW_NODE_0(COMMON()->HeapConstant(val)); |  | 
| 60   } |  | 
| 61 |  | 
| 62   Node* Projection(int index, Node* a) { |  | 
| 63     return NEW_NODE_1(COMMON()->Projection(index), a); |  | 
| 64   } |  | 
| 65 |  | 
| 66   // Memory Operations. |  | 
| 67   Node* Load(MachineType rep, Node* base) { |  | 
| 68     return Load(rep, base, Int32Constant(0)); |  | 
| 69   } |  | 
| 70   Node* Load(MachineType rep, Node* base, Node* index) { |  | 
| 71     return NEW_NODE_2(MACHINE()->Load(rep), base, index); |  | 
| 72   } |  | 
| 73   void Store(MachineType rep, Node* base, Node* value) { |  | 
| 74     Store(rep, base, Int32Constant(0), value); |  | 
| 75   } |  | 
| 76   void Store(MachineType rep, Node* base, Node* index, Node* value) { |  | 
| 77     NEW_NODE_3(MACHINE()->Store(rep, kNoWriteBarrier), base, index, value); |  | 
| 78   } |  | 
| 79   // Arithmetic Operations. |  | 
| 80   Node* WordAnd(Node* a, Node* b) { |  | 
| 81     return NEW_NODE_2(MACHINE()->WordAnd(), a, b); |  | 
| 82   } |  | 
| 83   Node* WordOr(Node* a, Node* b) { |  | 
| 84     return NEW_NODE_2(MACHINE()->WordOr(), a, b); |  | 
| 85   } |  | 
| 86   Node* WordXor(Node* a, Node* b) { |  | 
| 87     return NEW_NODE_2(MACHINE()->WordXor(), a, b); |  | 
| 88   } |  | 
| 89   Node* WordShl(Node* a, Node* b) { |  | 
| 90     return NEW_NODE_2(MACHINE()->WordShl(), a, b); |  | 
| 91   } |  | 
| 92   Node* WordShr(Node* a, Node* b) { |  | 
| 93     return NEW_NODE_2(MACHINE()->WordShr(), a, b); |  | 
| 94   } |  | 
| 95   Node* WordSar(Node* a, Node* b) { |  | 
| 96     return NEW_NODE_2(MACHINE()->WordSar(), a, b); |  | 
| 97   } |  | 
| 98   Node* WordRor(Node* a, Node* b) { |  | 
| 99     return NEW_NODE_2(MACHINE()->WordRor(), a, b); |  | 
| 100   } |  | 
| 101   Node* WordEqual(Node* a, Node* b) { |  | 
| 102     return NEW_NODE_2(MACHINE()->WordEqual(), a, b); |  | 
| 103   } |  | 
| 104   Node* WordNotEqual(Node* a, Node* b) { |  | 
| 105     return WordBinaryNot(WordEqual(a, b)); |  | 
| 106   } |  | 
| 107   Node* WordNot(Node* a) { |  | 
| 108     if (MACHINE()->is32()) { |  | 
| 109       return Word32Not(a); |  | 
| 110     } else { |  | 
| 111       return Word64Not(a); |  | 
| 112     } |  | 
| 113   } |  | 
| 114   Node* WordBinaryNot(Node* a) { |  | 
| 115     if (MACHINE()->is32()) { |  | 
| 116       return Word32BinaryNot(a); |  | 
| 117     } else { |  | 
| 118       return Word64BinaryNot(a); |  | 
| 119     } |  | 
| 120   } |  | 
| 121 |  | 
| 122   Node* Word32And(Node* a, Node* b) { |  | 
| 123     return NEW_NODE_2(MACHINE()->Word32And(), a, b); |  | 
| 124   } |  | 
| 125   Node* Word32Or(Node* a, Node* b) { |  | 
| 126     return NEW_NODE_2(MACHINE()->Word32Or(), a, b); |  | 
| 127   } |  | 
| 128   Node* Word32Xor(Node* a, Node* b) { |  | 
| 129     return NEW_NODE_2(MACHINE()->Word32Xor(), a, b); |  | 
| 130   } |  | 
| 131   Node* Word32Shl(Node* a, Node* b) { |  | 
| 132     return NEW_NODE_2(MACHINE()->Word32Shl(), a, b); |  | 
| 133   } |  | 
| 134   Node* Word32Shr(Node* a, Node* b) { |  | 
| 135     return NEW_NODE_2(MACHINE()->Word32Shr(), a, b); |  | 
| 136   } |  | 
| 137   Node* Word32Sar(Node* a, Node* b) { |  | 
| 138     return NEW_NODE_2(MACHINE()->Word32Sar(), a, b); |  | 
| 139   } |  | 
| 140   Node* Word32Ror(Node* a, Node* b) { |  | 
| 141     return NEW_NODE_2(MACHINE()->Word32Ror(), a, b); |  | 
| 142   } |  | 
| 143   Node* Word32Equal(Node* a, Node* b) { |  | 
| 144     return NEW_NODE_2(MACHINE()->Word32Equal(), a, b); |  | 
| 145   } |  | 
| 146   Node* Word32NotEqual(Node* a, Node* b) { |  | 
| 147     return Word32BinaryNot(Word32Equal(a, b)); |  | 
| 148   } |  | 
| 149   Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); } |  | 
| 150   Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); } |  | 
| 151 |  | 
| 152   Node* Word64And(Node* a, Node* b) { |  | 
| 153     return NEW_NODE_2(MACHINE()->Word64And(), a, b); |  | 
| 154   } |  | 
| 155   Node* Word64Or(Node* a, Node* b) { |  | 
| 156     return NEW_NODE_2(MACHINE()->Word64Or(), a, b); |  | 
| 157   } |  | 
| 158   Node* Word64Xor(Node* a, Node* b) { |  | 
| 159     return NEW_NODE_2(MACHINE()->Word64Xor(), a, b); |  | 
| 160   } |  | 
| 161   Node* Word64Shl(Node* a, Node* b) { |  | 
| 162     return NEW_NODE_2(MACHINE()->Word64Shl(), a, b); |  | 
| 163   } |  | 
| 164   Node* Word64Shr(Node* a, Node* b) { |  | 
| 165     return NEW_NODE_2(MACHINE()->Word64Shr(), a, b); |  | 
| 166   } |  | 
| 167   Node* Word64Sar(Node* a, Node* b) { |  | 
| 168     return NEW_NODE_2(MACHINE()->Word64Sar(), a, b); |  | 
| 169   } |  | 
| 170   Node* Word64Ror(Node* a, Node* b) { |  | 
| 171     return NEW_NODE_2(MACHINE()->Word64Ror(), a, b); |  | 
| 172   } |  | 
| 173   Node* Word64Equal(Node* a, Node* b) { |  | 
| 174     return NEW_NODE_2(MACHINE()->Word64Equal(), a, b); |  | 
| 175   } |  | 
| 176   Node* Word64NotEqual(Node* a, Node* b) { |  | 
| 177     return Word64BinaryNot(Word64Equal(a, b)); |  | 
| 178   } |  | 
| 179   Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); } |  | 
| 180   Node* Word64BinaryNot(Node* a) { return Word64Equal(a, Int64Constant(0)); } |  | 
| 181 |  | 
| 182   Node* Int32Add(Node* a, Node* b) { |  | 
| 183     return NEW_NODE_2(MACHINE()->Int32Add(), a, b); |  | 
| 184   } |  | 
| 185   Node* Int32AddWithOverflow(Node* a, Node* b) { |  | 
| 186     return NEW_NODE_2(MACHINE()->Int32AddWithOverflow(), a, b); |  | 
| 187   } |  | 
| 188   Node* Int32Sub(Node* a, Node* b) { |  | 
| 189     return NEW_NODE_2(MACHINE()->Int32Sub(), a, b); |  | 
| 190   } |  | 
| 191   Node* Int32SubWithOverflow(Node* a, Node* b) { |  | 
| 192     return NEW_NODE_2(MACHINE()->Int32SubWithOverflow(), a, b); |  | 
| 193   } |  | 
| 194   Node* Int32Mul(Node* a, Node* b) { |  | 
| 195     return NEW_NODE_2(MACHINE()->Int32Mul(), a, b); |  | 
| 196   } |  | 
| 197   Node* Int32Div(Node* a, Node* b) { |  | 
| 198     return NEW_NODE_2(MACHINE()->Int32Div(), a, b); |  | 
| 199   } |  | 
| 200   Node* Int32UDiv(Node* a, Node* b) { |  | 
| 201     return NEW_NODE_2(MACHINE()->Int32UDiv(), a, b); |  | 
| 202   } |  | 
| 203   Node* Int32Mod(Node* a, Node* b) { |  | 
| 204     return NEW_NODE_2(MACHINE()->Int32Mod(), a, b); |  | 
| 205   } |  | 
| 206   Node* Int32UMod(Node* a, Node* b) { |  | 
| 207     return NEW_NODE_2(MACHINE()->Int32UMod(), a, b); |  | 
| 208   } |  | 
| 209   Node* Int32LessThan(Node* a, Node* b) { |  | 
| 210     return NEW_NODE_2(MACHINE()->Int32LessThan(), a, b); |  | 
| 211   } |  | 
| 212   Node* Int32LessThanOrEqual(Node* a, Node* b) { |  | 
| 213     return NEW_NODE_2(MACHINE()->Int32LessThanOrEqual(), a, b); |  | 
| 214   } |  | 
| 215   Node* Uint32LessThan(Node* a, Node* b) { |  | 
| 216     return NEW_NODE_2(MACHINE()->Uint32LessThan(), a, b); |  | 
| 217   } |  | 
| 218   Node* Uint32LessThanOrEqual(Node* a, Node* b) { |  | 
| 219     return NEW_NODE_2(MACHINE()->Uint32LessThanOrEqual(), a, b); |  | 
| 220   } |  | 
| 221   Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); } |  | 
| 222   Node* Int32GreaterThanOrEqual(Node* a, Node* b) { |  | 
| 223     return Int32LessThanOrEqual(b, a); |  | 
| 224   } |  | 
| 225   Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); } |  | 
| 226 |  | 
| 227   Node* Int64Add(Node* a, Node* b) { |  | 
| 228     return NEW_NODE_2(MACHINE()->Int64Add(), a, b); |  | 
| 229   } |  | 
| 230   Node* Int64Sub(Node* a, Node* b) { |  | 
| 231     return NEW_NODE_2(MACHINE()->Int64Sub(), a, b); |  | 
| 232   } |  | 
| 233   Node* Int64Mul(Node* a, Node* b) { |  | 
| 234     return NEW_NODE_2(MACHINE()->Int64Mul(), a, b); |  | 
| 235   } |  | 
| 236   Node* Int64Div(Node* a, Node* b) { |  | 
| 237     return NEW_NODE_2(MACHINE()->Int64Div(), a, b); |  | 
| 238   } |  | 
| 239   Node* Int64UDiv(Node* a, Node* b) { |  | 
| 240     return NEW_NODE_2(MACHINE()->Int64UDiv(), a, b); |  | 
| 241   } |  | 
| 242   Node* Int64Mod(Node* a, Node* b) { |  | 
| 243     return NEW_NODE_2(MACHINE()->Int64Mod(), a, b); |  | 
| 244   } |  | 
| 245   Node* Int64UMod(Node* a, Node* b) { |  | 
| 246     return NEW_NODE_2(MACHINE()->Int64UMod(), a, b); |  | 
| 247   } |  | 
| 248   Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); } |  | 
| 249   Node* Int64LessThan(Node* a, Node* b) { |  | 
| 250     return NEW_NODE_2(MACHINE()->Int64LessThan(), a, b); |  | 
| 251   } |  | 
| 252   Node* Int64LessThanOrEqual(Node* a, Node* b) { |  | 
| 253     return NEW_NODE_2(MACHINE()->Int64LessThanOrEqual(), a, b); |  | 
| 254   } |  | 
| 255   Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); } |  | 
| 256   Node* Int64GreaterThanOrEqual(Node* a, Node* b) { |  | 
| 257     return Int64LessThanOrEqual(b, a); |  | 
| 258   } |  | 
| 259 |  | 
| 260   // TODO(turbofan): What is this used for? |  | 
| 261   Node* ConvertIntPtrToInt32(Node* a) { |  | 
| 262     return kPointerSize == 8 ? NEW_NODE_1(MACHINE()->TruncateInt64ToInt32(), a) |  | 
| 263                              : a; |  | 
| 264   } |  | 
| 265   Node* ConvertInt32ToIntPtr(Node* a) { |  | 
| 266     return kPointerSize == 8 ? NEW_NODE_1(MACHINE()->ChangeInt32ToInt64(), a) |  | 
| 267                              : a; |  | 
| 268   } |  | 
| 269 |  | 
| 270 #define INTPTR_BINOP(prefix, name)                     \ |  | 
| 271   Node* IntPtr##name(Node* a, Node* b) {               \ |  | 
| 272     return kPointerSize == 8 ? prefix##64##name(a, b)  \ |  | 
| 273                              : prefix##32##name(a, b); \ |  | 
| 274   } |  | 
| 275 |  | 
| 276   INTPTR_BINOP(Int, Add); |  | 
| 277   INTPTR_BINOP(Int, Sub); |  | 
| 278   INTPTR_BINOP(Int, LessThan); |  | 
| 279   INTPTR_BINOP(Int, LessThanOrEqual); |  | 
| 280   INTPTR_BINOP(Word, Equal); |  | 
| 281   INTPTR_BINOP(Word, NotEqual); |  | 
| 282   INTPTR_BINOP(Int, GreaterThanOrEqual); |  | 
| 283   INTPTR_BINOP(Int, GreaterThan); |  | 
| 284 |  | 
| 285 #undef INTPTR_BINOP |  | 
| 286 |  | 
| 287   Node* Float64Add(Node* a, Node* b) { |  | 
| 288     return NEW_NODE_2(MACHINE()->Float64Add(), a, b); |  | 
| 289   } |  | 
| 290   Node* Float64Sub(Node* a, Node* b) { |  | 
| 291     return NEW_NODE_2(MACHINE()->Float64Sub(), a, b); |  | 
| 292   } |  | 
| 293   Node* Float64Mul(Node* a, Node* b) { |  | 
| 294     return NEW_NODE_2(MACHINE()->Float64Mul(), a, b); |  | 
| 295   } |  | 
| 296   Node* Float64Div(Node* a, Node* b) { |  | 
| 297     return NEW_NODE_2(MACHINE()->Float64Div(), a, b); |  | 
| 298   } |  | 
| 299   Node* Float64Mod(Node* a, Node* b) { |  | 
| 300     return NEW_NODE_2(MACHINE()->Float64Mod(), a, b); |  | 
| 301   } |  | 
| 302   Node* Float64Equal(Node* a, Node* b) { |  | 
| 303     return NEW_NODE_2(MACHINE()->Float64Equal(), a, b); |  | 
| 304   } |  | 
| 305   Node* Float64NotEqual(Node* a, Node* b) { |  | 
| 306     return WordBinaryNot(Float64Equal(a, b)); |  | 
| 307   } |  | 
| 308   Node* Float64LessThan(Node* a, Node* b) { |  | 
| 309     return NEW_NODE_2(MACHINE()->Float64LessThan(), a, b); |  | 
| 310   } |  | 
| 311   Node* Float64LessThanOrEqual(Node* a, Node* b) { |  | 
| 312     return NEW_NODE_2(MACHINE()->Float64LessThanOrEqual(), a, b); |  | 
| 313   } |  | 
| 314   Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); } |  | 
| 315   Node* Float64GreaterThanOrEqual(Node* a, Node* b) { |  | 
| 316     return Float64LessThanOrEqual(b, a); |  | 
| 317   } |  | 
| 318 |  | 
| 319   // Conversions. |  | 
| 320   Node* ChangeInt32ToFloat64(Node* a) { |  | 
| 321     return NEW_NODE_1(MACHINE()->ChangeInt32ToFloat64(), a); |  | 
| 322   } |  | 
| 323   Node* ChangeUint32ToFloat64(Node* a) { |  | 
| 324     return NEW_NODE_1(MACHINE()->ChangeUint32ToFloat64(), a); |  | 
| 325   } |  | 
| 326   Node* ChangeFloat64ToInt32(Node* a) { |  | 
| 327     return NEW_NODE_1(MACHINE()->ChangeFloat64ToInt32(), a); |  | 
| 328   } |  | 
| 329   Node* ChangeFloat64ToUint32(Node* a) { |  | 
| 330     return NEW_NODE_1(MACHINE()->ChangeFloat64ToUint32(), a); |  | 
| 331   } |  | 
| 332   Node* ChangeInt32ToInt64(Node* a) { |  | 
| 333     return NEW_NODE_1(MACHINE()->ChangeInt32ToInt64(), a); |  | 
| 334   } |  | 
| 335   Node* ChangeUint32ToUint64(Node* a) { |  | 
| 336     return NEW_NODE_1(MACHINE()->ChangeUint32ToUint64(), a); |  | 
| 337   } |  | 
| 338   Node* TruncateFloat64ToInt32(Node* a) { |  | 
| 339     return NEW_NODE_1(MACHINE()->TruncateFloat64ToInt32(), a); |  | 
| 340   } |  | 
| 341   Node* TruncateInt64ToInt32(Node* a) { |  | 
| 342     return NEW_NODE_1(MACHINE()->TruncateInt64ToInt32(), a); |  | 
| 343   } |  | 
| 344 |  | 
| 345 #ifdef MACHINE_ASSEMBLER_SUPPORTS_CALL_C |  | 
| 346   // Call to C. |  | 
| 347   Node* CallC(Node* function_address, MachineType return_type, |  | 
| 348               MachineType* arg_types, Node** args, int n_args) { |  | 
| 349     Zone* zone = ZONE(); |  | 
| 350     CallDescriptor* descriptor = |  | 
| 351         Linkage::GetSimplifiedCDescriptor(ZONE(), MACHINE_SIG()); |  | 
| 352     Node** passed_args = zone->NewArray<Node*>(n_args + 1); |  | 
| 353     passed_args[0] = function_address; |  | 
| 354     for (int i = 0; i < n_args; ++i) { |  | 
| 355       passed_args[i + 1] = args[i]; |  | 
| 356     } |  | 
| 357     return NEW_NODE_2(COMMON()->Call(descriptor), n_args + 1, passed_args); |  | 
| 358   } |  | 
| 359 #endif |  | 
| 360 }; |  | 
| 361 |  | 
| 362 #undef NEW_NODE_0 |  | 
| 363 #undef NEW_NODE_1 |  | 
| 364 #undef NEW_NODE_2 |  | 
| 365 #undef NEW_NODE_3 |  | 
| 366 #undef MACHINE |  | 
| 367 #undef COMMON |  | 
| 368 #undef ZONE |  | 
| 369 |  | 
| 370 }  // namespace compiler |  | 
| 371 }  // namespace internal |  | 
| 372 }  // namespace v8 |  | 
| 373 |  | 
| 374 #endif  // V8_COMPILER_MACHINE_NODE_FACTORY_H_ |  | 
| OLD | NEW | 
|---|