DFG should assert that argument value recoveries can only be
[WebKit-https.git] / Source / JavaScriptCore / bytecode / ValueRecovery.h
index d2bfe82013c0ce3da8f4a9c46b63f3f849279232..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,
@@ -55,11 +53,14 @@ enum ValueRecoveryTechnique {
     InPair,
 #endif
     InFPR,
+    UInt32InGPR,
     // It's in the register file, but at a different location.
     DisplacedInRegisterFile,
     // 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.
@@ -101,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);
@@ -118,6 +126,14 @@ public:
         return result;
     }
     
+    static ValueRecovery uint32InGPR(MacroAssembler::RegisterID gpr)
+    {
+        ValueRecovery result;
+        result.m_technique = UInt32InGPR;
+        result.m_source.gpr = gpr;
+        return result;
+    }
+    
 #if USE(JSVALUE32_64)
     static ValueRecovery inPair(MacroAssembler::RegisterID tagGPR, MacroAssembler::RegisterID payloadGPR)
     {
@@ -149,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;
@@ -168,6 +192,8 @@ public:
     
     ValueRecoveryTechnique technique() const { return m_technique; }
     
+    bool isConstant() const { return m_technique == Constant; }
+    
     bool isInRegisters() const
     {
         switch (m_technique) {
@@ -184,9 +210,23 @@ 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);
+        ASSERT(m_technique == InGPR || m_technique == UnboxedInt32InGPR || m_technique == UnboxedBooleanInGPR || m_technique == UInt32InGPR);
         return m_source.gpr;
     }
     
@@ -212,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;
     }
     
@@ -222,7 +262,6 @@ public:
         return JSValue::decode(m_source.constant);
     }
     
-#ifndef NDEBUG
     void dump(FILE* out) const
     {
         switch (technique()) {
@@ -238,6 +277,9 @@ public:
         case AlreadyInRegisterFileAsUnboxedBoolean:
             fprintf(out, "(bool)");
             break;
+        case AlreadyInRegisterFileAsUnboxedDouble:
+            fprintf(out, "(double)");
+            break;
         case InGPR:
             fprintf(out, "%%r%d", gpr());
             break;
@@ -247,8 +289,11 @@ public:
         case UnboxedBooleanInGPR:
             fprintf(out, "bool(%%r%d)", gpr());
             break;
+        case UInt32InGPR:
+            fprintf(out, "uint32(%%r%d)", gpr());
+            break;
         case InFPR:
-            fprintf(out, "%%r%d", fpr());
+            fprintf(out, "%%fr%d", fpr());
             break;
 #if USE(JSVALUE32_64)
         case InPair:
@@ -264,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;
@@ -275,7 +326,6 @@ public:
             break;
         }
     }
-#endif
     
 private:
     ValueRecoveryTechnique m_technique;