1/* 2 * Copyright (C) 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 26#ifndef DFGUseKind_h 27#define DFGUseKind_h 28 29#include <wtf/Platform.h> 30 31#if ENABLE(DFG_JIT) 32 33#include "SpeculatedType.h" 34#include <wtf/PrintStream.h> 35 36namespace JSC { namespace DFG { 37 38enum UseKind { 39 UntypedUse, 40 Int32Use, 41 KnownInt32Use, 42 RealNumberUse, 43 NumberUse, 44 KnownNumberUse, 45 BooleanUse, 46 CellUse, 47 KnownCellUse, 48 ObjectUse, 49 ObjectOrOtherUse, 50 StringUse, 51 KnownStringUse, 52 StringObjectUse, 53 StringOrStringObjectUse, 54 NotCellUse, 55 OtherUse, 56 LastUseKind // Must always be the last entry in the enum, as it is used to denote the number of enum elements. 57}; 58 59ALWAYS_INLINE SpeculatedType typeFilterFor(UseKind useKind) 60{ 61 switch (useKind) { 62 case UntypedUse: 63 return SpecEmptyOrTop; // TOP isn't good enough; untyped uses may use the normally unseen empty value, in the case of lazy registers. 64 case Int32Use: 65 case KnownInt32Use: 66 return SpecInt32; 67 case RealNumberUse: 68 return SpecRealNumber; 69 case NumberUse: 70 case KnownNumberUse: 71 return SpecNumber; 72 case BooleanUse: 73 return SpecBoolean; 74 case CellUse: 75 case KnownCellUse: 76 return SpecCell; 77 case ObjectUse: 78 return SpecObject; 79 case ObjectOrOtherUse: 80 return SpecObject | SpecOther; 81 case StringUse: 82 case KnownStringUse: 83 return SpecString; 84 case StringObjectUse: 85 return SpecStringObject; 86 case StringOrStringObjectUse: 87 return SpecString | SpecStringObject; 88 case NotCellUse: 89 return ~SpecCell; 90 case OtherUse: 91 return SpecOther; 92 default: 93 RELEASE_ASSERT_NOT_REACHED(); 94 return SpecTop; 95 } 96} 97 98ALWAYS_INLINE bool isNumerical(UseKind kind) 99{ 100 switch (kind) { 101 case Int32Use: 102 case KnownInt32Use: 103 case RealNumberUse: 104 case NumberUse: 105 return true; 106 default: 107 return false; 108 } 109} 110 111} } // namespace JSC::DFG 112 113namespace WTF { 114 115void printInternal(PrintStream&, JSC::DFG::UseKind); 116 117} // namespace WTF 118 119#endif // ENABLE(DFG_JIT) 120 121#endif // DFGUseKind_h 122 123