| Index: src/compiler/machine-operator.cc | 
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..fb46a989ae0139e20adb9e944c92ada9971b0bf1 | 
| --- /dev/null | 
| +++ b/src/compiler/machine-operator.cc | 
| @@ -0,0 +1,241 @@ | 
| +// Copyright 2014 the V8 project authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "src/compiler/machine-operator.h" | 
| + | 
| +#include "src/base/lazy-instance.h" | 
| +#include "src/compiler/opcodes.h" | 
| +#include "src/compiler/operator.h" | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| +namespace compiler { | 
| + | 
| +OStream& operator<<(OStream& os, const WriteBarrierKind& write_barrier_kind) { | 
| +  switch (write_barrier_kind) { | 
| +    case kNoWriteBarrier: | 
| +      return os << "NoWriteBarrier"; | 
| +    case kFullWriteBarrier: | 
| +      return os << "FullWriteBarrier"; | 
| +  } | 
| +  UNREACHABLE(); | 
| +  return os; | 
| +} | 
| + | 
| + | 
| +OStream& operator<<(OStream& os, const StoreRepresentation& rep) { | 
| +  return os << "(" << rep.machine_type() << " : " << rep.write_barrier_kind() | 
| +            << ")"; | 
| +} | 
| + | 
| + | 
| +template <> | 
| +struct StaticParameterTraits<StoreRepresentation> { | 
| +  static OStream& PrintTo(OStream& os, const StoreRepresentation& rep) { | 
| +    return os << rep; | 
| +  } | 
| +  static int HashCode(const StoreRepresentation& rep) { | 
| +    return rep.machine_type() + rep.write_barrier_kind(); | 
| +  } | 
| +  static bool Equals(const StoreRepresentation& rep1, | 
| +                     const StoreRepresentation& rep2) { | 
| +    return rep1 == rep2; | 
| +  } | 
| +}; | 
| + | 
| + | 
| +template <> | 
| +struct StaticParameterTraits<LoadRepresentation> { | 
| +  static OStream& PrintTo(OStream& os, LoadRepresentation type) {  // NOLINT | 
| +    return os << type; | 
| +  } | 
| +  static int HashCode(LoadRepresentation type) { return type; } | 
| +  static bool Equals(LoadRepresentation lhs, LoadRepresentation rhs) { | 
| +    return lhs == rhs; | 
| +  } | 
| +}; | 
| + | 
| + | 
| +#define PURE_OP_LIST(V)                                                       \ | 
| +  V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 1)         \ | 
| +  V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 1)          \ | 
| +  V(Word32Xor, Operator::kAssociative | Operator::kCommutative, 2, 1)         \ | 
| +  V(Word32Shl, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word32Shr, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word32Sar, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word32Ror, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word32Equal, Operator::kCommutative, 2, 1)                                \ | 
| +  V(Word64And, Operator::kAssociative | Operator::kCommutative, 2, 1)         \ | 
| +  V(Word64Or, Operator::kAssociative | Operator::kCommutative, 2, 1)          \ | 
| +  V(Word64Xor, Operator::kAssociative | Operator::kCommutative, 2, 1)         \ | 
| +  V(Word64Shl, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word64Shr, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word64Sar, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word64Ror, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Word64Equal, Operator::kCommutative, 2, 1)                                \ | 
| +  V(Int32Add, Operator::kAssociative | Operator::kCommutative, 2, 1)          \ | 
| +  V(Int32AddWithOverflow, Operator::kAssociative | Operator::kCommutative, 2, \ | 
| +    2)                                                                        \ | 
| +  V(Int32Sub, Operator::kNoProperties, 2, 1)                                  \ | 
| +  V(Int32SubWithOverflow, Operator::kNoProperties, 2, 2)                      \ | 
| +  V(Int32Mul, Operator::kAssociative | Operator::kCommutative, 2, 1)          \ | 
| +  V(Int32Div, Operator::kNoProperties, 2, 1)                                  \ | 
| +  V(Int32UDiv, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Int32Mod, Operator::kNoProperties, 2, 1)                                  \ | 
| +  V(Int32UMod, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Int32LessThan, Operator::kNoProperties, 2, 1)                             \ | 
| +  V(Int32LessThanOrEqual, Operator::kNoProperties, 2, 1)                      \ | 
| +  V(Uint32LessThan, Operator::kNoProperties, 2, 1)                            \ | 
| +  V(Uint32LessThanOrEqual, Operator::kNoProperties, 2, 1)                     \ | 
| +  V(Int64Add, Operator::kAssociative | Operator::kCommutative, 2, 1)          \ | 
| +  V(Int64Sub, Operator::kNoProperties, 2, 1)                                  \ | 
| +  V(Int64Mul, Operator::kAssociative | Operator::kCommutative, 2, 1)          \ | 
| +  V(Int64Div, Operator::kNoProperties, 2, 1)                                  \ | 
| +  V(Int64UDiv, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Int64Mod, Operator::kNoProperties, 2, 1)                                  \ | 
| +  V(Int64UMod, Operator::kNoProperties, 2, 1)                                 \ | 
| +  V(Int64LessThan, Operator::kNoProperties, 2, 1)                             \ | 
| +  V(Int64LessThanOrEqual, Operator::kNoProperties, 2, 1)                      \ | 
| +  V(ChangeFloat64ToInt32, Operator::kNoProperties, 1, 1)                      \ | 
| +  V(ChangeFloat64ToUint32, Operator::kNoProperties, 1, 1)                     \ | 
| +  V(ChangeInt32ToFloat64, Operator::kNoProperties, 1, 1)                      \ | 
| +  V(ChangeInt32ToInt64, Operator::kNoProperties, 1, 1)                        \ | 
| +  V(ChangeUint32ToFloat64, Operator::kNoProperties, 1, 1)                     \ | 
| +  V(ChangeUint32ToUint64, Operator::kNoProperties, 1, 1)                      \ | 
| +  V(TruncateFloat64ToInt32, Operator::kNoProperties, 1, 1)                    \ | 
| +  V(TruncateInt64ToInt32, Operator::kNoProperties, 1, 1)                      \ | 
| +  V(Float64Add, Operator::kCommutative, 2, 1)                                 \ | 
| +  V(Float64Sub, Operator::kNoProperties, 2, 1)                                \ | 
| +  V(Float64Mul, Operator::kCommutative, 2, 1)                                 \ | 
| +  V(Float64Div, Operator::kNoProperties, 2, 1)                                \ | 
| +  V(Float64Mod, Operator::kNoProperties, 2, 1)                                \ | 
| +  V(Float64Equal, Operator::kCommutative, 2, 1)                               \ | 
| +  V(Float64LessThan, Operator::kNoProperties, 2, 1)                           \ | 
| +  V(Float64LessThanOrEqual, Operator::kNoProperties, 2, 1) | 
| + | 
| + | 
| +#define MACHINE_TYPE_LIST(V) \ | 
| +  V(MachFloat32)             \ | 
| +  V(MachFloat64)             \ | 
| +  V(MachInt8)                \ | 
| +  V(MachUint8)               \ | 
| +  V(MachInt16)               \ | 
| +  V(MachUint16)              \ | 
| +  V(MachInt32)               \ | 
| +  V(MachUint32)              \ | 
| +  V(MachInt64)               \ | 
| +  V(MachUint64)              \ | 
| +  V(MachAnyTagged)           \ | 
| +  V(RepBit)                  \ | 
| +  V(RepWord8)                \ | 
| +  V(RepWord16)               \ | 
| +  V(RepWord32)               \ | 
| +  V(RepWord64)               \ | 
| +  V(RepFloat32)              \ | 
| +  V(RepFloat64)              \ | 
| +  V(RepTagged) | 
| + | 
| + | 
| +struct MachineOperatorBuilderImpl { | 
| +#define PURE(Name, properties, input_count, output_count)                 \ | 
| +  struct Name##Operator FINAL : public SimpleOperator {                   \ | 
| +    Name##Operator()                                                      \ | 
| +        : SimpleOperator(IrOpcode::k##Name, Operator::kPure | properties, \ | 
| +                         input_count, output_count, #Name) {}             \ | 
| +  };                                                                      \ | 
| +  Name##Operator k##Name; | 
| +  PURE_OP_LIST(PURE) | 
| +#undef PURE | 
| + | 
| +#define LOAD(Type)                                                            \ | 
| +  struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> {  \ | 
| +    Load##Type##Operator()                                                    \ | 
| +        : Operator1<LoadRepresentation>(                                      \ | 
| +              IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, 2, 1, \ | 
| +              "Load", k##Type) {}                                             \ | 
| +  };                                                                          \ | 
| +  Load##Type##Operator k##Load##Type; | 
| +  MACHINE_TYPE_LIST(LOAD) | 
| +#undef LOAD | 
| + | 
| +#define STORE(Type)                                                           \ | 
| +  struct Store##Type##Operator : public Operator1<StoreRepresentation> {      \ | 
| +    explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind)       \ | 
| +        : Operator1<StoreRepresentation>(                                     \ | 
| +              IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, 3, 0, \ | 
| +              "Store", StoreRepresentation(k##Type, write_barrier_kind)) {}   \ | 
| +  };                                                                          \ | 
| +  struct Store##Type##NoWriteBarrier##Operator FINAL                          \ | 
| +      : public Store##Type##Operator {                                        \ | 
| +    Store##Type##NoWriteBarrier##Operator()                                   \ | 
| +        : Store##Type##Operator(kNoWriteBarrier) {}                           \ | 
| +  };                                                                          \ | 
| +  struct Store##Type##FullWriteBarrier##Operator FINAL                        \ | 
| +      : public Store##Type##Operator {                                        \ | 
| +    Store##Type##FullWriteBarrier##Operator()                                 \ | 
| +        : Store##Type##Operator(kFullWriteBarrier) {}                         \ | 
| +  };                                                                          \ | 
| +  Store##Type##NoWriteBarrier##Operator k##Store##Type##NoWriteBarrier;       \ | 
| +  Store##Type##FullWriteBarrier##Operator k##Store##Type##FullWriteBarrier; | 
| +  MACHINE_TYPE_LIST(STORE) | 
| +#undef STORE | 
| +}; | 
| + | 
| + | 
| +static base::LazyInstance<MachineOperatorBuilderImpl>::type kImpl = | 
| +    LAZY_INSTANCE_INITIALIZER; | 
| + | 
| + | 
| +MachineOperatorBuilder::MachineOperatorBuilder(MachineType word) | 
| +    : impl_(kImpl.Get()), word_(word) { | 
| +  DCHECK(word == kRepWord32 || word == kRepWord64); | 
| +} | 
| + | 
| + | 
| +#define PURE(Name, properties, input_count, output_count) \ | 
| +  const Operator* MachineOperatorBuilder::Name() { return &impl_.k##Name; } | 
| +PURE_OP_LIST(PURE) | 
| +#undef PURE | 
| + | 
| + | 
| +const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) { | 
| +  switch (rep) { | 
| +#define LOAD(Type) \ | 
| +  case k##Type:    \ | 
| +    return &impl_.k##Load##Type; | 
| +    MACHINE_TYPE_LIST(LOAD) | 
| +#undef LOAD | 
| + | 
| +    default: | 
| +      break; | 
| +  } | 
| +  UNREACHABLE(); | 
| +  return NULL; | 
| +} | 
| + | 
| + | 
| +const Operator* MachineOperatorBuilder::Store(StoreRepresentation rep) { | 
| +  switch (rep.machine_type()) { | 
| +#define STORE(Type)                                     \ | 
| +  case k##Type:                                         \ | 
| +    switch (rep.write_barrier_kind()) {                 \ | 
| +      case kNoWriteBarrier:                             \ | 
| +        return &impl_.k##Store##Type##NoWriteBarrier;   \ | 
| +      case kFullWriteBarrier:                           \ | 
| +        return &impl_.k##Store##Type##FullWriteBarrier; \ | 
| +    }                                                   \ | 
| +    break; | 
| +    MACHINE_TYPE_LIST(STORE) | 
| +#undef STORE | 
| + | 
| +    default: | 
| +      break; | 
| +  } | 
| +  UNREACHABLE(); | 
| +  return NULL; | 
| +} | 
| + | 
| +}  // namespace compiler | 
| +}  // namespace internal | 
| +}  // namespace v8 | 
|  |