]>
git.saurik.com Git - apple/javascriptcore.git/blob - dfg/DFGNodeFlags.h
   2  * Copyright (C) 2012 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   7  * 1. Redistributions of source code must retain the above copyright 
   8  *    notice, this list of conditions and the following disclaimer. 
   9  * 2. Redistributions in binary form must reproduce the above copyright 
  10  *    notice, this list of conditions and the following disclaimer in the 
  11  *    documentation and/or other materials provided with the distribution. 
  13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 
  14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR 
  17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
  21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
  26 #ifndef DFGNodeFlags_h 
  27 #define DFGNodeFlags_h 
  29 #include <wtf/Platform.h> 
  33 #include <wtf/StdLibExtras.h> 
  35 namespace JSC 
{ namespace DFG 
{ 
  37 // Entries in the NodeType enum (below) are composed of an id, a result type (possibly none) 
  38 // and some additional informative flags (must generate, is constant, etc). 
  39 #define NodeResultMask              0xF 
  40 #define NodeResultJS                0x1 
  41 #define NodeResultNumber            0x2 
  42 #define NodeResultInt32             0x3 
  43 #define NodeResultBoolean           0x4 
  44 #define NodeResultStorage           0x5 
  46 #define NodeMustGenerate           0x10 // set on nodes that have side effects, and may not trivially be removed by DCE. 
  47 #define NodeHasVarArgs             0x20 
  48 #define NodeClobbersWorld          0x40 
  49 #define NodeMightClobber           0x80 
  51 #define NodeBehaviorMask          0x300 
  52 #define NodeMayOverflow           0x100 
  53 #define NodeMayNegZero            0x200 
  55 #define NodeBackPropMask         0x1C00 
  56 #define NodeUseBottom             0x000 
  57 #define NodeUsedAsNumber          0x400 // The result of this computation may be used in a context that observes fractional results. 
  58 #define NodeNeedsNegZero          0x800 // The result of this computation may be used in a context that observes -0. 
  59 #define NodeUsedAsValue           (NodeUsedAsNumber | NodeNeedsNegZero) 
  60 #define NodeUsedAsInt            0x1000 // The result of this computation is known to be used in a context that prefers, but does not require, integer values. 
  62 typedef uint16_t NodeFlags
; 
  64 static inline bool nodeUsedAsNumber(NodeFlags flags
) 
  66     return !!(flags 
& NodeUsedAsNumber
); 
  69 static inline bool nodeCanTruncateInteger(NodeFlags flags
) 
  71     return !nodeUsedAsNumber(flags
); 
  74 static inline bool nodeCanIgnoreNegativeZero(NodeFlags flags
) 
  76     return !(flags 
& NodeNeedsNegZero
); 
  79 static inline bool nodeMayOverflow(NodeFlags flags
) 
  81     return !!(flags 
& NodeMayOverflow
); 
  84 static inline bool nodeCanSpeculateInteger(NodeFlags flags
) 
  86     if (flags 
& NodeMayOverflow
) 
  87         return !nodeUsedAsNumber(flags
); 
  89     if (flags 
& NodeMayNegZero
) 
  90         return nodeCanIgnoreNegativeZero(flags
); 
  95 const char* nodeFlagsAsString(NodeFlags
); 
  97 } } // namespace JSC::DFG 
  99 #endif // ENABLE(DFG_JIT) 
 101 #endif // DFGNodeFlags_h