Home | History | Annotate | Download | only in compiler
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_
      6 #define V8_COMPILER_MACHINE_OPERATOR_H_
      7 
      8 #include "src/base/compiler-specific.h"
      9 #include "src/base/flags.h"
     10 #include "src/globals.h"
     11 #include "src/machine-type.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 namespace compiler {
     16 
     17 // Forward declarations.
     18 struct MachineOperatorGlobalCache;
     19 class Operator;
     20 
     21 
     22 // For operators that are not supported on all platforms.
     23 class OptionalOperator final {
     24  public:
     25   OptionalOperator(bool supported, const Operator* op)
     26       : supported_(supported), op_(op) {}
     27 
     28   bool IsSupported() const { return supported_; }
     29   // Gets the operator only if it is supported.
     30   const Operator* op() const {
     31     DCHECK(supported_);
     32     return op_;
     33   }
     34   // Always gets the operator, even for unsupported operators. This is useful to
     35   // use the operator as a placeholder in a graph, for instance.
     36   const Operator* placeholder() const { return op_; }
     37 
     38  private:
     39   bool supported_;
     40   const Operator* const op_;
     41 };
     42 
     43 
     44 // A Load needs a MachineType.
     45 typedef MachineType LoadRepresentation;
     46 
     47 LoadRepresentation LoadRepresentationOf(Operator const*);
     48 
     49 // A Store needs a MachineType and a WriteBarrierKind in order to emit the
     50 // correct write barrier.
     51 class StoreRepresentation final {
     52  public:
     53   StoreRepresentation(MachineRepresentation representation,
     54                       WriteBarrierKind write_barrier_kind)
     55       : representation_(representation),
     56         write_barrier_kind_(write_barrier_kind) {}
     57 
     58   MachineRepresentation representation() const { return representation_; }
     59   WriteBarrierKind write_barrier_kind() const { return write_barrier_kind_; }
     60 
     61  private:
     62   MachineRepresentation representation_;
     63   WriteBarrierKind write_barrier_kind_;
     64 };
     65 
     66 V8_EXPORT_PRIVATE bool operator==(StoreRepresentation, StoreRepresentation);
     67 bool operator!=(StoreRepresentation, StoreRepresentation);
     68 
     69 size_t hash_value(StoreRepresentation);
     70 
     71 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, StoreRepresentation);
     72 
     73 StoreRepresentation const& StoreRepresentationOf(Operator const*);
     74 
     75 typedef MachineType UnalignedLoadRepresentation;
     76 
     77 UnalignedLoadRepresentation UnalignedLoadRepresentationOf(Operator const*);
     78 
     79 // An UnalignedStore needs a MachineType.
     80 typedef MachineRepresentation UnalignedStoreRepresentation;
     81 
     82 UnalignedStoreRepresentation const& UnalignedStoreRepresentationOf(
     83     Operator const*);
     84 
     85 // A CheckedLoad needs a MachineType.
     86 typedef MachineType CheckedLoadRepresentation;
     87 
     88 CheckedLoadRepresentation CheckedLoadRepresentationOf(Operator const*);
     89 
     90 
     91 // A CheckedStore needs a MachineType.
     92 typedef MachineRepresentation CheckedStoreRepresentation;
     93 
     94 CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const*);
     95 
     96 int StackSlotSizeOf(Operator const* op);
     97 
     98 MachineRepresentation AtomicStoreRepresentationOf(Operator const* op);
     99 
    100 // Interface for building machine-level operators. These operators are
    101 // machine-level but machine-independent and thus define a language suitable
    102 // for generating code to run on architectures such as ia32, x64, arm, etc.
    103 class V8_EXPORT_PRIVATE MachineOperatorBuilder final
    104     : public NON_EXPORTED_BASE(ZoneObject) {
    105  public:
    106   // Flags that specify which operations are available. This is useful
    107   // for operations that are unsupported by some back-ends.
    108   enum Flag : unsigned {
    109     kNoFlags = 0u,
    110     kFloat32RoundDown = 1u << 0,
    111     kFloat64RoundDown = 1u << 1,
    112     kFloat32RoundUp = 1u << 2,
    113     kFloat64RoundUp = 1u << 3,
    114     kFloat32RoundTruncate = 1u << 4,
    115     kFloat64RoundTruncate = 1u << 5,
    116     kFloat32RoundTiesEven = 1u << 6,
    117     kFloat64RoundTiesEven = 1u << 7,
    118     kFloat64RoundTiesAway = 1u << 8,
    119     kInt32DivIsSafe = 1u << 9,
    120     kUint32DivIsSafe = 1u << 10,
    121     kWord32ShiftIsSafe = 1u << 11,
    122     kWord32Ctz = 1u << 12,
    123     kWord64Ctz = 1u << 13,
    124     kWord32Popcnt = 1u << 14,
    125     kWord64Popcnt = 1u << 15,
    126     kWord32ReverseBits = 1u << 16,
    127     kWord64ReverseBits = 1u << 17,
    128     kWord32ReverseBytes = 1u << 18,
    129     kWord64ReverseBytes = 1u << 19,
    130     kAllOptionalOps = kFloat32RoundDown | kFloat64RoundDown | kFloat32RoundUp |
    131                       kFloat64RoundUp | kFloat32RoundTruncate |
    132                       kFloat64RoundTruncate | kFloat64RoundTiesAway |
    133                       kFloat32RoundTiesEven | kFloat64RoundTiesEven |
    134                       kWord32Ctz | kWord64Ctz | kWord32Popcnt | kWord64Popcnt |
    135                       kWord32ReverseBits | kWord64ReverseBits |
    136                       kWord32ReverseBytes | kWord64ReverseBytes
    137   };
    138   typedef base::Flags<Flag, unsigned> Flags;
    139 
    140   class AlignmentRequirements {
    141    public:
    142     enum UnalignedAccessSupport { kNoSupport, kSomeSupport, kFullSupport };
    143 
    144     bool IsUnalignedLoadSupported(const MachineType& machineType,
    145                                   uint8_t alignment) const {
    146       return IsUnalignedSupported(unalignedLoadUnsupportedTypes_, machineType,
    147                                   alignment);
    148     }
    149 
    150     bool IsUnalignedStoreSupported(const MachineType& machineType,
    151                                    uint8_t alignment) const {
    152       return IsUnalignedSupported(unalignedStoreUnsupportedTypes_, machineType,
    153                                   alignment);
    154     }
    155 
    156     static AlignmentRequirements FullUnalignedAccessSupport() {
    157       return AlignmentRequirements(kFullSupport);
    158     }
    159     static AlignmentRequirements NoUnalignedAccessSupport() {
    160       return AlignmentRequirements(kNoSupport);
    161     }
    162     static AlignmentRequirements SomeUnalignedAccessUnsupported(
    163         const Vector<MachineType>& unalignedLoadUnsupportedTypes,
    164         const Vector<MachineType>& unalignedStoreUnsupportedTypes) {
    165       return AlignmentRequirements(kSomeSupport, unalignedLoadUnsupportedTypes,
    166                                    unalignedStoreUnsupportedTypes);
    167     }
    168 
    169    private:
    170     explicit AlignmentRequirements(
    171         AlignmentRequirements::UnalignedAccessSupport unalignedAccessSupport,
    172         Vector<MachineType> unalignedLoadUnsupportedTypes =
    173             Vector<MachineType>(NULL, 0),
    174         Vector<MachineType> unalignedStoreUnsupportedTypes =
    175             Vector<MachineType>(NULL, 0))
    176         : unalignedSupport_(unalignedAccessSupport),
    177           unalignedLoadUnsupportedTypes_(unalignedLoadUnsupportedTypes),
    178           unalignedStoreUnsupportedTypes_(unalignedStoreUnsupportedTypes) {}
    179 
    180     bool IsUnalignedSupported(const Vector<MachineType>& unsupported,
    181                               const MachineType& machineType,
    182                               uint8_t alignment) const {
    183       if (unalignedSupport_ == kFullSupport) {
    184         return true;
    185       } else if (unalignedSupport_ == kNoSupport) {
    186         return false;
    187       } else {
    188         for (MachineType m : unsupported) {
    189           if (m == machineType) {
    190             return false;
    191           }
    192         }
    193         return true;
    194       }
    195     }
    196 
    197     const AlignmentRequirements::UnalignedAccessSupport unalignedSupport_;
    198     const Vector<MachineType> unalignedLoadUnsupportedTypes_;
    199     const Vector<MachineType> unalignedStoreUnsupportedTypes_;
    200   };
    201 
    202   explicit MachineOperatorBuilder(
    203       Zone* zone,
    204       MachineRepresentation word = MachineType::PointerRepresentation(),
    205       Flags supportedOperators = kNoFlags,
    206       AlignmentRequirements alignmentRequirements =
    207           AlignmentRequirements::FullUnalignedAccessSupport());
    208 
    209   const Operator* Comment(const char* msg);
    210   const Operator* DebugBreak();
    211   const Operator* UnsafePointerAdd();
    212 
    213   const Operator* Word32And();
    214   const Operator* Word32Or();
    215   const Operator* Word32Xor();
    216   const Operator* Word32Shl();
    217   const Operator* Word32Shr();
    218   const Operator* Word32Sar();
    219   const Operator* Word32Ror();
    220   const Operator* Word32Equal();
    221   const Operator* Word32Clz();
    222   const OptionalOperator Word32Ctz();
    223   const OptionalOperator Word32Popcnt();
    224   const OptionalOperator Word64Popcnt();
    225   const OptionalOperator Word32ReverseBits();
    226   const OptionalOperator Word64ReverseBits();
    227   const OptionalOperator Word32ReverseBytes();
    228   const OptionalOperator Word64ReverseBytes();
    229   bool Word32ShiftIsSafe() const { return flags_ & kWord32ShiftIsSafe; }
    230 
    231   const Operator* Word64And();
    232   const Operator* Word64Or();
    233   const Operator* Word64Xor();
    234   const Operator* Word64Shl();
    235   const Operator* Word64Shr();
    236   const Operator* Word64Sar();
    237   const Operator* Word64Ror();
    238   const Operator* Word64Clz();
    239   const OptionalOperator Word64Ctz();
    240   const Operator* Word64Equal();
    241 
    242   const Operator* Int32PairAdd();
    243   const Operator* Int32PairSub();
    244   const Operator* Int32PairMul();
    245   const Operator* Word32PairShl();
    246   const Operator* Word32PairShr();
    247   const Operator* Word32PairSar();
    248 
    249   const Operator* Int32Add();
    250   const Operator* Int32AddWithOverflow();
    251   const Operator* Int32Sub();
    252   const Operator* Int32SubWithOverflow();
    253   const Operator* Int32Mul();
    254   const Operator* Int32MulWithOverflow();
    255   const Operator* Int32MulHigh();
    256   const Operator* Int32Div();
    257   const Operator* Int32Mod();
    258   const Operator* Int32LessThan();
    259   const Operator* Int32LessThanOrEqual();
    260   const Operator* Uint32Div();
    261   const Operator* Uint32LessThan();
    262   const Operator* Uint32LessThanOrEqual();
    263   const Operator* Uint32Mod();
    264   const Operator* Uint32MulHigh();
    265   bool Int32DivIsSafe() const { return flags_ & kInt32DivIsSafe; }
    266   bool Uint32DivIsSafe() const { return flags_ & kUint32DivIsSafe; }
    267 
    268   const Operator* Int64Add();
    269   const Operator* Int64AddWithOverflow();
    270   const Operator* Int64Sub();
    271   const Operator* Int64SubWithOverflow();
    272   const Operator* Int64Mul();
    273   const Operator* Int64Div();
    274   const Operator* Int64Mod();
    275   const Operator* Int64LessThan();
    276   const Operator* Int64LessThanOrEqual();
    277   const Operator* Uint64Div();
    278   const Operator* Uint64LessThan();
    279   const Operator* Uint64LessThanOrEqual();
    280   const Operator* Uint64Mod();
    281 
    282   // This operator reinterprets the bits of a tagged pointer as word.
    283   const Operator* BitcastTaggedToWord();
    284 
    285   // This operator reinterprets the bits of a word as tagged pointer.
    286   const Operator* BitcastWordToTagged();
    287 
    288   // This operator reinterprets the bits of a word as a Smi.
    289   const Operator* BitcastWordToTaggedSigned();
    290 
    291   // JavaScript float64 to int32/uint32 truncation.
    292   const Operator* TruncateFloat64ToWord32();
    293 
    294   // These operators change the representation of numbers while preserving the
    295   // value of the number. Narrowing operators assume the input is representable
    296   // in the target type and are *not* defined for other inputs.
    297   // Use narrowing change operators only when there is a static guarantee that
    298   // the input value is representable in the target value.
    299   const Operator* ChangeFloat32ToFloat64();
    300   const Operator* ChangeFloat64ToInt32();   // narrowing
    301   const Operator* ChangeFloat64ToUint32();  // narrowing
    302   const Operator* TruncateFloat64ToUint32();
    303   const Operator* TruncateFloat32ToInt32();
    304   const Operator* TruncateFloat32ToUint32();
    305   const Operator* TryTruncateFloat32ToInt64();
    306   const Operator* TryTruncateFloat64ToInt64();
    307   const Operator* TryTruncateFloat32ToUint64();
    308   const Operator* TryTruncateFloat64ToUint64();
    309   const Operator* ChangeInt32ToFloat64();
    310   const Operator* ChangeInt32ToInt64();
    311   const Operator* ChangeUint32ToFloat64();
    312   const Operator* ChangeUint32ToUint64();
    313 
    314   // These operators truncate or round numbers, both changing the representation
    315   // of the number and mapping multiple input values onto the same output value.
    316   const Operator* TruncateFloat64ToFloat32();
    317   const Operator* TruncateInt64ToInt32();
    318   const Operator* RoundFloat64ToInt32();
    319   const Operator* RoundInt32ToFloat32();
    320   const Operator* RoundInt64ToFloat32();
    321   const Operator* RoundInt64ToFloat64();
    322   const Operator* RoundUint32ToFloat32();
    323   const Operator* RoundUint64ToFloat32();
    324   const Operator* RoundUint64ToFloat64();
    325 
    326   // These operators reinterpret the bits of a floating point number as an
    327   // integer and vice versa.
    328   const Operator* BitcastFloat32ToInt32();
    329   const Operator* BitcastFloat64ToInt64();
    330   const Operator* BitcastInt32ToFloat32();
    331   const Operator* BitcastInt64ToFloat64();
    332 
    333   // Floating point operators always operate with IEEE 754 round-to-nearest
    334   // (single-precision).
    335   const Operator* Float32Add();
    336   const Operator* Float32Sub();
    337   const Operator* Float32Mul();
    338   const Operator* Float32Div();
    339   const Operator* Float32Sqrt();
    340 
    341   // Floating point operators always operate with IEEE 754 round-to-nearest
    342   // (double-precision).
    343   const Operator* Float64Add();
    344   const Operator* Float64Sub();
    345   const Operator* Float64Mul();
    346   const Operator* Float64Div();
    347   const Operator* Float64Mod();
    348   const Operator* Float64Sqrt();
    349 
    350   // Floating point comparisons complying to IEEE 754 (single-precision).
    351   const Operator* Float32Equal();
    352   const Operator* Float32LessThan();
    353   const Operator* Float32LessThanOrEqual();
    354 
    355   // Floating point comparisons complying to IEEE 754 (double-precision).
    356   const Operator* Float64Equal();
    357   const Operator* Float64LessThan();
    358   const Operator* Float64LessThanOrEqual();
    359 
    360   // Floating point min/max complying to EcmaScript 6 (double-precision).
    361   const Operator* Float64Max();
    362   const Operator* Float64Min();
    363   // Floating point min/max complying to WebAssembly (single-precision).
    364   const Operator* Float32Max();
    365   const Operator* Float32Min();
    366 
    367   // Floating point abs complying to IEEE 754 (single-precision).
    368   const Operator* Float32Abs();
    369 
    370   // Floating point abs complying to IEEE 754 (double-precision).
    371   const Operator* Float64Abs();
    372 
    373   // Floating point rounding.
    374   const OptionalOperator Float32RoundDown();
    375   const OptionalOperator Float64RoundDown();
    376   const OptionalOperator Float32RoundUp();
    377   const OptionalOperator Float64RoundUp();
    378   const OptionalOperator Float32RoundTruncate();
    379   const OptionalOperator Float64RoundTruncate();
    380   const OptionalOperator Float64RoundTiesAway();
    381   const OptionalOperator Float32RoundTiesEven();
    382   const OptionalOperator Float64RoundTiesEven();
    383 
    384   // Floating point neg.
    385   const Operator* Float32Neg();
    386   const Operator* Float64Neg();
    387 
    388   // Floating point trigonometric functions (double-precision).
    389   const Operator* Float64Acos();
    390   const Operator* Float64Acosh();
    391   const Operator* Float64Asin();
    392   const Operator* Float64Asinh();
    393   const Operator* Float64Atan();
    394   const Operator* Float64Atan2();
    395   const Operator* Float64Atanh();
    396   const Operator* Float64Cos();
    397   const Operator* Float64Cosh();
    398   const Operator* Float64Sin();
    399   const Operator* Float64Sinh();
    400   const Operator* Float64Tan();
    401   const Operator* Float64Tanh();
    402 
    403   // Floating point exponential functions (double-precision).
    404   const Operator* Float64Exp();
    405   const Operator* Float64Expm1();
    406   const Operator* Float64Pow();
    407 
    408   // Floating point logarithm (double-precision).
    409   const Operator* Float64Log();
    410   const Operator* Float64Log1p();
    411   const Operator* Float64Log2();
    412   const Operator* Float64Log10();
    413 
    414   // Floating point cube root (double-precision).
    415   const Operator* Float64Cbrt();
    416 
    417   // Floating point bit representation.
    418   const Operator* Float64ExtractLowWord32();
    419   const Operator* Float64ExtractHighWord32();
    420   const Operator* Float64InsertLowWord32();
    421   const Operator* Float64InsertHighWord32();
    422 
    423   // Change signalling NaN to quiet NaN.
    424   // Identity for any input that is not signalling NaN.
    425   const Operator* Float64SilenceNaN();
    426 
    427   // SIMD operators.
    428   const Operator* CreateFloat32x4();
    429   const Operator* Float32x4ExtractLane(int32_t);
    430   const Operator* Float32x4ReplaceLane(int32_t);
    431   const Operator* Float32x4Abs();
    432   const Operator* Float32x4Neg();
    433   const Operator* Float32x4Sqrt();
    434   const Operator* Float32x4RecipApprox();
    435   const Operator* Float32x4RecipSqrtApprox();
    436   const Operator* Float32x4Add();
    437   const Operator* Float32x4Sub();
    438   const Operator* Float32x4Mul();
    439   const Operator* Float32x4Div();
    440   const Operator* Float32x4Min();
    441   const Operator* Float32x4Max();
    442   const Operator* Float32x4MinNum();
    443   const Operator* Float32x4MaxNum();
    444   const Operator* Float32x4Equal();
    445   const Operator* Float32x4NotEqual();
    446   const Operator* Float32x4LessThan();
    447   const Operator* Float32x4LessThanOrEqual();
    448   const Operator* Float32x4GreaterThan();
    449   const Operator* Float32x4GreaterThanOrEqual();
    450   const Operator* Float32x4FromInt32x4();
    451   const Operator* Float32x4FromUint32x4();
    452 
    453   const Operator* CreateInt32x4();
    454   const Operator* Int32x4ExtractLane(int32_t);
    455   const Operator* Int32x4ReplaceLane(int32_t);
    456   const Operator* Int32x4Neg();
    457   const Operator* Int32x4Add();
    458   const Operator* Int32x4Sub();
    459   const Operator* Int32x4Mul();
    460   const Operator* Int32x4Min();
    461   const Operator* Int32x4Max();
    462   const Operator* Int32x4ShiftLeftByScalar(int32_t);
    463   const Operator* Int32x4ShiftRightByScalar(int32_t);
    464   const Operator* Int32x4Equal();
    465   const Operator* Int32x4NotEqual();
    466   const Operator* Int32x4LessThan();
    467   const Operator* Int32x4LessThanOrEqual();
    468   const Operator* Int32x4GreaterThan();
    469   const Operator* Int32x4GreaterThanOrEqual();
    470   const Operator* Int32x4FromFloat32x4();
    471 
    472   const Operator* Uint32x4Min();
    473   const Operator* Uint32x4Max();
    474   const Operator* Uint32x4ShiftRightByScalar(int32_t);
    475   const Operator* Uint32x4LessThan();
    476   const Operator* Uint32x4LessThanOrEqual();
    477   const Operator* Uint32x4GreaterThan();
    478   const Operator* Uint32x4GreaterThanOrEqual();
    479   const Operator* Uint32x4FromFloat32x4();
    480 
    481   const Operator* Bool32x4And();
    482   const Operator* Bool32x4Or();
    483   const Operator* Bool32x4Xor();
    484   const Operator* Bool32x4Not();
    485   const Operator* Bool32x4AnyTrue();
    486   const Operator* Bool32x4AllTrue();
    487 
    488   const Operator* CreateInt16x8();
    489   const Operator* Int16x8ExtractLane(int32_t);
    490   const Operator* Int16x8ReplaceLane(int32_t);
    491   const Operator* Int16x8Neg();
    492   const Operator* Int16x8Add();
    493   const Operator* Int16x8AddSaturate();
    494   const Operator* Int16x8Sub();
    495   const Operator* Int16x8SubSaturate();
    496   const Operator* Int16x8Mul();
    497   const Operator* Int16x8Min();
    498   const Operator* Int16x8Max();
    499   const Operator* Int16x8ShiftLeftByScalar(int32_t);
    500   const Operator* Int16x8ShiftRightByScalar(int32_t);
    501   const Operator* Int16x8Equal();
    502   const Operator* Int16x8NotEqual();
    503   const Operator* Int16x8LessThan();
    504   const Operator* Int16x8LessThanOrEqual();
    505   const Operator* Int16x8GreaterThan();
    506   const Operator* Int16x8GreaterThanOrEqual();
    507 
    508   const Operator* Uint16x8AddSaturate();
    509   const Operator* Uint16x8SubSaturate();
    510   const Operator* Uint16x8Min();
    511   const Operator* Uint16x8Max();
    512   const Operator* Uint16x8ShiftRightByScalar(int32_t);
    513   const Operator* Uint16x8LessThan();
    514   const Operator* Uint16x8LessThanOrEqual();
    515   const Operator* Uint16x8GreaterThan();
    516   const Operator* Uint16x8GreaterThanOrEqual();
    517 
    518   const Operator* Bool16x8And();
    519   const Operator* Bool16x8Or();
    520   const Operator* Bool16x8Xor();
    521   const Operator* Bool16x8Not();
    522   const Operator* Bool16x8AnyTrue();
    523   const Operator* Bool16x8AllTrue();
    524 
    525   const Operator* CreateInt8x16();
    526   const Operator* Int8x16ExtractLane(int32_t);
    527   const Operator* Int8x16ReplaceLane(int32_t);
    528   const Operator* Int8x16Neg();
    529   const Operator* Int8x16Add();
    530   const Operator* Int8x16AddSaturate();
    531   const Operator* Int8x16Sub();
    532   const Operator* Int8x16SubSaturate();
    533   const Operator* Int8x16Mul();
    534   const Operator* Int8x16Min();
    535   const Operator* Int8x16Max();
    536   const Operator* Int8x16ShiftLeftByScalar(int32_t);
    537   const Operator* Int8x16ShiftRightByScalar(int32_t);
    538   const Operator* Int8x16Equal();
    539   const Operator* Int8x16NotEqual();
    540   const Operator* Int8x16LessThan();
    541   const Operator* Int8x16LessThanOrEqual();
    542   const Operator* Int8x16GreaterThan();
    543   const Operator* Int8x16GreaterThanOrEqual();
    544 
    545   const Operator* Uint8x16AddSaturate();
    546   const Operator* Uint8x16SubSaturate();
    547   const Operator* Uint8x16Min();
    548   const Operator* Uint8x16Max();
    549   const Operator* Uint8x16ShiftRightByScalar(int32_t);
    550   const Operator* Uint8x16LessThan();
    551   const Operator* Uint8x16LessThanOrEqual();
    552   const Operator* Uint8x16GreaterThan();
    553   const Operator* Uint8x16GreaterThanOrEqual();
    554 
    555   const Operator* Bool8x16And();
    556   const Operator* Bool8x16Or();
    557   const Operator* Bool8x16Xor();
    558   const Operator* Bool8x16Not();
    559   const Operator* Bool8x16AnyTrue();
    560   const Operator* Bool8x16AllTrue();
    561 
    562   const Operator* Simd128Load();
    563   const Operator* Simd128Load1();
    564   const Operator* Simd128Load2();
    565   const Operator* Simd128Load3();
    566   const Operator* Simd128Store();
    567   const Operator* Simd128Store1();
    568   const Operator* Simd128Store2();
    569   const Operator* Simd128Store3();
    570   const Operator* Simd128And();
    571   const Operator* Simd128Or();
    572   const Operator* Simd128Xor();
    573   const Operator* Simd128Not();
    574   const Operator* Simd32x4Select();
    575   const Operator* Simd32x4Swizzle(uint32_t);
    576   const Operator* Simd32x4Shuffle();
    577   const Operator* Simd16x8Select();
    578   const Operator* Simd16x8Swizzle(uint32_t);
    579   const Operator* Simd16x8Shuffle();
    580   const Operator* Simd8x16Select();
    581   const Operator* Simd8x16Swizzle(uint32_t);
    582   const Operator* Simd8x16Shuffle();
    583 
    584   // load [base + index]
    585   const Operator* Load(LoadRepresentation rep);
    586   const Operator* ProtectedLoad(LoadRepresentation rep);
    587 
    588   // store [base + index], value
    589   const Operator* Store(StoreRepresentation rep);
    590   const Operator* ProtectedStore(MachineRepresentation rep);
    591 
    592   // unaligned load [base + index]
    593   const Operator* UnalignedLoad(UnalignedLoadRepresentation rep);
    594 
    595   // unaligned store [base + index], value
    596   const Operator* UnalignedStore(UnalignedStoreRepresentation rep);
    597 
    598   const Operator* StackSlot(int size);
    599   const Operator* StackSlot(MachineRepresentation rep);
    600 
    601   // Access to the machine stack.
    602   const Operator* LoadStackPointer();
    603   const Operator* LoadFramePointer();
    604   const Operator* LoadParentFramePointer();
    605 
    606   // checked-load heap, index, length
    607   const Operator* CheckedLoad(CheckedLoadRepresentation);
    608   // checked-store heap, index, length, value
    609   const Operator* CheckedStore(CheckedStoreRepresentation);
    610 
    611   // atomic-load [base + index]
    612   const Operator* AtomicLoad(LoadRepresentation rep);
    613   // atomic-store [base + index], value
    614   const Operator* AtomicStore(MachineRepresentation rep);
    615 
    616   // Target machine word-size assumed by this builder.
    617   bool Is32() const { return word() == MachineRepresentation::kWord32; }
    618   bool Is64() const { return word() == MachineRepresentation::kWord64; }
    619   MachineRepresentation word() const { return word_; }
    620 
    621   bool UnalignedLoadSupported(const MachineType& machineType,
    622                               uint8_t alignment) {
    623     return alignment_requirements_.IsUnalignedLoadSupported(machineType,
    624                                                             alignment);
    625   }
    626 
    627   bool UnalignedStoreSupported(const MachineType& machineType,
    628                                uint8_t alignment) {
    629     return alignment_requirements_.IsUnalignedStoreSupported(machineType,
    630                                                              alignment);
    631   }
    632 
    633 // Pseudo operators that translate to 32/64-bit operators depending on the
    634 // word-size of the target machine assumed by this builder.
    635 #define PSEUDO_OP_LIST(V) \
    636   V(Word, And)            \
    637   V(Word, Or)             \
    638   V(Word, Xor)            \
    639   V(Word, Shl)            \
    640   V(Word, Shr)            \
    641   V(Word, Sar)            \
    642   V(Word, Ror)            \
    643   V(Word, Clz)            \
    644   V(Word, Equal)          \
    645   V(Int, Add)             \
    646   V(Int, Sub)             \
    647   V(Int, Mul)             \
    648   V(Int, Div)             \
    649   V(Int, Mod)             \
    650   V(Int, LessThan)        \
    651   V(Int, LessThanOrEqual) \
    652   V(Uint, Div)            \
    653   V(Uint, LessThan)       \
    654   V(Uint, Mod)
    655 #define PSEUDO_OP(Prefix, Suffix)                                \
    656   const Operator* Prefix##Suffix() {                             \
    657     return Is32() ? Prefix##32##Suffix() : Prefix##64##Suffix(); \
    658   }
    659   PSEUDO_OP_LIST(PSEUDO_OP)
    660 #undef PSEUDO_OP
    661 #undef PSEUDO_OP_LIST
    662 
    663  private:
    664   Zone* zone_;
    665   MachineOperatorGlobalCache const& cache_;
    666   MachineRepresentation const word_;
    667   Flags const flags_;
    668   AlignmentRequirements const alignment_requirements_;
    669 
    670   DISALLOW_COPY_AND_ASSIGN(MachineOperatorBuilder);
    671 };
    672 
    673 
    674 DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags)
    675 
    676 }  // namespace compiler
    677 }  // namespace internal
    678 }  // namespace v8
    679 
    680 #endif  // V8_COMPILER_MACHINE_OPERATOR_H_
    681