DFG should assert that argument value recoveries can only be
[WebKit-https.git] / Source / JavaScriptCore / bytecode / ValueRecovery.h
index 0b3cc14d1d2efd83ec8791af65287f961d9b4b2a..007c6d3b7171d4b7ab0c2541f1040c6e8c90dba1 100644 (file)
 #include "JSValue.h"
 #include "MacroAssembler.h"
 #include "VirtualRegister.h"
-#include <wtf/Platform.h>
-
-#ifndef NDEBUG
 #include <stdio.h>
-#endif
+#include <wtf/Platform.h>
 
 namespace JSC {
 
@@ -47,6 +44,7 @@ enum ValueRecoveryTechnique {
     AlreadyInRegisterFileAsUnboxedInt32,
     AlreadyInRegisterFileAsUnboxedCell,
     AlreadyInRegisterFileAsUnboxedBoolean,
+    AlreadyInRegisterFileAsUnboxedDouble,
     // It's in a register.
     InGPR,
     UnboxedInt32InGPR,
@@ -61,6 +59,8 @@ enum ValueRecoveryTechnique {
     // It's in the register file, at a different location, and it's unboxed.
     Int32DisplacedInRegisterFile,
     DoubleDisplacedInRegisterFile,
+    CellDisplacedInRegisterFile,
+    BooleanDisplacedInRegisterFile,
     // It's a constant.
     Constant,
     // Don't know how to recover it.
@@ -102,6 +102,13 @@ public:
         return result;
     }
     
+    static ValueRecovery alreadyInRegisterFileAsUnboxedDouble()
+    {
+        ValueRecovery result;
+        result.m_technique = AlreadyInRegisterFileAsUnboxedDouble;
+        return result;
+    }
+    
     static ValueRecovery inGPR(MacroAssembler::RegisterID gpr, DataFormat dataFormat)
     {
         ASSERT(dataFormat != DataFormatNone);
@@ -158,6 +165,14 @@ public:
             result.m_technique = DoubleDisplacedInRegisterFile;
             break;
 
+        case DataFormatCell:
+            result.m_technique = CellDisplacedInRegisterFile;
+            break;
+            
+        case DataFormatBoolean:
+            result.m_technique = BooleanDisplacedInRegisterFile;
+            break;
+            
         default:
             ASSERT(dataFormat != DataFormatNone && dataFormat != DataFormatStorage);
             result.m_technique = DisplacedInRegisterFile;
@@ -177,6 +192,8 @@ public:
     
     ValueRecoveryTechnique technique() const { return m_technique; }
     
+    bool isConstant() const { return m_technique == Constant; }
+    
     bool isInRegisters() const
     {
         switch (m_technique) {
@@ -193,6 +210,20 @@ public:
         }
     }
     
+    bool isAlreadyInRegisterFile() const
+    {
+        switch (technique()) {
+        case AlreadyInRegisterFile:
+        case AlreadyInRegisterFileAsUnboxedInt32:
+        case AlreadyInRegisterFileAsUnboxedCell:
+        case AlreadyInRegisterFileAsUnboxedBoolean:
+        case AlreadyInRegisterFileAsUnboxedDouble:
+            return true;
+        default:
+            return false;
+        }
+    }
+    
     MacroAssembler::RegisterID gpr() const
     {
         ASSERT(m_technique == InGPR || m_technique == UnboxedInt32InGPR || m_technique == UnboxedBooleanInGPR || m_technique == UInt32InGPR);
@@ -221,7 +252,7 @@ public:
     
     VirtualRegister virtualRegister() const
     {
-        ASSERT(m_technique == DisplacedInRegisterFile || m_technique == Int32DisplacedInRegisterFile || m_technique == DoubleDisplacedInRegisterFile);
+        ASSERT(m_technique == DisplacedInRegisterFile || m_technique == Int32DisplacedInRegisterFile || m_technique == DoubleDisplacedInRegisterFile || m_technique == CellDisplacedInRegisterFile || m_technique == BooleanDisplacedInRegisterFile);
         return m_source.virtualReg;
     }
     
@@ -231,7 +262,6 @@ public:
         return JSValue::decode(m_source.constant);
     }
     
-#ifndef NDEBUG
     void dump(FILE* out) const
     {
         switch (technique()) {
@@ -247,6 +277,9 @@ public:
         case AlreadyInRegisterFileAsUnboxedBoolean:
             fprintf(out, "(bool)");
             break;
+        case AlreadyInRegisterFileAsUnboxedDouble:
+            fprintf(out, "(double)");
+            break;
         case InGPR:
             fprintf(out, "%%r%d", gpr());
             break;
@@ -276,6 +309,12 @@ public:
         case DoubleDisplacedInRegisterFile:
             fprintf(out, "*double(%d)", virtualRegister());
             break;
+        case CellDisplacedInRegisterFile:
+            fprintf(out, "*cell(%d)", virtualRegister());
+            break;
+        case BooleanDisplacedInRegisterFile:
+            fprintf(out, "*bool(%d)", virtualRegister());
+            break;
         case Constant:
             fprintf(out, "[%s]", constant().description());
             break;
@@ -287,7 +326,6 @@ public:
             break;
         }
     }
-#endif
     
 private:
     ValueRecoveryTechnique m_technique;