DFGNodeFlags.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  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.
  12. *
  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.
  24. */
  25. #ifndef DFGNodeFlags_h
  26. #define DFGNodeFlags_h
  27. #include <wtf/Platform.h>
  28. #if ENABLE(DFG_JIT)
  29. #include <wtf/PrintStream.h>
  30. #include <wtf/StdLibExtras.h>
  31. namespace JSC { namespace DFG {
  32. // Entries in the NodeType enum (below) are composed of an id, a result type (possibly none)
  33. // and some additional informative flags (must generate, is constant, etc).
  34. #define NodeResultMask 0x7
  35. #define NodeResultJS 0x1
  36. #define NodeResultNumber 0x2
  37. #define NodeResultInt32 0x3
  38. #define NodeResultBoolean 0x4
  39. #define NodeResultStorage 0x5
  40. #define NodeMustGenerate 0x08 // set on nodes that have side effects, and may not trivially be removed by DCE.
  41. #define NodeHasVarArgs 0x10
  42. #define NodeClobbersWorld 0x20
  43. #define NodeMightClobber 0x40
  44. #define NodeBehaviorMask 0x180
  45. #define NodeMayOverflow 0x080
  46. #define NodeMayNegZero 0x100
  47. #define NodeBackPropMask 0x1E00
  48. #define NodeUseBottom 0x0000
  49. #define NodeUsedAsNumber 0x0200 // The result of this computation may be used in a context that observes fractional, or bigger-than-int32, results.
  50. #define NodeNeedsNegZero 0x0400 // The result of this computation may be used in a context that observes -0.
  51. #define NodeUsedAsOther 0x0800 // The result of this computation may be used in a context that distinguishes between NaN and other things (like undefined).
  52. #define NodeUsedAsValue (NodeUsedAsNumber | NodeNeedsNegZero | NodeUsedAsOther)
  53. #define NodeUsedAsInt 0x1000 // The result of this computation is known to be used in a context that prefers, but does not require, integer values.
  54. #define NodeArithFlagsMask (NodeBehaviorMask | NodeBackPropMask)
  55. #define NodeDoesNotExit 0x2000 // This flag is negated to make it natural for the default to be that a node does exit.
  56. #define NodeRelevantToOSR 0x4000
  57. #define NodeExitsForward 0x8000
  58. typedef uint32_t NodeFlags;
  59. static inline bool nodeUsedAsNumber(NodeFlags flags)
  60. {
  61. return !!(flags & NodeUsedAsNumber);
  62. }
  63. static inline bool nodeCanTruncateInteger(NodeFlags flags)
  64. {
  65. return !nodeUsedAsNumber(flags);
  66. }
  67. static inline bool nodeCanIgnoreNegativeZero(NodeFlags flags)
  68. {
  69. return !(flags & NodeNeedsNegZero);
  70. }
  71. static inline bool nodeMayOverflow(NodeFlags flags)
  72. {
  73. return !!(flags & NodeMayOverflow);
  74. }
  75. static inline bool nodeCanSpeculateInteger(NodeFlags flags)
  76. {
  77. if (flags & NodeMayOverflow)
  78. return !nodeUsedAsNumber(flags);
  79. if (flags & NodeMayNegZero)
  80. return nodeCanIgnoreNegativeZero(flags);
  81. return true;
  82. }
  83. void dumpNodeFlags(PrintStream&, NodeFlags);
  84. MAKE_PRINT_ADAPTOR(NodeFlagsDump, NodeFlags, dumpNodeFlags);
  85. } } // namespace JSC::DFG
  86. #endif // ENABLE(DFG_JIT)
  87. #endif // DFGNodeFlags_h