[Lldb-commits] [lldb] r244308 - [LLDB][MIPS] Fix offsets of all register sets and add MSA regset and FRE=1 mode support

Sagar Thakur via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 6 23:39:39 PDT 2015


Author: slthakur
Date: Fri Aug  7 01:39:38 2015
New Revision: 244308

URL: http://llvm.org/viewvc/llvm-project?rev=244308&view=rev
Log:
[LLDB][MIPS] Fix offsets of all register sets and add MSA regset and FRE=1 mode support

This change :

    - Fixes offsets of all register sets for Mips.
    - Adds MSA register set and FRE=1 mode support for FP register set.
    - Separates lldb register numbers and register infos of freebsd/mips64 from linux/mips64.
    - Re-orders the register numbers of all kinds for mips to be consistent with freebsd order of register numbers.
    - Eliminates ENABLE_128_BIT_SUPPORT and union ValueData from Scalar.cpp and uses llvm::APInt and llvm::APFloat for all integer and floating point types.

Reviewers : emaste, jaydeep, clayborg
Subscribers : emaste, mohit.bhakkad, nitesh.jain, bhushan
Differential : http://reviews.llvm.org/D10919

Added:
    lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips.h
    lldb/trunk/source/Plugins/Process/Utility/lldb-mips-freebsd-register-enums.h
    lldb/trunk/source/Plugins/Process/Utility/lldb-mips-linux-register-enums.h
Removed:
    lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips64.h
    lldb/trunk/source/Plugins/Process/Utility/lldb-mips64-register-enums.h
Modified:
    lldb/trunk/include/lldb/Core/RegisterValue.h
    lldb/trunk/include/lldb/Core/Scalar.h
    lldb/trunk/include/lldb/Core/Value.h
    lldb/trunk/include/lldb/lldb-private-types.h
    lldb/trunk/source/Core/RegisterValue.cpp
    lldb/trunk/source/Core/Scalar.cpp
    lldb/trunk/source/Core/ValueObject.cpp
    lldb/trunk/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp
    lldb/trunk/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp
    lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux.cpp
    lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.cpp
    lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.h
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextFreeBSD_mips64.cpp
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.cpp
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.h
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.cpp
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.h
    lldb/trunk/source/Plugins/Process/Utility/RegisterContextPOSIX_mips64.h
    lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips.h
    lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips64.h

Modified: lldb/trunk/include/lldb/Core/RegisterValue.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/RegisterValue.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/RegisterValue.h (original)
+++ lldb/trunk/include/lldb/Core/RegisterValue.h Fri Aug  7 01:39:38 2015
@@ -19,8 +19,9 @@
 #include "lldb/lldb-public.h"
 #include "lldb/lldb-private.h"
 #include "lldb/Host/Endian.h"
+#include "llvm/ADT/APInt.h"
+#include "lldb/Core/Scalar.h"
 
-//#define ENABLE_128_BIT_SUPPORT 1
 namespace lldb_private {
 
     class RegisterValue
@@ -37,9 +38,7 @@ namespace lldb_private {
             eTypeUInt16,
             eTypeUInt32,
             eTypeUInt64,
-#if defined (ENABLE_128_BIT_SUPPORT)
             eTypeUInt128,
-#endif
             eTypeFloat,
             eTypeDouble,
             eTypeLongDouble,
@@ -49,63 +48,62 @@ namespace lldb_private {
         RegisterValue () : 
             m_type (eTypeInvalid)
         {
+            m_scalar = (unsigned long)0;
         }
 
         explicit 
         RegisterValue (uint8_t inst) : 
             m_type (eTypeUInt8)
         {
-            m_data.uint8 = inst;
+            m_scalar = inst;
         }
 
         explicit 
         RegisterValue (uint16_t inst) : 
             m_type (eTypeUInt16)
         {
-            m_data.uint16 = inst;
+            m_scalar = inst;
         }
 
         explicit 
         RegisterValue (uint32_t inst) : 
             m_type (eTypeUInt32)
         {
-            m_data.uint32 = inst;
+            m_scalar = inst;
         }
 
         explicit 
         RegisterValue (uint64_t inst) : 
             m_type (eTypeUInt64)
         {
-            m_data.uint64 = inst;
+            m_scalar = inst;
         }
 
-#if defined (ENABLE_128_BIT_SUPPORT)
         explicit 
-        RegisterValue (__uint128_t inst) : 
+        RegisterValue (llvm::APInt inst) : 
             m_type (eTypeUInt128)
         {
-            m_data.uint128 = inst;
+            m_scalar = llvm::APInt(inst);
         }
-#endif        
         explicit 
         RegisterValue (float value) : 
             m_type (eTypeFloat)
         {
-            m_data.ieee_float = value;
+            m_scalar = value;
         }
 
         explicit 
         RegisterValue (double value) : 
             m_type (eTypeDouble)
         {
-            m_data.ieee_double = value;
+            m_scalar = value;
         }
 
         explicit 
         RegisterValue (long double value) : 
             m_type (eTypeLongDouble)
         {
-            m_data.ieee_long_double = value;
+            m_scalar = value;
         }
 
         explicit 
@@ -167,7 +165,7 @@ namespace lldb_private {
             {
                 if (success_ptr)
                     *success_ptr = true;                
-                return m_data.uint8;
+                return m_scalar.UChar(fail_value);
             }
             if (success_ptr)
                 *success_ptr = true;
@@ -183,10 +181,8 @@ namespace lldb_private {
         uint64_t
         GetAsUInt64 (uint64_t fail_value = UINT64_MAX, bool *success_ptr = NULL) const;
 
-#if defined (ENABLE_128_BIT_SUPPORT)
-        __uint128_t
-        GetAsUInt128 (__uint128_t fail_value = ~((__uint128_t)0), bool *success_ptr = NULL) const;
-#endif
+        llvm::APInt
+        GetAsUInt128 (llvm::APInt& fail_value, bool *success_ptr = NULL) const;
 
         float
         GetAsFloat (float fail_value = 0.0f, bool *success_ptr = NULL) const;
@@ -219,95 +215,92 @@ namespace lldb_private {
         operator = (uint8_t uint)
         {
             m_type = eTypeUInt8;
-            m_data.uint8 = uint;
+            m_scalar = uint;
         }
 
         void
         operator = (uint16_t uint)
         {
             m_type = eTypeUInt16;
-            m_data.uint16 = uint;
+            m_scalar = uint;
         }
 
         void
         operator = (uint32_t uint)
         {
             m_type = eTypeUInt32;
-            m_data.uint32 = uint;
+            m_scalar = uint;
         }
 
         void
         operator = (uint64_t uint)
         {
             m_type = eTypeUInt64;
-            m_data.uint64 = uint;
+            m_scalar = uint;
         }
 
-#if defined (ENABLE_128_BIT_SUPPORT)
         void
-        operator = (__uint128_t uint)
+        operator = (llvm::APInt uint)
         {
             m_type = eTypeUInt128;
-            m_data.uint128 = uint;
+            m_scalar = llvm::APInt(uint); 
         }
-#endif        
+
         void
         operator = (float f)
         {
             m_type = eTypeFloat;
-            m_data.ieee_float = f;
+            m_scalar = f;
         }
 
         void
         operator = (double f)
         {
             m_type = eTypeDouble;
-            m_data.ieee_double = f;
+            m_scalar = f;
         }
 
         void
         operator = (long double f)
         {
             m_type = eTypeLongDouble;
-            m_data.ieee_long_double = f;
+            m_scalar = f;
         }
 
         void
         SetUInt8 (uint8_t uint)
         {
             m_type = eTypeUInt8;
-            m_data.uint8 = uint;
+            m_scalar = uint;
         }
 
         void
         SetUInt16 (uint16_t uint)
         {
             m_type = eTypeUInt16;
-            m_data.uint16 = uint;
+            m_scalar = uint;
         }
 
         void
         SetUInt32 (uint32_t uint, Type t = eTypeUInt32)
         {
             m_type = t;
-            m_data.uint32 = uint;
+            m_scalar = uint;
         }
 
         void
         SetUInt64 (uint64_t uint, Type t = eTypeUInt64)
         {
             m_type = t;
-            m_data.uint64 = uint;
+            m_scalar = uint;
         }
 
-#if defined (ENABLE_128_BIT_SUPPORT)
         void
-        SetUInt128 (__uint128_t uint)
+        SetUInt128 (llvm::APInt uint)
         {
             m_type = eTypeUInt128;
-            m_data.uint128 = uint;
+            m_scalar = llvm::APInt(uint);
         }
-#endif
         bool
         SetUInt (uint64_t uint, uint32_t byte_size);
     
@@ -315,21 +308,21 @@ namespace lldb_private {
         SetFloat (float f)
         {
             m_type = eTypeFloat;
-            m_data.ieee_float = f;
+            m_scalar = f;
         }
 
         void
         SetDouble (double f)
         {
             m_type = eTypeDouble;
-            m_data.ieee_double = f;
+            m_scalar = f;
         }
 
         void
         SetLongDouble (long double f)
         {
             m_type = eTypeLongDouble;
-            m_data.ieee_long_double = f;
+            m_scalar = f;
         }
 
         void
@@ -367,7 +360,7 @@ namespace lldb_private {
         GetByteOrder () const
         {
             if (m_type == eTypeBytes)
-                return m_data.buffer.byte_order;
+                return buffer.byte_order;
             return lldb::endian::InlHostByteOrder();
         }
         
@@ -386,25 +379,13 @@ namespace lldb_private {
     protected:
 
         RegisterValue::Type m_type;
-        union
+        Scalar m_scalar;
+        struct 
         {
-            uint8_t  uint8;
-            uint16_t uint16;
-            uint32_t uint32;
-            uint64_t uint64;
-#if defined (ENABLE_128_BIT_SUPPORT)
-            __uint128_t uint128;
-#endif
-            float ieee_float;
-            double ieee_double;
-            long double ieee_long_double;
-            struct 
-            {
-                uint8_t bytes[kMaxRegisterByteSize]; // This must be big enough to hold any register for any supported target.
-                uint8_t length;
-                lldb::ByteOrder byte_order;
-            } buffer;
-        } m_data;
+            uint8_t bytes[kMaxRegisterByteSize]; // This must be big enough to hold any register for any supported target.
+            uint8_t length;
+            lldb::ByteOrder byte_order;
+        } buffer;
     };
 
 } // namespace lldb_private

Modified: lldb/trunk/include/lldb/Core/Scalar.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Scalar.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Scalar.h (original)
+++ lldb/trunk/include/lldb/Core/Scalar.h Fri Aug  7 01:39:38 2015
@@ -11,6 +11,11 @@
 #define liblldb_Scalar_h_
 
 #include "lldb/lldb-private.h"
+#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/APFloat.h"
+
+#define NUM_OF_WORDS_INT128 2
+#define BITWIDTH_INT128 128
 
 namespace lldb_private {
 
@@ -26,6 +31,10 @@ public:
     enum Type
     {
         e_void = 0,
+        e_schar,
+        e_uchar,
+        e_sshort,
+        e_ushort,
         e_sint,
         e_uint,
         e_slong,
@@ -34,22 +43,74 @@ public:
         e_ulonglong,
         e_float,
         e_double,
-        e_long_double
+        e_long_double,
+        e_uint128,
+        e_sint128
     };
 
     //------------------------------------------------------------------
     // Constructors and Destructors
     //------------------------------------------------------------------
     Scalar();
-    Scalar(int v)               : m_type(e_sint),           m_data() { m_data.sint      = v; }
-    Scalar(unsigned int v)      : m_type(e_uint),           m_data() { m_data.uint      = v; }
-    Scalar(long v)              : m_type(e_slong),          m_data() { m_data.slong     = v; }
-    Scalar(unsigned long v)     : m_type(e_ulong),          m_data() { m_data.ulong     = v; }
-    Scalar(long long v)         : m_type(e_slonglong),      m_data() { m_data.slonglong = v; }
-    Scalar(unsigned long long v): m_type(e_ulonglong),      m_data() { m_data.ulonglong = v; }
-    Scalar(float v)             : m_type(e_float),          m_data() { m_data.flt       = v; }
-    Scalar(double v)            : m_type(e_double),         m_data() { m_data.dbl       = v; }
-    Scalar(long double v)       : m_type(e_long_double),    m_data() { m_data.ldbl      = v; }
+    Scalar(char v)              : m_type(e_schar),       m_float((float)0) { m_integer = llvm::APInt(sizeof(char) * 8, v, true);}
+    Scalar(unsigned char v)     : m_type(e_uchar),       m_float((float)0) { m_integer = llvm::APInt(sizeof(char) * 8, v);}
+    Scalar(short v)             : m_type(e_sshort),      m_float((float)0) { m_integer = llvm::APInt(sizeof(short) * 8, v, true);}
+    Scalar(unsigned short v)    : m_type(e_ushort),      m_float((float)0) { m_integer = llvm::APInt(sizeof(short) * 8, v);}
+    Scalar(int v)               : m_type(e_sint),        m_float((float)0) { m_integer = llvm::APInt(sizeof(int) * 8, v, true);}
+    Scalar(unsigned int v)      : m_type(e_uint),        m_float((float)0) { m_integer = llvm::APInt(sizeof(int) * 8, v);}
+    Scalar(long v)              : m_type(e_slong),       m_float((float)0) { m_integer = llvm::APInt(sizeof(long) * 8, v, true);}
+    Scalar(unsigned long v)     : m_type(e_ulong),       m_float((float)0) { m_integer = llvm::APInt(sizeof(long) * 8, v);}
+    Scalar(long long v)         : m_type(e_slonglong),   m_float((float)0) { m_integer = llvm::APInt(sizeof(long long) * 8, v, true);}
+    Scalar(unsigned long long v): m_type(e_ulonglong),   m_float((float)0) { m_integer = llvm::APInt(sizeof(long long) * 8, v);}
+    Scalar(float v)             : m_type(e_float),       m_float(v) { m_float   = llvm::APFloat(v); }
+    Scalar(double v)            : m_type(e_double),      m_float(v) { m_float   = llvm::APFloat(v); }
+    Scalar(long double v, bool ieee_quad) 
+        : m_type(e_long_double), m_float((float)0), m_ieee_quad(ieee_quad)
+        {
+            if(ieee_quad)
+                m_float = llvm::APFloat(llvm::APFloat::IEEEquad, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
+            else
+                m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
+        }
+    Scalar(llvm::APInt v) : 
+        m_type(),
+        m_float((float)0)
+        {
+            m_integer = llvm::APInt(v);
+            switch(m_integer.getBitWidth())
+            {
+            case 8:
+                if(m_integer.isSignedIntN(sizeof(schar_t) * 8))
+                    m_type = e_schar;
+                else
+                    m_type = e_uchar;
+                break;
+            case 16:
+                if(m_integer.isSignedIntN(sizeof(sshort_t) * 8))
+                    m_type = e_sshort;
+                else
+                    m_type = e_ushort;
+                break;
+            case 32:
+                if(m_integer.isSignedIntN(sizeof(sint_t) * 8))
+                    m_type = e_sint;
+                else
+                    m_type = e_uint;
+                break;
+            case 64:
+                if(m_integer.isSignedIntN(sizeof(slonglong_t) * 8))
+                    m_type = e_slonglong;
+                else
+                    m_type = e_ulonglong;
+                break;
+            case 128:
+                if(m_integer.isSignedIntN(BITWIDTH_INT128))
+                    m_type = e_sint128;
+                else
+                    m_type = e_uint128;
+                break;
+            }
+        }
     Scalar(const Scalar& rhs);
     //Scalar(const RegisterValue& reg_value);
     virtual ~Scalar();
@@ -61,15 +122,18 @@ public:
     ExtractBitfield (uint32_t bit_size, 
                      uint32_t bit_offset);
 
+    bool
+    SetBit(uint32_t bit);
+
+    bool
+    ClearBit(uint32_t bit);
+
+    void *
+    GetBytes() const;
+
     size_t
     GetByteSize() const;
 
-    static size_t
-    GetMaxByteSize()
-    {
-        return sizeof(ValueData);
-    }
-
     bool
     GetData (DataExtractor &data, size_t limit_byte_size = UINT32_MAX) const;
 
@@ -83,7 +147,7 @@ public:
     IsZero() const;
 
     void
-    Clear() { m_type = e_void; m_data.ulonglong = 0; }
+    Clear() { m_type = e_void; m_integer.clearAllBits(); }
 
     const char *
     GetTypeAsCString() const;
@@ -94,7 +158,7 @@ public:
     bool
     IsValid() const
     {
-        return (m_type >= e_sint) && (m_type <= e_long_double);
+        return (m_type >= e_schar) && (m_type <= e_long_double);
     }
 
     bool
@@ -124,6 +188,10 @@ public:
     // need to be created. As a result, we currently don't need a variety of
     // overloaded set value accessors.
     //----------------------------------------------------------------------
+    Scalar& operator= (char v);
+    Scalar& operator= (unsigned char v);
+    Scalar& operator= (short v);
+    Scalar& operator= (unsigned short v);
     Scalar& operator= (const int i);
     Scalar& operator= (unsigned int v);
     Scalar& operator= (long v);
@@ -133,6 +201,7 @@ public:
     Scalar& operator= (float v);
     Scalar& operator= (double v);
     Scalar& operator= (long double v);
+    Scalar& operator= (llvm::APInt v);
     Scalar& operator= (const Scalar& rhs);      // Assignment operator
     Scalar& operator+= (const Scalar& rhs);
     Scalar& operator<<= (const Scalar& rhs);    // Shift left
@@ -194,6 +263,18 @@ public:
     unsigned long long
     RawULongLong () const;
 
+    unsigned char
+    UChar(unsigned char fail_value = 0) const;
+
+    char
+    SChar(char fail_value = 0) const;
+
+    unsigned short 
+    UShort(unsigned short fail_value = 0) const;
+
+    short
+    SShort(short fail_value = 0) const;
+
     unsigned int
     UInt(unsigned int fail_value = 0) const;
 
@@ -209,6 +290,12 @@ public:
     unsigned long long
     ULongLong(unsigned long long fail_value = 0) const;
 
+    llvm::APInt
+    SInt128(llvm::APInt& fail_value) const;
+
+    llvm::APInt 
+    UInt128(llvm::APInt& fail_value) const;
+
     float
     Float(float fail_value = 0.0f) const;
 
@@ -255,6 +342,10 @@ public:
     }
 
 protected:
+    typedef char                schar_t;
+    typedef unsigned char       uchar_t;
+    typedef short               sshort_t;
+    typedef unsigned short      ushort_t;
     typedef int                 sint_t;
     typedef unsigned int        uint_t;
     typedef long                slong_t;
@@ -265,24 +356,13 @@ protected:
     typedef double              double_t;
     typedef long double         long_double_t;
     
-    union ValueData
-    {
-        int                 sint;
-        unsigned int        uint;
-        long                slong;
-        unsigned long       ulong;
-        long long           slonglong;
-        unsigned long long  ulonglong;
-        float               flt;
-        double              dbl;
-        long double         ldbl;
-    };
-
     //------------------------------------------------------------------
     // Classes that inherit from Scalar can see and modify these
     //------------------------------------------------------------------
     Scalar::Type m_type;
-    ValueData m_data;
+    llvm::APInt m_integer;
+    llvm::APFloat m_float;
+    bool m_ieee_quad = false;
 
 private:
     friend const Scalar operator+   (const Scalar& lhs, const Scalar& rhs);

Modified: lldb/trunk/include/lldb/Core/Value.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Value.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Value.h (original)
+++ lldb/trunk/include/lldb/Core/Value.h Fri Aug  7 01:39:38 2015
@@ -101,6 +101,7 @@ public:
         // Casts a vector, if valid, to an unsigned int of matching or largest supported size.
         // Truncates to the beginning of the vector if required.
         // Returns a default constructed Scalar if the Vector data is internally inconsistent.
+        llvm::APInt rhs = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)bytes)->x);
         Scalar 
 		GetAsScalar() const 
 		{
@@ -111,11 +112,7 @@ public:
                 else if (length == 2) scalar = *(const uint16_t *)bytes;
                 else if (length == 4) scalar = *(const uint32_t *)bytes;
                 else if (length == 8) scalar = *(const uint64_t *)bytes;
-#if defined (ENABLE_128_BIT_SUPPORT)
-                else if (length >= 16) scalar = *(const __uint128_t *)bytes;
-#else
-                else if (length >= 16) scalar = *(const uint64_t *)bytes;
-#endif
+                else if (length >= 16) scalar = rhs;
             }
             return scalar;
         }

Modified: lldb/trunk/include/lldb/lldb-private-types.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-types.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-private-types.h (original)
+++ lldb/trunk/include/lldb/lldb-private-types.h Fri Aug  7 01:39:38 2015
@@ -102,6 +102,8 @@ namespace lldb_private
                                                  // pass it.
     };
 
+    typedef struct type128 { uint64_t x[2]; } type128;
+
 } // namespace lldb_private
 
 #endif  // #if defined(__cplusplus)

Modified: lldb/trunk/source/Core/RegisterValue.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/RegisterValue.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Core/RegisterValue.cpp (original)
+++ lldb/trunk/source/Core/RegisterValue.cpp Fri Aug  7 01:39:38 2015
@@ -215,10 +215,10 @@ RegisterValue::SetFromMemoryData (const
     }
     else if (value_type == eTypeBytes)
     {
-        m_data.buffer.byte_order = src_byte_order;
+        buffer.byte_order = src_byte_order;
         // Make sure to set the buffer length of the destination buffer to avoid
-        // problems due to uninitialized variables.
-        m_data.buffer.length = src_len;
+        // problems due to uninitalized variables.
+        buffer.length = src_len;
     }
 
     const uint32_t bytes_copied = src_data.CopyByteOrderedData (0,               // src offset
@@ -240,25 +240,23 @@ RegisterValue::GetScalarValue (Scalar &s
         case eTypeInvalid:      break;
         case eTypeBytes:
         {
-            switch (m_data.buffer.length)
+            switch (buffer.length)
             {
             default:    break;
-            case 1:     scalar = m_data.uint8; return true;
-            case 2:     scalar = m_data.uint16; return true;
-            case 4:     scalar = m_data.uint32; return true;
-            case 8:     scalar = m_data.uint64; return true;
+            case 1:     scalar = *(uint8_t *)buffer.bytes; return true;
+            case 2:     scalar = *(uint16_t *)buffer.bytes; return true;
+            case 4:     scalar = *(uint32_t *)buffer.bytes; return true;
+            case 8:     scalar = *(uint64_t *)buffer.bytes; return true;
             }
         }
-        case eTypeUInt8:        scalar = m_data.uint8; return true;
-        case eTypeUInt16:       scalar = m_data.uint16; return true;
-        case eTypeUInt32:       scalar = m_data.uint32; return true;
-        case eTypeUInt64:       scalar = m_data.uint64; return true;
-#if defined (ENABLE_128_BIT_SUPPORT)
-        case eTypeUInt128:      break;
-#endif
-        case eTypeFloat:        scalar = m_data.ieee_float; return true;
-        case eTypeDouble:       scalar = m_data.ieee_double; return true;
-        case eTypeLongDouble:   scalar = m_data.ieee_long_double; return true;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble:   scalar = m_scalar; return true;
     }
     return false;
 }
@@ -289,10 +287,8 @@ RegisterValue::SetType (const RegisterIn
                 m_type = eTypeUInt32;
             else if (byte_size <= 8)
                 m_type = eTypeUInt64;
-#if defined (ENABLE_128_BIT_SUPPORT)
             else if (byte_size <= 16)
                 m_type = eTypeUInt128;
-#endif
             break;
 
         case eEncodingIEEE754:
@@ -342,8 +338,9 @@ RegisterValue::SetValueFromData (const R
         src_len = reg_info->byte_size;
 
     // Zero out the value in case we get partial data...
-    memset (m_data.buffer.bytes, 0, sizeof (m_data.buffer.bytes));
-    
+    memset (buffer.bytes, 0, sizeof (buffer.bytes));
+   
+    type128 int128; 
     switch (SetType (reg_info))
     {
         case eTypeInvalid:
@@ -353,33 +350,36 @@ RegisterValue::SetValueFromData (const R
         case eTypeUInt16:   SetUInt16 (src.GetMaxU32 (&src_offset, src_len)); break;
         case eTypeUInt32:   SetUInt32 (src.GetMaxU32 (&src_offset, src_len)); break;
         case eTypeUInt64:   SetUInt64 (src.GetMaxU64 (&src_offset, src_len)); break;
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
             {
-                __uint128_t data1 = src.GetU64 (&src_offset);
-                __uint128_t data2 = src.GetU64 (&src_offset);
                 if (src.GetByteSize() == eByteOrderBig)
-                    SetUInt128 (data1 << 64 + data2);
+                {
+                    int128.x[1] = src.GetU64 (&src_offset + 1);
+                    int128.x[0] = src.GetU64 (&src_offset);
+                }
                 else
-                    SetUInt128 (data2 << 64 + data1);
+                {
+                    int128.x[0] = src.GetU64 (&src_offset);
+                    int128.x[1] = src.GetU64 (&src_offset + 1);
+                }
+                SetUInt128 (llvm::APInt(128, 2, int128.x));
             }
             break;
-#endif
         case eTypeFloat:        SetFloat (src.GetFloat (&src_offset));      break;
         case eTypeDouble:       SetDouble(src.GetDouble (&src_offset));     break;
         case eTypeLongDouble:   SetFloat (src.GetLongDouble (&src_offset)); break;
         case eTypeBytes:
         {
-            m_data.buffer.length = reg_info->byte_size;
-            m_data.buffer.byte_order = src.GetByteOrder();
-            assert (m_data.buffer.length <= kMaxRegisterByteSize);
-            if (m_data.buffer.length > kMaxRegisterByteSize)
-                m_data.buffer.length = kMaxRegisterByteSize;
+            buffer.length = reg_info->byte_size;
+            buffer.byte_order = src.GetByteOrder();
+            assert (buffer.length <= kMaxRegisterByteSize);
+            if (buffer.length > kMaxRegisterByteSize)
+                buffer.length = kMaxRegisterByteSize;
             if (src.CopyByteOrderedData (src_offset,                    // offset within "src" to start extracting data
                                          src_len,                       // src length
-                                         m_data.buffer.bytes,           // dst buffer
-                                         m_data.buffer.length,          // dst length
-                                         m_data.buffer.byte_order) == 0)// dst byte order
+                                         buffer.bytes,           // dst buffer
+                                         buffer.length,          // dst length
+                                         buffer.byte_order) == 0)// dst byte order
             {
                 error.SetErrorString ("data copy failed data.");
                 return error;
@@ -459,6 +459,9 @@ RegisterValue::SetValueFromCString (cons
     }
     bool success = false;
     const uint32_t byte_size = reg_info->byte_size;
+    static float flt_val;
+    static double dbl_val;
+    static long double ldbl_val;
     switch (reg_info->encoding)
     {
         case eEncodingInvalid:
@@ -510,22 +513,31 @@ RegisterValue::SetValueFromCString (cons
         case eEncodingIEEE754:
             if (byte_size == sizeof (float))
             {
-                if (::sscanf (value_str, "%f", &m_data.ieee_float) == 1)
+                if (::sscanf (value_str, "%f", &flt_val) == 1)
+                {
+                    m_scalar = flt_val;
                     m_type = eTypeFloat;
+                }
                 else
                     error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
             }
             else if (byte_size == sizeof (double))
             {
-                if (::sscanf (value_str, "%lf", &m_data.ieee_double) == 1)
+                if (::sscanf (value_str, "%lf", &dbl_val) == 1)
+                {
+                    m_scalar = dbl_val;
                     m_type = eTypeDouble;
+                }
                 else
                     error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
             }
             else if (byte_size == sizeof (long double))
             {
-                if (::sscanf (value_str, "%Lf", &m_data.ieee_long_double) == 1)
+                if (::sscanf (value_str, "%Lf", &ldbl_val) == 1)
+                {
+                    m_scalar = ldbl_val;
                     m_type = eTypeLongDouble;
+                }
                 else
                     error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
             }
@@ -557,81 +569,11 @@ RegisterValue::SignExtend (uint32_t sign
             break;
 
         case eTypeUInt8:        
-            if (sign_bitpos == (8-1))
-                return true;
-            else if (sign_bitpos < (8-1))
-            {
-                uint8_t sign_bit = 1u << sign_bitpos;
-                if (m_data.uint8 & sign_bit)
-                {
-                    const uint8_t mask = ~(sign_bit) + 1u;
-                    m_data.uint8 |= mask;
-                }
-                return true;
-            }
-            break;
-
         case eTypeUInt16:
-            if (sign_bitpos == (16-1))
-                return true;
-            else if (sign_bitpos < (16-1))
-            {
-                uint16_t sign_bit = 1u << sign_bitpos;
-                if (m_data.uint16 & sign_bit)
-                {
-                    const uint16_t mask = ~(sign_bit) + 1u;
-                    m_data.uint16 |= mask;
-                }
-                return true;
-            }
-            break;
-        
         case eTypeUInt32:
-            if (sign_bitpos == (32-1))
-                return true;
-            else if (sign_bitpos < (32-1))
-            {
-                uint32_t sign_bit = 1u << sign_bitpos;
-                if (m_data.uint32 & sign_bit)
-                {
-                    const uint32_t mask = ~(sign_bit) + 1u;
-                    m_data.uint32 |= mask;
-                }
-                return true;
-            }
-            break;
-
         case eTypeUInt64:
-            if (sign_bitpos == (64-1))
-                return true;
-            else if (sign_bitpos < (64-1))
-            {
-                uint64_t sign_bit = 1ull << sign_bitpos;
-                if (m_data.uint64 & sign_bit)
-                {
-                    const uint64_t mask = ~(sign_bit) + 1ull;
-                    m_data.uint64 |= mask;
-                }
-                return true;
-            }
-            break;
-
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
-            if (sign_bitpos == (128-1))
-                return true;
-            else if (sign_bitpos < (128-1))
-            {
-                __uint128_t sign_bit = (__uint128_t)1u << sign_bitpos;
-                if (m_data.uint128 & sign_bit)
-                {
-                    const uint128_t mask = ~(sign_bit) + 1u;
-                    m_data.uint128 |= mask;
-                }
-                return true;
-            }
-            break;
-#endif
+            return m_scalar.SignExtend(sign_bitpos);
         case eTypeFloat:
         case eTypeDouble:
         case eTypeLongDouble:
@@ -649,21 +591,19 @@ RegisterValue::CopyValue (const Register
     {
         case eTypeInvalid: 
             return false;
-        case eTypeUInt8:        m_data.uint8 = rhs.m_data.uint8; break;
-        case eTypeUInt16:       m_data.uint16 = rhs.m_data.uint16; break;
-        case eTypeUInt32:       m_data.uint32 = rhs.m_data.uint32; break;
-        case eTypeUInt64:       m_data.uint64 = rhs.m_data.uint64; break;
-#if defined (ENABLE_128_BIT_SUPPORT)
-        case eTypeUInt128:      m_data.uint128 = rhs.m_data.uint128; break;
-#endif
-        case eTypeFloat:        m_data.ieee_float = rhs.m_data.ieee_float; break;
-        case eTypeDouble:       m_data.ieee_double = rhs.m_data.ieee_double; break;
-        case eTypeLongDouble:   m_data.ieee_long_double = rhs.m_data.ieee_long_double; break;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble:   m_scalar = rhs.m_scalar; break;
         case eTypeBytes:        
-            assert (rhs.m_data.buffer.length <= kMaxRegisterByteSize);
-            ::memcpy (m_data.buffer.bytes, rhs.m_data.buffer.bytes, kMaxRegisterByteSize);
-            m_data.buffer.length = rhs.m_data.buffer.length;
-            m_data.buffer.byte_order = rhs.m_data.buffer.byte_order;
+            assert (rhs.buffer.length <= kMaxRegisterByteSize);
+            ::memcpy (buffer.bytes, rhs.buffer.bytes, kMaxRegisterByteSize);
+            buffer.length = rhs.buffer.length;
+            buffer.byte_order = rhs.buffer.byte_order;
             break;
     }
     return true;
@@ -678,15 +618,15 @@ RegisterValue::GetAsUInt16 (uint16_t fai
     switch (m_type)
     {
         default:            break;
-        case eTypeUInt8:    return m_data.uint8;
-        case eTypeUInt16:   return m_data.uint16;
+        case eTypeUInt8:
+        case eTypeUInt16:   return m_scalar.UShort(fail_value);
         case eTypeBytes:
         {
-            switch (m_data.buffer.length)
+            switch (buffer.length)
             {
             default:    break;
-            case 1:     return m_data.uint8;
-            case 2:     return m_data.uint16;
+            case 1:
+            case 2:     return *(uint16_t *)buffer.bytes;
             }
         }
         break;
@@ -704,29 +644,20 @@ RegisterValue::GetAsUInt32 (uint32_t fai
     switch (m_type)
     {
         default:            break;
-        case eTypeUInt8:    return m_data.uint8;
-        case eTypeUInt16:   return m_data.uint16;
-        case eTypeUInt32:   return m_data.uint32;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
         case eTypeFloat:
-            if (sizeof(float) == sizeof(uint32_t))
-                return m_data.uint32;
-            break;
         case eTypeDouble:
-            if (sizeof(double) == sizeof(uint32_t))
-                return m_data.uint32;
-            break;
-        case eTypeLongDouble:
-            if (sizeof(long double) == sizeof(uint32_t))
-                return m_data.uint32;
-            break;
+        case eTypeLongDouble:   return m_scalar.UInt(fail_value);
         case eTypeBytes:
         {
-            switch (m_data.buffer.length)
+            switch (buffer.length)
             {
             default:    break;
-            case 1:     return m_data.uint8;
-            case 2:     return m_data.uint16;
-            case 4:     return m_data.uint32;
+            case 1:
+            case 2:
+            case 4:     return *(uint32_t *)buffer.bytes;
             }
         }
         break;
@@ -744,31 +675,22 @@ RegisterValue::GetAsUInt64 (uint64_t fai
     switch (m_type)
     {
         default:            break;
-        case eTypeUInt8:    return m_data.uint8;
-        case eTypeUInt16:   return m_data.uint16;
-        case eTypeUInt32:   return m_data.uint32;
-        case eTypeUInt64:   return m_data.uint64;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
         case eTypeFloat:
-            if (sizeof(float) == sizeof(uint64_t))
-                return m_data.uint64;
-            break;
         case eTypeDouble:
-            if (sizeof(double) == sizeof(uint64_t))
-                return m_data.uint64;
-            break;
-        case eTypeLongDouble:
-            if (sizeof(long double) == sizeof(uint64_t))
-                return m_data.uint64;
-            break;
+        case eTypeLongDouble: return m_scalar.ULongLong(fail_value);
         case eTypeBytes:
         {
-            switch (m_data.buffer.length)
+            switch (buffer.length)
             {
             default:    break;
-            case 1:     return m_data.uint8;
-            case 2:     return m_data.uint16;
-            case 4:     return m_data.uint32;
-            case 8:     return m_data.uint64;
+            case 1:
+            case 2:
+            case 4:
+            case 8:     return *(uint64_t *)buffer.bytes;
             }
         }
         break;
@@ -778,43 +700,36 @@ RegisterValue::GetAsUInt64 (uint64_t fai
     return fail_value;
 }
 
-#if defined (ENABLE_128_BIT_SUPPORT)
-__uint128_t
-RegisterValue::GetAsUInt128 (__uint128_t fail_value, bool *success_ptr) const
+llvm::APInt 
+RegisterValue::GetAsUInt128 (llvm::APInt& fail_value, bool *success_ptr) const
 {
     if (success_ptr)
         *success_ptr = true;
     switch (m_type)
     {
         default:            break;
-        case eTypeUInt8:    return m_data.uint8;
-        case eTypeUInt16:   return m_data.uint16;
-        case eTypeUInt32:   return m_data.uint32;
-        case eTypeUInt64:   return m_data.uint64;
-        case eTypeUInt128:  return m_data.uint128;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
         case eTypeFloat:
-            if (sizeof(float) == sizeof(__uint128_t))
-                return m_data.uint128;
-            break;
         case eTypeDouble:
-            if (sizeof(double) == sizeof(__uint128_t))
-                return m_data.uint128;
-            break;
-        case eTypeLongDouble:
-            if (sizeof(long double) == sizeof(__uint128_t))
-                return m_data.uint128;
-            break;
+        case eTypeLongDouble:  return m_scalar.UInt128(fail_value);
         case eTypeBytes:
         {
-            switch (m_data.buffer.length)
+            switch (buffer.length)
             {
-            default:
-                break;
-            case 1:     return m_data.uint8;
-            case 2:     return m_data.uint16;
-            case 4:     return m_data.uint32;
-            case 8:     return m_data.uint64;
-            case 16:    return m_data.uint128;
+                default:
+                    break;
+                case 1:
+                case 2:
+                case 4:
+                case 8:
+                case 16:
+                {
+                    return llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)buffer.bytes)->x);
+                }
             }
         }
         break;
@@ -823,7 +738,7 @@ RegisterValue::GetAsUInt128 (__uint128_t
         *success_ptr = false;
     return fail_value;
 }
-#endif
+
 float
 RegisterValue::GetAsFloat (float fail_value, bool *success_ptr) const
 {
@@ -833,28 +748,12 @@ RegisterValue::GetAsFloat (float fail_va
     {
         default:            break;
         case eTypeUInt32:
-            if (sizeof(float) == sizeof(m_data.uint32))
-                return m_data.ieee_float;
-            break;
         case eTypeUInt64:
-            if (sizeof(float) == sizeof(m_data.uint64))
-                return m_data.ieee_float;
-            break;
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
-            if (sizeof(float) == sizeof(m_data.uint128))
-                return m_data.ieee_float;
-            break;
-#endif
-        case eTypeFloat:    return m_data.ieee_float;
+        case eTypeFloat:
         case eTypeDouble:
-            if (sizeof(float) == sizeof(double))
-                return m_data.ieee_float;
-            break;
         case eTypeLongDouble:
-            if (sizeof(float) == sizeof(long double))
-                return m_data.ieee_float;
-            break;
+            return m_scalar.Float(fail_value);
     }
     if (success_ptr)
         *success_ptr = false;
@@ -872,27 +771,12 @@ RegisterValue::GetAsDouble (double fail_
             break;
             
         case eTypeUInt32:
-            if (sizeof(double) == sizeof(m_data.uint32))
-                return m_data.ieee_double;
-            break;
-            
         case eTypeUInt64:
-            if (sizeof(double) == sizeof(m_data.uint64))
-                return m_data.ieee_double;
-            break;
-            
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
-            if (sizeof(double) == sizeof(m_data.uint128))
-                return m_data.ieee_double;
-#endif
-        case eTypeFloat:    return m_data.ieee_float;
-        case eTypeDouble:   return m_data.ieee_double;
-            
+        case eTypeFloat:
+        case eTypeDouble:
         case eTypeLongDouble:
-            if (sizeof(double) == sizeof(long double))
-                return m_data.ieee_double;
-            break;
+            return m_scalar.Double(fail_value);
     }
     if (success_ptr)
         *success_ptr = false;
@@ -910,24 +794,12 @@ RegisterValue::GetAsLongDouble (long dou
             break;
             
         case eTypeUInt32:
-            if (sizeof(long double) == sizeof(m_data.uint32))
-                return m_data.ieee_long_double;
-            break;
-            
         case eTypeUInt64:
-            if (sizeof(long double) == sizeof(m_data.uint64))
-                return m_data.ieee_long_double;
-            break;
-            
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
-            if (sizeof(long double) == sizeof(m_data.uint128))
-                return m_data.ieee_long_double;
-#endif
-        case eTypeFloat:        return m_data.ieee_float;
-        case eTypeDouble:       return m_data.ieee_double;
-        case eTypeLongDouble:   return m_data.ieee_long_double;
-            break;
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble:
+            return m_scalar.LongDouble();
     }
     if (success_ptr)
         *success_ptr = false;
@@ -940,17 +812,15 @@ RegisterValue::GetBytes () const
     switch (m_type)
     {
         case eTypeInvalid:      break;
-        case eTypeUInt8:        return &m_data.uint8;
-        case eTypeUInt16:       return &m_data.uint16;
-        case eTypeUInt32:       return &m_data.uint32;
-        case eTypeUInt64:       return &m_data.uint64;
-#if defined (ENABLE_128_BIT_SUPPORT)
-        case eTypeUInt128:      return &m_data.uint128;
-#endif
-        case eTypeFloat:        return &m_data.ieee_float;
-        case eTypeDouble:       return &m_data.ieee_double;
-        case eTypeLongDouble:   return &m_data.ieee_long_double;
-        case eTypeBytes:        return m_data.buffer.bytes;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble:   return m_scalar.GetBytes();
+        case eTypeBytes:        return buffer.bytes;
     }
     return NULL;
 }
@@ -961,17 +831,15 @@ RegisterValue::GetBytes ()
     switch (m_type)
     {
         case eTypeInvalid:      break;
-        case eTypeUInt8:        return &m_data.uint8;
-        case eTypeUInt16:       return &m_data.uint16;
-        case eTypeUInt32:       return &m_data.uint32;
-        case eTypeUInt64:       return &m_data.uint64;
-#if defined (ENABLE_128_BIT_SUPPORT)
-        case eTypeUInt128:      return &m_data.uint128;
-#endif
-        case eTypeFloat:        return &m_data.ieee_float;
-        case eTypeDouble:       return &m_data.ieee_double;
-        case eTypeLongDouble:   return &m_data.ieee_long_double;
-        case eTypeBytes:        return m_data.buffer.bytes;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble:   return m_scalar.GetBytes();
+        case eTypeBytes:        return buffer.bytes;
     }
     return NULL;
 }
@@ -982,17 +850,15 @@ RegisterValue::GetByteSize () const
     switch (m_type)
     {
         case eTypeInvalid: break;
-        case eTypeUInt8:        return sizeof(m_data.uint8);
-        case eTypeUInt16:       return sizeof(m_data.uint16);
-        case eTypeUInt32:       return sizeof(m_data.uint32);
-        case eTypeUInt64:       return sizeof(m_data.uint64);
-#if defined (ENABLE_128_BIT_SUPPORT)
-        case eTypeUInt128:      return sizeof(m_data.uint128);
-#endif
-        case eTypeFloat:        return sizeof(m_data.ieee_float);
-        case eTypeDouble:       return sizeof(m_data.ieee_double);
-        case eTypeLongDouble:   return sizeof(m_data.ieee_long_double);
-        case eTypeBytes: return m_data.buffer.length;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble: return m_scalar.GetByteSize();
+        case eTypeBytes: return buffer.length;
     }
     return 0;
 }
@@ -1021,12 +887,10 @@ RegisterValue::SetUInt (uint64_t uint, u
     {
         SetUInt64 (uint);
     }
-#if defined (ENABLE_128_BIT_SUPPORT)
     else if (byte_size <= 16)
     {
-        SetUInt128 (uint);
+        SetUInt128 (llvm::APInt(64, uint));
     }
-#endif
     else
         return false;
     return true;
@@ -1036,21 +900,21 @@ void
 RegisterValue::SetBytes (const void *bytes, size_t length, lldb::ByteOrder byte_order)
 {
     // If this assertion fires off we need to increase the size of
-    // m_data.buffer.bytes, or make it something that is allocated on
+    // buffer.bytes, or make it something that is allocated on
     // the heap. Since the data buffer is in a union, we can't make it
     // a collection class like SmallVector...
     if (bytes && length > 0)
     {
-        assert (length <= sizeof (m_data.buffer.bytes) && "Storing too many bytes in a RegisterValue.");
+        assert (length <= sizeof (buffer.bytes) && "Storing too many bytes in a RegisterValue.");
         m_type = eTypeBytes;
-        m_data.buffer.length = length;
-        memcpy (m_data.buffer.bytes, bytes, length);
-        m_data.buffer.byte_order = byte_order;
+        buffer.length = length;
+        memcpy (buffer.bytes, bytes, length);
+        buffer.byte_order = byte_order;
     }
     else
     {
         m_type = eTypeInvalid;
-        m_data.buffer.length = 0;
+        buffer.length = 0;
     }
 }
 
@@ -1063,25 +927,23 @@ RegisterValue::operator == (const Regist
         switch (m_type)
         {
             case eTypeInvalid:      return true;
-            case eTypeUInt8:        return m_data.uint8 == rhs.m_data.uint8;
-            case eTypeUInt16:       return m_data.uint16 == rhs.m_data.uint16;
-            case eTypeUInt32:       return m_data.uint32 == rhs.m_data.uint32;
-            case eTypeUInt64:       return m_data.uint64 == rhs.m_data.uint64;
-#if defined (ENABLE_128_BIT_SUPPORT)
-            case eTypeUInt128:      return m_data.uint128 == rhs.m_data.uint128;
-#endif
-            case eTypeFloat:        return m_data.ieee_float == rhs.m_data.ieee_float;
-            case eTypeDouble:       return m_data.ieee_double == rhs.m_data.ieee_double;
-            case eTypeLongDouble:   return m_data.ieee_long_double == rhs.m_data.ieee_long_double;
+            case eTypeUInt8:
+            case eTypeUInt16:
+            case eTypeUInt32:
+            case eTypeUInt64:
+            case eTypeUInt128:
+            case eTypeFloat:
+            case eTypeDouble:
+            case eTypeLongDouble:   return m_scalar == rhs.m_scalar;
             case eTypeBytes:        
-                if (m_data.buffer.length != rhs.m_data.buffer.length)
+                if (buffer.length != rhs.buffer.length)
                     return false;
                 else
                 {
-                    uint8_t length = m_data.buffer.length;
+                    uint8_t length = buffer.length;
                     if (length > kMaxRegisterByteSize)
                         length = kMaxRegisterByteSize;
-                    return memcmp (m_data.buffer.bytes, rhs.m_data.buffer.bytes, length) == 0;
+                    return memcmp (buffer.bytes, rhs.buffer.bytes, length) == 0;
                 }
                 break;
         }
@@ -1097,27 +959,25 @@ RegisterValue::operator != (const Regist
     switch (m_type)
     {
         case eTypeInvalid:      return false;
-        case eTypeUInt8:        return m_data.uint8 != rhs.m_data.uint8;
-        case eTypeUInt16:       return m_data.uint16 != rhs.m_data.uint16;
-        case eTypeUInt32:       return m_data.uint32 != rhs.m_data.uint32;
-        case eTypeUInt64:       return m_data.uint64 != rhs.m_data.uint64;
-#if defined (ENABLE_128_BIT_SUPPORT)
-        case eTypeUInt128:      return m_data.uint128 != rhs.m_data.uint128;
-#endif
-        case eTypeFloat:        return m_data.ieee_float != rhs.m_data.ieee_float;
-        case eTypeDouble:       return m_data.ieee_double != rhs.m_data.ieee_double;
-        case eTypeLongDouble:   return m_data.ieee_long_double != rhs.m_data.ieee_long_double;
+        case eTypeUInt8:
+        case eTypeUInt16:
+        case eTypeUInt32:
+        case eTypeUInt64:
+        case eTypeUInt128:
+        case eTypeFloat:
+        case eTypeDouble:
+        case eTypeLongDouble:   return m_scalar != rhs.m_scalar;
         case eTypeBytes:        
-            if (m_data.buffer.length != rhs.m_data.buffer.length)
+            if (buffer.length != rhs.buffer.length)
             {
                 return true;
             }
             else
             {
-                uint8_t length = m_data.buffer.length;
+                uint8_t length = buffer.length;
                 if (length > kMaxRegisterByteSize)
                     length = kMaxRegisterByteSize;
-                return memcmp (m_data.buffer.bytes, rhs.m_data.buffer.bytes, length) != 0;
+                return memcmp (buffer.bytes, rhs.buffer.bytes, length) != 0;
             }
             break;
     }
@@ -1132,63 +992,35 @@ RegisterValue::ClearBit (uint32_t bit)
         case eTypeInvalid:
             break;
 
-        case eTypeUInt8:        
-            if (bit < 8)
-            {
-                m_data.uint8 &= ~(1u << bit);
-                return true;
-            }
-            break;
-            
+        case eTypeUInt8:
         case eTypeUInt16:
-            if (bit < 16)
-            {
-                m_data.uint16 &= ~(1u << bit);
-                return true;
-            }
-            break;
-
         case eTypeUInt32:
-            if (bit < 32)
-            {
-                m_data.uint32 &= ~(1u << bit);
-                return true;
-            }
-            break;
-            
         case eTypeUInt64:
-            if (bit < 64)
-            {
-                m_data.uint64 &= ~(1ull << (uint64_t)bit);
-                return true;
-            }
-            break;
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
-            if (bit < 64)
+            if (bit < (GetByteSize() * 8))
             {
-                m_data.uint128 &= ~((__uint128_t)1ull << (__uint128_t)bit);
-                return true;
+                return m_scalar.ClearBit(bit);
             }
-#endif
+            break;
+
         case eTypeFloat:
         case eTypeDouble:
         case eTypeLongDouble:
             break;
 
         case eTypeBytes:
-            if (m_data.buffer.byte_order == eByteOrderBig || m_data.buffer.byte_order == eByteOrderLittle)
+            if (buffer.byte_order == eByteOrderBig || buffer.byte_order == eByteOrderLittle)
             {
                 uint32_t byte_idx;
-                if (m_data.buffer.byte_order == eByteOrderBig)
-                    byte_idx = m_data.buffer.length - (bit / 8) - 1;
+                if (buffer.byte_order == eByteOrderBig)
+                    byte_idx = buffer.length - (bit / 8) - 1;
                 else
                     byte_idx = bit / 8;
 
                 const uint32_t byte_bit = bit % 8;
-                if (byte_idx < m_data.buffer.length)
+                if (byte_idx < buffer.length)
                 {
-                    m_data.buffer.bytes[byte_idx] &= ~(1u << byte_bit);
+                    buffer.bytes[byte_idx] &= ~(1u << byte_bit);
                     return true;
                 }
             }
@@ -1207,62 +1039,34 @@ RegisterValue::SetBit (uint32_t bit)
             break;
             
         case eTypeUInt8:        
-            if (bit < 8)
-            {
-                m_data.uint8 |= (1u << bit);
-                return true;
-            }
-            break;
-            
         case eTypeUInt16:
-            if (bit < 16)
-            {
-                m_data.uint16 |= (1u << bit);
-                return true;
-            }
-            break;
-            
         case eTypeUInt32:
-            if (bit < 32)
-            {
-                m_data.uint32 |= (1u << bit);
-                return true;
-            }
-            break;
-            
         case eTypeUInt64:
-            if (bit < 64)
-            {
-                m_data.uint64 |= (1ull << (uint64_t)bit);
-                return true;
-            }
-            break;
-#if defined (ENABLE_128_BIT_SUPPORT)
         case eTypeUInt128:
-            if (bit < 64)
+            if (bit < (GetByteSize() * 8))
             {
-                m_data.uint128 |= ((__uint128_t)1ull << (__uint128_t)bit);
-                return true;
+                return m_scalar.SetBit(bit);
             }
-#endif
+            break;
+
         case eTypeFloat:
         case eTypeDouble:
         case eTypeLongDouble:
             break;
             
         case eTypeBytes:
-            if (m_data.buffer.byte_order == eByteOrderBig || m_data.buffer.byte_order == eByteOrderLittle)
+            if (buffer.byte_order == eByteOrderBig || buffer.byte_order == eByteOrderLittle)
             {
                 uint32_t byte_idx;
-                if (m_data.buffer.byte_order == eByteOrderBig)
-                    byte_idx = m_data.buffer.length - (bit / 8) - 1;
+                if (buffer.byte_order == eByteOrderBig)
+                    byte_idx = buffer.length - (bit / 8) - 1;
                 else
                     byte_idx = bit / 8;
                 
                 const uint32_t byte_bit = bit % 8;
-                if (byte_idx < m_data.buffer.length)
+                if (byte_idx < buffer.length)
                 {
-                    m_data.buffer.bytes[byte_idx] |= (1u << byte_bit);
+                    buffer.bytes[byte_idx] |= (1u << byte_bit);
                     return true;
                 }
             }

Modified: lldb/trunk/source/Core/Scalar.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Scalar.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Core/Scalar.cpp (original)
+++ lldb/trunk/source/Core/Scalar.cpp Fri Aug  7 01:39:38 2015
@@ -11,6 +11,7 @@
 
 #include <math.h>
 #include <inttypes.h>
+#include <stdio.h>
 
 #include "lldb/Interpreter/Args.h"
 #include "lldb/Core/Error.h"
@@ -77,7 +78,7 @@ PromoteToMaxType
 //----------------------------------------------------------------------
 Scalar::Scalar() :
     m_type(e_void),
-    m_data()
+    m_float((float)0)
 {
 }
 
@@ -86,7 +87,8 @@ Scalar::Scalar() :
 //----------------------------------------------------------------------
 Scalar::Scalar(const Scalar& rhs) :
     m_type(rhs.m_type),
-    m_data(rhs.m_data)  // TODO: verify that for C++ this will correctly copy the union??
+    m_integer(rhs.m_integer),
+    m_float(rhs.m_float)
 {
 }
 
@@ -135,6 +137,8 @@ bool
 Scalar::GetData (DataExtractor &data, size_t limit_byte_size) const
 {
     size_t byte_size = GetByteSize();
+    static float f_val;
+    static double d_val;
     if (byte_size > 0)
     {
         if (limit_byte_size < byte_size)
@@ -144,20 +148,104 @@ Scalar::GetData (DataExtractor &data, si
                 // On little endian systems if we want fewer bytes from the
                 // current type we just specify fewer bytes since the LSByte
                 // is first...
-                data.SetData((uint8_t*)&m_data, limit_byte_size, lldb::endian::InlHostByteOrder());
+                switch(m_type)
+                {
+                case e_schar:
+                case e_uchar:
+                case e_sshort:
+                case e_ushort:
+                case e_sint:
+                case e_uint:
+                case e_slong:
+                case e_ulong:
+                case e_slonglong:
+                case e_ulonglong:
+                case e_sint128:
+                case e_uint128:
+                    data.SetData((const uint8_t *)m_integer.getRawData(), limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                case e_float:
+                    f_val = m_float.convertToFloat();
+                    data.SetData((uint8_t *)&f_val, limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                case e_double:
+                    d_val = m_float.convertToDouble();
+                    data.SetData((uint8_t *)&d_val, limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                case e_long_double:
+                    static llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+                    data.SetData((const uint8_t *)ldbl_val.getRawData(), limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                }
             }
             else if (lldb::endian::InlHostByteOrder() == eByteOrderBig)
             {
                 // On big endian systems if we want fewer bytes from the
                 // current type have to advance our initial byte pointer and
                 // trim down the number of bytes since the MSByte is first
-                data.SetData(((uint8_t*)&m_data) + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
+                switch(m_type)
+                {
+                case e_schar:
+                case e_uchar:
+                case e_sshort:
+                case e_ushort:
+                case e_sint:
+                case e_uint:
+                case e_slong:
+                case e_ulong:
+                case e_slonglong:
+                case e_ulonglong:
+                case e_sint128:
+                case e_uint128:
+                    data.SetData((const uint8_t *)m_integer.getRawData() + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                case e_float:
+                    f_val = m_float.convertToFloat();
+                    data.SetData((uint8_t *)&f_val + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                case e_double:
+                    d_val = m_float.convertToDouble();
+                    data.SetData((uint8_t *)&d_val + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                case e_long_double:
+                    static llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+                    data.SetData((const uint8_t *)ldbl_val.getRawData() + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
+                    return true;
+                }
             }
         }
         else
         {
             // We want all of the data
-            data.SetData((uint8_t*)&m_data, byte_size, lldb::endian::InlHostByteOrder());
+            switch(m_type)
+            {
+            case e_schar:
+            case e_uchar:
+            case e_sshort:
+            case e_ushort:
+            case e_sint:
+            case e_uint:
+            case e_slong:
+            case e_ulong:
+            case e_slonglong:
+            case e_ulonglong:
+            case e_sint128:
+            case e_uint128:
+                data.SetData((const uint8_t *)m_integer.getRawData(), byte_size, lldb::endian::InlHostByteOrder());
+                return true;
+            case e_float:
+                f_val = m_float.convertToFloat();
+                data.SetData((uint8_t *)&f_val, byte_size, lldb::endian::InlHostByteOrder());
+                return true;
+            case e_double:
+                d_val = m_float.convertToDouble();
+                data.SetData((uint8_t *)&d_val, byte_size, lldb::endian::InlHostByteOrder());
+                return true;
+            case e_long_double:
+                static llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+                data.SetData((const uint8_t *)ldbl_val.getRawData(), byte_size, lldb::endian::InlHostByteOrder());
+                return true;
+            }
         }
         return true;
     }
@@ -165,6 +253,41 @@ Scalar::GetData (DataExtractor &data, si
     return false;
 }
 
+void *
+Scalar::GetBytes() const
+{
+    static float_t flt_val;
+    static double_t dbl_val;
+    switch (m_type)
+    {
+    case e_void:
+        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128: 
+        return (void *)m_integer.getRawData();
+    case e_float:
+        flt_val = m_float.convertToFloat();
+        return (void *)&flt_val;
+    case e_double:
+        dbl_val = m_float.convertToDouble();
+        return (void *)&dbl_val;
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return (void *)ldbl_val.getRawData();
+    }
+    return NULL;
+}
+
 size_t
 Scalar::GetByteSize() const
 {
@@ -172,15 +295,21 @@ Scalar::GetByteSize() const
     {
     case e_void:
         break;
-    case e_sint:        return sizeof(m_data.sint);
-    case e_uint:        return sizeof(m_data.uint);
-    case e_slong:       return sizeof(m_data.slong);
-    case e_ulong:       return sizeof(m_data.ulong);
-    case e_slonglong:   return sizeof(m_data.slonglong);
-    case e_ulonglong:   return sizeof(m_data.ulonglong);
-    case e_float:       return sizeof(m_data.flt);
-    case e_double:      return sizeof(m_data.dbl);
-    case e_long_double: return sizeof(m_data.ldbl);
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:      return (m_integer.getBitWidth() / 8);
+    case e_float:       return sizeof(float_t);
+    case e_double:      return sizeof(double_t);
+    case e_long_double: return sizeof(long_double_t);
     }
     return 0;
 }
@@ -188,19 +317,28 @@ Scalar::GetByteSize() const
 bool
 Scalar::IsZero() const
 {
+    llvm::APInt zero_int = llvm::APInt::getAllOnesValue(m_integer.getBitWidth() / 8);
     switch (m_type)
     {
     case e_void:
         break;
-    case e_sint:        return m_data.sint == 0;
-    case e_uint:        return m_data.uint == 0;
-    case e_slong:       return m_data.slong == 0;
-    case e_ulong:       return m_data.ulong == 0;
-    case e_slonglong:   return m_data.slonglong == 0;
-    case e_ulonglong:   return m_data.ulonglong == 0;
-    case e_float:       return m_data.flt == 0.0f;
-    case e_double:      return m_data.dbl == 0.0;
-    case e_long_double: return m_data.ldbl == 0.0;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return llvm::APInt::isSameValue(zero_int, m_integer);
+    case e_float:
+    case e_double:
+    case e_long_double:
+        return m_float.isZero();
     }
     return false;
 }
@@ -208,6 +346,7 @@ Scalar::IsZero() const
 void
 Scalar::GetValue (Stream *s, bool show_type) const
 {
+    const uint64_t *src;
     if (show_type)
         s->Printf("(%s) ", GetTypeAsCString());
 
@@ -215,15 +354,30 @@ Scalar::GetValue (Stream *s, bool show_t
     {
     case e_void:
         break;
-    case e_sint:        s->Printf("%i", m_data.sint);               break;
-    case e_uint:        s->Printf("0x%8.8x", m_data.uint);          break;
-    case e_slong:       s->Printf("%li", m_data.slong);             break;
-    case e_ulong:       s->Printf("0x%8.8lx", m_data.ulong);        break;
-    case e_slonglong:   s->Printf("%lli", m_data.slonglong);        break;
-    case e_ulonglong:   s->Printf("0x%16.16llx", m_data.ulonglong); break;
-    case e_float:       s->Printf("%f", m_data.flt);                break;
-    case e_double:      s->Printf("%g", m_data.dbl);                break;
-    case e_long_double: s->Printf("%Lg", m_data.ldbl);              break;
+    case e_schar:       s->Printf("%i", *(const schar_t *) m_integer.getRawData());                        break;
+    case e_uchar:       s->Printf("0x%8.8x", *(const uchar_t *) m_integer.getRawData());           break;
+    case e_sshort:      s->Printf("%i", *(const sint_t *) m_integer.getRawData());                        break;
+    case e_ushort:      s->Printf("0x%8.8x", *(const uint_t *) m_integer.getRawData());           break;
+    case e_sint:        s->Printf("%i", *(const sint_t *) m_integer.getRawData());                        break;
+    case e_uint:        s->Printf("0x%8.8x", *(const uint_t *) m_integer.getRawData());           break;
+    case e_slong:       s->Printf("%li", *(const slong_t *) m_integer.getRawData());                       break;
+    case e_ulong:       s->Printf("0x%8.8lx", *(const ulong_t *) m_integer.getRawData());         break;
+    case e_slonglong:   s->Printf("%lli", *(const slonglong_t *) m_integer.getRawData());                  break;
+    case e_ulonglong:   s->Printf("0x%16.16llx", *(const ulonglong_t *) m_integer.getRawData()); break;
+    case e_sint128:
+        src = m_integer.getRawData();
+        s->Printf("%lli%lli", *(const slonglong_t *)src, *(const slonglong_t *)(src + 1));
+        break;
+    case e_uint128:
+        src = m_integer.getRawData();
+        s->Printf("0x%16.16llx%16.16llx", *(const ulonglong_t *)src, *(const ulonglong_t *)(src + 1));
+        break;
+    case e_float:       s->Printf("%f", m_float.convertToFloat());                break;
+    case e_double:      s->Printf("%g", m_float.convertToDouble());                break;
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        s->Printf("%Lg", *(const long_double_t *)ldbl_val.getRawData());
+        break;
     }
 }
 
@@ -233,12 +387,18 @@ Scalar::GetTypeAsCString() const
     switch (m_type)
     {
     case e_void:        return "void";
+    case e_schar:       return "char";
+    case e_uchar:       return "unsigned char";
+    case e_sshort:      return "short";
+    case e_ushort:      return "unsigned short";
     case e_sint:        return "int";
     case e_uint:        return "unsigned int";
     case e_slong:       return "long";
     case e_ulong:       return "unsigned long";
     case e_slonglong:   return "long long";
     case e_ulonglong:   return "unsigned long long";
+    case e_sint128:     return "int128_t";
+    case e_uint128:     return "unsigned int128_t";
     case e_float:       return "float";
     case e_double:      return "double";
     case e_long_double: return "long double";
@@ -257,16 +417,51 @@ Scalar::operator=(const Scalar& rhs)
     if (this != &rhs)
     {
         m_type = rhs.m_type;
-        ::memcpy (&m_data, &rhs.m_data, sizeof(m_data));
+        m_integer = llvm::APInt(rhs.m_integer);
+        m_float = rhs.m_float;
     }
     return *this;
 }
 
 Scalar&
+Scalar::operator= (const char v)
+{
+    m_type = e_schar;
+    m_integer = llvm::APInt(sizeof(char) * 8, v, true);
+    return *this;
+}
+
+
+Scalar&
+Scalar::operator= (unsigned char v)
+{
+    m_type = e_uchar;
+    m_integer = llvm::APInt(sizeof(char) * 8, v);
+    return *this;
+}
+
+Scalar&
+Scalar::operator= (const short v)
+{
+    m_type = e_sshort;
+    m_integer = llvm::APInt(sizeof(short) * 8, v, true);
+    return *this;
+}
+
+
+Scalar&
+Scalar::operator= (unsigned short v)
+{
+    m_type = e_ushort;
+    m_integer = llvm::APInt(sizeof(short) * 8, v);
+    return *this;
+}
+
+Scalar&
 Scalar::operator= (const int v)
 {
     m_type = e_sint;
-    m_data.sint = v;
+    m_integer = llvm::APInt(sizeof(int) * 8, v, true);
     return *this;
 }
 
@@ -275,7 +470,7 @@ Scalar&
 Scalar::operator= (unsigned int v)
 {
     m_type = e_uint;
-    m_data.uint = v;
+    m_integer = llvm::APInt(sizeof(int) * 8, v);
     return *this;
 }
 
@@ -283,7 +478,7 @@ Scalar&
 Scalar::operator= (long v)
 {
     m_type = e_slong;
-    m_data.slong = v;
+    m_integer = llvm::APInt(sizeof(long) * 8, v, true);
     return *this;
 }
 
@@ -291,7 +486,7 @@ Scalar&
 Scalar::operator= (unsigned long v)
 {
     m_type = e_ulong;
-    m_data.ulong = v;
+    m_integer = llvm::APInt(sizeof(long) * 8, v);
     return *this;
 }
 
@@ -299,7 +494,7 @@ Scalar&
 Scalar::operator= (long long v)
 {
     m_type = e_slonglong;
-    m_data.slonglong = v;
+    m_integer = llvm::APInt(sizeof(long) * 8, v, true);
     return *this;
 }
 
@@ -307,7 +502,7 @@ Scalar&
 Scalar::operator= (unsigned long long v)
 {
     m_type = e_ulonglong;
-    m_data.ulonglong = v;
+    m_integer = llvm::APInt(sizeof(long long) * 8, v);
     return *this;
 }
 
@@ -315,7 +510,7 @@ Scalar&
 Scalar::operator= (float v)
 {
     m_type = e_float;
-    m_data.flt = v;
+    m_float = llvm::APFloat(v);
     return *this;
 }
 
@@ -323,7 +518,7 @@ Scalar&
 Scalar::operator= (double v)
 {
     m_type = e_double;
-    m_data.dbl = v;
+    m_float = llvm::APFloat(v);
     return *this;
 }
 
@@ -331,7 +526,50 @@ Scalar&
 Scalar::operator= (long double v)
 {
     m_type = e_long_double;
-    m_data.ldbl = v;
+    if(m_ieee_quad)
+        m_float = llvm::APFloat(llvm::APFloat::IEEEquad, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
+    else
+        m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&v)->x));
+    return *this;
+}
+
+Scalar&
+Scalar::operator= (llvm::APInt rhs)
+{
+    m_integer = llvm::APInt(rhs);
+    switch(m_integer.getBitWidth())
+    {
+        case 8:
+            if(m_integer.isSignedIntN(sizeof(schar_t) * 8))
+                m_type = e_schar;
+            else
+                m_type = e_uchar;
+            break;
+        case 16:
+            if(m_integer.isSignedIntN(sizeof(sshort_t) * 8))
+                m_type = e_sshort;
+            else
+                m_type = e_ushort;
+            break;
+        case 32:
+            if(m_integer.isSignedIntN(sizeof(sint_t) * 8))
+                m_type = e_sint;
+            else
+                m_type = e_uint;
+            break;
+        case 64:
+            if(m_integer.isSignedIntN(sizeof(slonglong_t) * 8))
+                m_type = e_slonglong;
+            else
+                m_type = e_ulonglong;
+            break;
+        case 128:
+            if(m_integer.isSignedIntN(BITWIDTH_INT128))
+                m_type = e_sint128;
+            else
+                m_type = e_uint128;
+            break;
+    }
     return *this;
 }
 
@@ -351,131 +589,878 @@ Scalar::Promote(Scalar::Type type)
     case e_void:
         break;
 
-    case e_sint:
+    case e_schar:
+        switch (type)
+        {
+             case e_void:    break;
+             case e_schar:   success = true; break;
+             case e_uchar:
+             {
+                 m_integer = llvm::APInt(sizeof(uchar_t) * 8, *(const uint64_t *)m_integer.getRawData(), false);
+                 success = true;
+                 break;
+             }
+             case e_sshort:
+             {
+                 m_integer = m_integer.sext(sizeof(sshort_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ushort:
+             {
+                 m_integer = m_integer.zext(sizeof(sshort_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint:
+             {
+                 m_integer = m_integer.sext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_uint:
+             {
+                 m_integer = m_integer.zext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slong:
+             {
+                 m_integer = m_integer.sext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
+        }
+        break;
+
+    case e_uchar:
+        switch (type)
+        {
+             case e_void:
+             case e_schar:   break;
+             case e_uchar:   success = true; break;
+             case e_sshort:
+             {
+                 m_integer = m_integer.sext(sizeof(sshort_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ushort:
+             {
+                 m_integer = m_integer.sext(sizeof(sshort_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint:
+             {
+                 m_integer = m_integer.sext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_uint:
+             {
+                 m_integer = m_integer.zext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slong:
+             {
+                 m_integer = m_integer.sext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
+        }
+        break;
+
+    case e_sshort:
         switch (type)
         {
-        case e_void:        break;
-        case e_sint:        success = true; break;
-        case e_uint:        m_data.uint         = m_data.sint;      success = true; break;
-        case e_slong:       m_data.slong        = m_data.sint;      success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.sint;      success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.sint;      success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.sint;      success = true; break;
-        case e_float:       m_data.flt          = m_data.sint;      success = true; break;
-        case e_double:      m_data.dbl          = m_data.sint;      success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.sint;      success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:   break;
+             case e_sshort:  success = true; break;
+             case e_ushort:
+             {
+                 m_integer = llvm::APInt(sizeof(ushort_t) * 8, *(const uint64_t *)m_integer.getRawData(), false);
+                 success = true;
+                 break;
+             }
+             case e_sint:
+             {
+                 m_integer = m_integer.sext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_uint:
+             {
+                 m_integer = m_integer.zext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slong:
+             {
+                 m_integer = m_integer.sext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
+        }
+        break;
+
+    case e_ushort:
+    switch (type)
+        {
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:  break;
+             case e_ushort:  success = true; break;
+             case e_sint:
+             {
+                 m_integer = m_integer.sext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_uint:
+             {
+                 m_integer = m_integer.zext(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slong:
+             {
+                 m_integer = m_integer.sext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
+        }
+        break;
+
+     case e_sint:
+         switch (type)
+         {
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:  break;
+             case e_sint:    success = true; break;
+             case e_uint:
+             {
+                 m_integer = llvm::APInt(sizeof(uint_t) * 8, *(const uint64_t *)m_integer.getRawData(), false);
+                 success = true;
+                 break;
+             } 
+             case e_slong:
+             {
+                 m_integer = m_integer.sext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_uint:
         switch (type)
         {
-        case e_void:
-        case e_sint:        break;
-        case e_uint:        success = true; break;
-        case e_slong:       m_data.slong        = m_data.uint;      success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.uint;      success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.uint;      success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.uint;      success = true; break;
-        case e_float:       m_data.flt          = m_data.uint;      success = true; break;
-        case e_double:      m_data.dbl          = m_data.uint;      success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.uint;      success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:     break;
+             case e_uint:     success = true; break;
+             case e_slong:
+             {
+                 m_integer =  m_integer.sext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zext(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_slong:
         switch (type)
         {
-        case e_void:
-        case e_sint:
-        case e_uint:        break;
-        case e_slong:       success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.slong;     success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.slong;     success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.slong;     success = true; break;
-        case e_float:       m_data.flt          = m_data.slong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.slong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.slong;     success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:    break;
+             case e_slong:   success = true; break;
+             case e_ulong:
+             {
+                 m_integer = llvm::APInt(sizeof(ulong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false); 
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_ulong:
         switch (type)
         {
-        case e_void:
-        case e_sint:
-        case e_uint:
-        case e_slong:       break;
-        case e_ulong:       success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.ulong;     success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.ulong;     success = true; break;
-        case e_float:       m_data.flt          = m_data.ulong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.ulong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.ulong;     success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:    break;
+             case e_ulong:    success = true; break;
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zext(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_slonglong:
         switch (type)
         {
-        case e_void:
-        case e_sint:
-        case e_uint:
-        case e_slong:
-        case e_ulong:       break;
-        case e_slonglong:   success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.slonglong;     success = true; break;
-        case e_float:       m_data.flt          = m_data.slonglong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.slonglong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.slonglong;     success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:        break;
+             case e_slonglong:    success = true; break;
+             case e_ulonglong:
+             {
+                 m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, *(const uint64_t *)m_integer.getRawData(), false);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_ulonglong:
         switch (type)
         {
-        case e_void:
-        case e_sint:
-        case e_uint:
-        case e_slong:
-        case e_ulong:
-        case e_slonglong:   break;
-        case e_ulonglong:   success = true; break;
-        case e_float:       m_data.flt          = m_data.ulonglong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.ulonglong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:    break;
+             case e_ulonglong:    success = true; break;
+             case e_sint128:
+             {
+                 m_integer = m_integer.sext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
+        }
+        break;
+
+    case e_sint128:
+        switch (type)
+        {
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:
+             case e_ulonglong:   break; 
+             case e_sint128:     success = true; break;
+             case e_uint128:
+             {
+                 m_integer = m_integer.zext(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
+        }
+        break;
+
+    case e_uint128:
+        switch (type)
+        {
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:
+             case e_ulonglong:
+             case e_sint128:    break;
+             case e_uint128:    success = true; break;
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_float:
         switch (type)
         {
-        case e_void:
-        case e_sint:
-        case e_uint:
-        case e_slong:
-        case e_ulong:
-        case e_slonglong:
-        case e_ulonglong:   break;
-        case e_float:       success = true; break;
-        case e_double:      m_data.dbl          = m_data.flt;           success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:
+             case e_ulonglong:
+             case e_sint128:
+             case e_uint128:    break;
+             case e_float:      success = true; break;
+             case e_double:
+             {
+                 m_float = llvm::APFloat((float_t)m_float.convertToFloat());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt());
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt());
+                 success = true;
+                 break;
+             }
         }
         break;
 
     case e_double:
         switch (type)
         {
-        case e_void:
-        case e_sint:
-        case e_uint:
-        case e_slong:
-        case e_ulong:
-        case e_slonglong:
-        case e_ulonglong:
-        case e_float:       break;
-        case e_double:      success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.dbl;       success = true; break;
+             case e_void:
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:
+             case e_ulonglong:
+             case e_sint128:
+             case e_uint128:
+             case e_float:      break;
+             case e_double:     success = true; break;
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt());
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt());
+                 success = true;
+                 break;
+             }
         }
         break;
 
@@ -483,12 +1468,18 @@ Scalar::Promote(Scalar::Type type)
         switch (type)
         {
         case e_void:
+        case e_schar:
+        case e_uchar:
+        case e_sshort:
+        case e_ushort:
         case e_sint:
         case e_uint:
         case e_slong:
         case e_ulong:
         case e_slonglong:
         case e_ulonglong:
+        case e_sint128:
+        case e_uint128:
         case e_float:
         case e_double:      break;
         case e_long_double: success = true; break;
@@ -507,6 +1498,10 @@ Scalar::GetValueTypeAsCString (Scalar::T
     switch (type)
     {
     case e_void:        return "void";
+    case e_schar:       return "char";
+    case e_uchar:       return "unsigned char";
+    case e_sshort:      return "short";
+    case e_ushort:      return "unsigned short";
     case e_sint:        return "int";
     case e_uint:        return "unsigned int";
     case e_slong:       return "long";
@@ -516,6 +1511,8 @@ Scalar::GetValueTypeAsCString (Scalar::T
     case e_float:       return "float";
     case e_double:      return "double";
     case e_long_double: return "long double";
+    case e_sint128:     return "int128_t";
+    case e_uint128:     return "uint128_t";
     }
     return "???";
 }
@@ -524,6 +1521,10 @@ Scalar::GetValueTypeAsCString (Scalar::T
 Scalar::Type
 Scalar::GetValueTypeForSignedIntegerWithByteSize (size_t byte_size)
 {
+    if (byte_size <= sizeof(schar_t))
+        return e_schar;
+    if (byte_size <= sizeof(sshort_t))
+        return e_sshort;
     if (byte_size <= sizeof(sint_t))
         return e_sint;
     if (byte_size <= sizeof(slong_t))
@@ -536,6 +1537,10 @@ Scalar::GetValueTypeForSignedIntegerWith
 Scalar::Type
 Scalar::GetValueTypeForUnsignedIntegerWithByteSize (size_t byte_size)
 {
+    if (byte_size <= sizeof(schar_t))
+        return e_schar;
+    if (byte_size <= sizeof(sshort_t))
+        return e_sshort;
     if (byte_size <= sizeof(uint_t))
         return e_uint;
     if (byte_size <= sizeof(ulong_t))
@@ -566,146 +1571,263 @@ Scalar::Cast(Scalar::Type type)
     case e_void:
         break;
 
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
     case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
         switch (type)
         {
-        case e_void:        break;
-        case e_sint:        success = true; break;
-        case e_uint:        m_data.uint         = m_data.sint;      success = true; break;
-        case e_slong:       m_data.slong        = m_data.sint;      success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.sint;      success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.sint;      success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.sint;      success = true; break;
-        case e_float:       m_data.flt          = m_data.sint;      success = true; break;
-        case e_double:      m_data.dbl          = m_data.sint;      success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.sint;      success = true; break;
+             case e_void:        break;
+             case e_schar:
+             {
+                 m_integer = m_integer.sextOrTrunc(sizeof(schar_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_uchar:
+             {
+                 m_integer = m_integer.zextOrTrunc(sizeof(schar_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sshort:
+             {
+                 m_integer = m_integer.sextOrTrunc(sizeof(sshort_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ushort:
+             {
+                 m_integer = m_integer.zextOrTrunc(sizeof(sshort_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint:
+             {
+                 m_integer = m_integer.sextOrTrunc(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_uint:
+             {
+                 m_integer = m_integer.zextOrTrunc(sizeof(sint_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slong:
+             {
+                 m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulong:
+             {
+                 m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_slonglong:
+             {
+                 m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_ulonglong:
+             {
+                 m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
+                 success = true;
+                 break;
+             }
+             case e_sint128:
+             {
+                 m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_uint128:
+             {
+                 m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
+                 success = true;
+                 break;
+             }
+             case e_float:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToFloat());
+                 success = true;
+                 break;
+             }
+             case e_double:
+             {
+                 m_float = llvm::APFloat(m_integer.bitsToDouble());
+                 success = true;
+                 break;
+             }
+             case e_long_double:
+             {
+                 if(m_ieee_quad)
+                     m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_integer);
+                 else
+                     m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_integer);
+                 success = true;
+                 break;
+             }
         }
         break;
 
-    case e_uint:
+    case e_float:
         switch (type)
         {
-        case e_void:
-        case e_sint:        m_data.sint         = m_data.uint;      success = true; break;
-        case e_uint:        success = true; break;
-        case e_slong:       m_data.slong        = m_data.uint;      success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.uint;      success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.uint;      success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.uint;      success = true; break;
-        case e_float:       m_data.flt          = m_data.uint;      success = true; break;
-        case e_double:      m_data.dbl          = m_data.uint;      success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.uint;      success = true; break;
+        case e_void: break;
+        case e_schar:
+        case e_uchar:
+        case e_sshort:
+        case e_ushort:
+        case e_sint:
+        case e_uint:
+        case e_slong:
+        case e_ulong:
+        case e_slonglong:
+        case e_ulonglong:
+        case e_sint128:
+        case e_uint128:     m_integer = m_float.bitcastToAPInt();         success = true; break;
+        case e_float:       m_float = llvm::APFloat(m_float.convertToFloat());         success = true; break;
+        case e_double:      m_float = llvm::APFloat(m_float.convertToFloat());         success = true; break;
+        case e_long_double:
+            if(m_ieee_quad)
+                m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt());
+            else
+                m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt());
+            success = true;
+            break;
         }
         break;
 
-    case e_slong:
+    case e_double:
         switch (type)
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.slong;     success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.slong;     success = true; break;
-        case e_slong:       success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.slong;     success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.slong;     success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.slong;     success = true; break;
-        case e_float:       m_data.flt          = m_data.slong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.slong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.slong;     success = true; break;
+        case e_void: break;
+        case e_schar:
+        case e_uchar:
+        case e_sshort:
+        case e_ushort:
+        case e_sint:
+        case e_uint:
+        case e_slong:
+        case e_ulong:
+        case e_slonglong:
+        case e_ulonglong:
+        case e_sint128:
+        case e_uint128:     m_integer = m_float.bitcastToAPInt();                      success = true; break;
+        case e_float:       m_float = llvm::APFloat(m_float.convertToDouble());        success = true; break;
+        case e_double:      m_float = llvm::APFloat(m_float.convertToDouble());        success = true; break;
+        case e_long_double:
+            if(m_ieee_quad)
+                m_float = llvm::APFloat(llvm::APFloat::IEEEquad, m_float.bitcastToAPInt());
+            else
+                m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, m_float.bitcastToAPInt());
+            success = true;
+            break;
         }
         break;
 
-    case e_ulong:
+    case e_long_double:
         switch (type)
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.ulong;     success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.ulong;     success = true; break;
-        case e_slong:       m_data.slong        = m_data.ulong;     success = true; break;
-        case e_ulong:       success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.ulong;     success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.ulong;     success = true; break;
-        case e_float:       m_data.flt          = m_data.ulong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.ulong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.ulong;     success = true; break;
+        case e_void: break;
+        case e_schar:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.sextOrTrunc(sizeof(schar_t) * 8);
+            success = true;
+            break;
         }
-        break;
-
-    case e_slonglong:
-        switch (type)
+        case e_uchar:
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.slonglong;     success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.slonglong;     success = true; break;
-        case e_slong:       m_data.slong        = m_data.slonglong;     success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.slonglong;     success = true; break;
-        case e_slonglong:   success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = m_data.slonglong;     success = true; break;
-        case e_float:       m_data.flt          = m_data.slonglong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.slonglong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.slonglong;     success = true; break;
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.zextOrTrunc(sizeof(schar_t) * 8);
+            success = true;
+            break;
         }
-        break;
-
-    case e_ulonglong:
-        switch (type)
+        case e_sshort:
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.ulonglong;     success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.ulonglong;     success = true; break;
-        case e_slong:       m_data.slong        = m_data.ulonglong;     success = true; break;
-        case e_ulong:       m_data.ulong        = m_data.ulonglong;     success = true; break;
-        case e_slonglong:   m_data.slonglong    = m_data.ulonglong;     success = true; break;
-        case e_ulonglong:   success = true; break;
-        case e_float:       m_data.flt          = m_data.ulonglong;     success = true; break;
-        case e_double:      m_data.dbl          = m_data.ulonglong;     success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.sextOrTrunc(sizeof(sshort_t) * 8);
+            success = true;
+            break;
         }
-        break;
-
-    case e_float:
-        switch (type)
+        case e_ushort:
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.flt;       success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.flt;       success = true; break;
-        case e_slong:       m_data.slong        = (slong_t)m_data.flt;      success = true; break;
-        case e_ulong:       m_data.ulong        = (ulong_t)m_data.flt;      success = true; break;
-        case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.flt;  success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.flt;  success = true; break;
-        case e_float:       success = true; break;
-        case e_double:      m_data.dbl          = m_data.flt;               success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.flt;               success = true; break;
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.zextOrTrunc(sizeof(sshort_t) * 8);
+            success = true;
+            break;
         }
-        break;
-
-    case e_double:
-        switch (type)
+        case e_sint:
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.dbl;       success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.dbl;       success = true; break;
-        case e_slong:       m_data.slong        = (slong_t)m_data.dbl;      success = true; break;
-        case e_ulong:       m_data.ulong        = (ulong_t)m_data.dbl;      success = true; break;
-        case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.dbl;  success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.dbl;  success = true; break;
-        case e_float:       m_data.flt          = (float_t)m_data.dbl;      success = true; break;
-        case e_double:      success = true; break;
-        case e_long_double: m_data.ldbl         = m_data.dbl;               success = true; break;
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.sextOrTrunc(sizeof(sint_t) * 8);
+            success = true;
+            break;
         }
-        break;
-
-    case e_long_double:
-        switch (type)
+        case e_uint:
         {
-        case e_void:
-        case e_sint:        m_data.sint         = (sint_t)m_data.ldbl;      success = true; break;
-        case e_uint:        m_data.uint         = (uint_t)m_data.ldbl;      success = true; break;
-        case e_slong:       m_data.slong        = (slong_t)m_data.ldbl;     success = true; break;
-        case e_ulong:       m_data.ulong        = (ulong_t)m_data.ldbl;     success = true; break;
-        case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.ldbl; success = true; break;
-        case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.ldbl; success = true; break;
-        case e_float:       m_data.flt          = (float_t)m_data.ldbl;     success = true; break;
-        case e_double:      m_data.dbl          = (double_t)m_data.ldbl;    success = true; break;
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.zextOrTrunc(sizeof(sint_t) * 8);
+            success = true;
+            break;
+        }
+        case e_slong:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.sextOrTrunc(sizeof(slong_t) * 8);
+            success = true;
+            break;
+        }
+        case e_ulong:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.zextOrTrunc(sizeof(slong_t) * 8);
+            success = true;
+            break;
+        }
+        case e_slonglong:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.sextOrTrunc(sizeof(slonglong_t) * 8);
+            success = true;
+            break;
+        }
+        case e_ulonglong:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.zextOrTrunc(sizeof(slonglong_t) * 8);
+            success = true;
+            break;
+        }
+        case e_sint128:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.sextOrTrunc(BITWIDTH_INT128);
+            success = true;
+            break;
+        }
+        case e_uint128:
+        {
+            m_integer = m_float.bitcastToAPInt();
+            m_integer = m_integer.zextOrTrunc(BITWIDTH_INT128);
+            success = true;
+            break;
+        }
+        case e_float:       m_float = llvm::APFloat(m_float.convertToFloat());     success = true; break;
+        case e_double:      m_float = llvm::APFloat(m_float.convertToFloat());    success = true; break;
         case e_long_double: success = true; break;
         }
         break;
@@ -724,12 +1846,18 @@ Scalar::MakeSigned ()
     switch (m_type)
     {
     case e_void:                                break;
+    case e_schar:                               success = true; break;
+    case e_uchar:       m_type = e_schar;       success = true; break;
+    case e_sshort:                              success = true; break;
+    case e_ushort:      m_type = e_sshort;      success = true; break;
     case e_sint:                                success = true; break;
     case e_uint:        m_type = e_sint;        success = true; break;
     case e_slong:                               success = true; break;
     case e_ulong:       m_type = e_slong;       success = true; break;
     case e_slonglong:                           success = true; break;
     case e_ulonglong:   m_type = e_slonglong;   success = true; break;
+    case e_sint128:                             success = true; break;
+    case e_uint128:     m_type = e_sint;        success = true; break;
     case e_float:                               success = true; break;
     case e_double:                              success = true; break;
     case e_long_double:                         success = true; break;
@@ -738,64 +1866,217 @@ Scalar::MakeSigned ()
     return success;
 }
 
-int
-Scalar::SInt(int fail_value) const
+char
+Scalar::SChar(char fail_value) const
 {
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return m_data.sint;
-    case e_uint:        return (int)m_data.uint;
-    case e_slong:       return (int)m_data.slong;
-    case e_ulong:       return (int)m_data.ulong;
-    case e_slonglong:   return (int)m_data.slonglong;
-    case e_ulonglong:   return (int)m_data.ulonglong;
-    case e_float:       return (int)m_data.flt;
-    case e_double:      return (int)m_data.dbl;
-    case e_long_double: return (int)m_data.ldbl;
+    case e_sint:
+    case e_uint:
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const schar_t *)(m_integer.sext(sizeof(schar_t) * 8)).getRawData();
+    case e_float:
+        return (schar_t)m_float.convertToFloat();
+    case e_double:
+        return (schar_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return (schar_t)*ldbl_val.getRawData();
     }
     return fail_value;
 }
 
-unsigned int
-Scalar::UInt(unsigned int fail_value) const
+unsigned char
+Scalar::UChar(unsigned char fail_value) const
 {
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (unsigned int)m_data.sint;
-    case e_uint:        return (unsigned int)m_data.uint;
-    case e_slong:       return (unsigned int)m_data.slong;
-    case e_ulong:       return (unsigned int)m_data.ulong;
-    case e_slonglong:   return (unsigned int)m_data.slonglong;
-    case e_ulonglong:   return (unsigned int)m_data.ulonglong;
-    case e_float:       return (unsigned int)m_data.flt;
-    case e_double:      return (unsigned int)m_data.dbl;
-    case e_long_double: return (unsigned int)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const uchar_t *)m_integer.getRawData();
+    case e_float:
+        return (uchar_t)m_float.convertToFloat();
+    case e_double:
+        return (uchar_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return (uchar_t)*ldbl_val.getRawData();
     }
     return fail_value;
 }
 
-
-long
-Scalar::SLong(long fail_value) const
+short
+Scalar::SShort(short fail_value) const
 {
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (long)m_data.sint;
-    case e_uint:        return (long)m_data.uint;
-    case e_slong:       return (long)m_data.slong;
-    case e_ulong:       return (long)m_data.ulong;
-    case e_slonglong:   return (long)m_data.slonglong;
-    case e_ulonglong:   return (long)m_data.ulonglong;
-    case e_float:       return (long)m_data.flt;
-    case e_double:      return (long)m_data.dbl;
-    case e_long_double: return (long)m_data.ldbl;
-    }
-    return fail_value;
-}
-
+    case e_sint:
+    case e_uint:
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const sshort_t *)(m_integer.sext(sizeof(sshort_t) * 8)).getRawData();
+    case e_float:
+        return (sshort_t)m_float.convertToFloat();
+    case e_double:
+        return (sshort_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const sshort_t *)ldbl_val.getRawData();
+    }
+    return fail_value;
+}
+
+unsigned short
+Scalar::UShort(unsigned short fail_value) const
+{
+    switch (m_type)
+    {
+    case e_void:        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const ushort_t *)m_integer.getRawData();
+    case e_float:
+        return (ushort_t)m_float.convertToFloat();
+    case e_double:
+        return (ushort_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const ushort_t *)ldbl_val.getRawData();;
+    }
+    return fail_value;
+}
+
+int
+Scalar::SInt(int fail_value) const
+{
+    switch (m_type)
+    {
+    case e_void:        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const sint_t *)(m_integer.sext(sizeof(sint_t) * 8)).getRawData();
+    case e_float:
+        return (sint_t)m_float.convertToFloat();
+    case e_double:
+        return (sint_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const sint_t *)ldbl_val.getRawData();
+    }
+    return fail_value;
+}
+
+unsigned int
+Scalar::UInt(unsigned int fail_value) const
+{
+    switch (m_type)
+    {
+    case e_void:        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const uint_t *)m_integer.getRawData();
+    case e_float:
+        return (uint_t)m_float.convertToFloat();
+    case e_double:
+        return (uint_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const uint_t *)ldbl_val.getRawData();
+    }
+    return fail_value;
+}
+
+
+long
+Scalar::SLong(long fail_value) const
+{
+    switch (m_type)
+    {
+    case e_void:        break;
+    case e_sint:
+    case e_uint:
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const slong_t *)(m_integer.sext(sizeof(slong_t) * 8)).getRawData();
+    case e_float:
+        return (slong_t)m_float.convertToFloat();
+    case e_double:
+        return (slong_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const slong_t *)ldbl_val.getRawData();
+    }
+    return fail_value;
+}
+
 
 
 unsigned long
@@ -804,15 +2085,26 @@ Scalar::ULong(unsigned long fail_value)
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (unsigned long)m_data.sint;
-    case e_uint:        return (unsigned long)m_data.uint;
-    case e_slong:       return (unsigned long)m_data.slong;
-    case e_ulong:       return (unsigned long)m_data.ulong;
-    case e_slonglong:   return (unsigned long)m_data.slonglong;
-    case e_ulonglong:   return (unsigned long)m_data.ulonglong;
-    case e_float:       return (unsigned long)m_data.flt;
-    case e_double:      return (unsigned long)m_data.dbl;
-    case e_long_double: return (unsigned long)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const ulong_t *)m_integer.getRawData();
+    case e_float:
+        return (ulong_t)m_float.convertToFloat();
+    case e_double:
+        return (ulong_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const ulong_t *)ldbl_val.getRawData();
     }
     return fail_value;
 }
@@ -824,45 +2116,26 @@ Scalar::GetRawBits64(uint64_t fail_value
     {
     case e_void:
         break;
-
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
     case e_sint:
     case e_uint:
-        return m_data.uint;
-
     case e_slong:
     case e_ulong:
-        return m_data.ulong;
-
     case e_slonglong:
     case e_ulonglong:
-        return m_data.ulonglong;
-
+    case e_sint128:
+    case e_uint128:
+        return *m_integer.getRawData();
     case e_float:
-        if (sizeof(m_data.flt) == sizeof(m_data.uint))
-            return m_data.uint;
-        else if (sizeof(m_data.flt) == sizeof(m_data.ulong))
-            return m_data.ulong;
-        else if (sizeof(m_data.flt) == sizeof(m_data.ulonglong))
-            return m_data.ulonglong;
-        break;
-
+        return (uint64_t)m_float.convertToFloat();
     case e_double:
-        if (sizeof(m_data.dbl) == sizeof(m_data.uint))
-            return m_data.uint;
-        else if (sizeof(m_data.dbl) == sizeof(m_data.ulong))
-            return m_data.ulong;
-        else if (sizeof(m_data.dbl) == sizeof(m_data.ulonglong))
-            return m_data.ulonglong;
-        break;
-
+        return (uint64_t)m_float.convertToDouble();
     case e_long_double:
-        if (sizeof(m_data.ldbl) == sizeof(m_data.uint))
-            return m_data.uint;
-        else if (sizeof(m_data.ldbl) == sizeof(m_data.ulong))
-            return m_data.ulong;
-        else if (sizeof(m_data.ldbl) == sizeof(m_data.ulonglong))
-            return m_data.ulonglong;
-        break;
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *ldbl_val.getRawData();
     }
     return fail_value;
 }
@@ -875,15 +2148,26 @@ Scalar::SLongLong(long long fail_value)
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (long long)m_data.sint;
-    case e_uint:        return (long long)m_data.uint;
-    case e_slong:       return (long long)m_data.slong;
-    case e_ulong:       return (long long)m_data.ulong;
-    case e_slonglong:   return (long long)m_data.slonglong;
-    case e_ulonglong:   return (long long)m_data.ulonglong;
-    case e_float:       return (long long)m_data.flt;
-    case e_double:      return (long long)m_data.dbl;
-    case e_long_double: return (long long)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return *(const slonglong_t *)(m_integer.sext(sizeof(slonglong_t) * 8)).getRawData();
+    case e_float:
+        return (slonglong_t)m_float.convertToFloat();
+    case e_double:
+        return (slonglong_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const slonglong_t *)ldbl_val.getRawData();
     }
     return fail_value;
 }
@@ -895,19 +2179,85 @@ Scalar::ULongLong(unsigned long long fai
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (unsigned long long)m_data.sint;
-    case e_uint:        return (unsigned long long)m_data.uint;
-    case e_slong:       return (unsigned long long)m_data.slong;
-    case e_ulong:       return (unsigned long long)m_data.ulong;
-    case e_slonglong:   return (unsigned long long)m_data.slonglong;
-    case e_ulonglong:   return (unsigned long long)m_data.ulonglong;
-    case e_float:       return (unsigned long long)m_data.flt;
-    case e_double:      return (unsigned long long)m_data.dbl;
-    case e_long_double: return (unsigned long long)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        if(m_integer.isAllOnesValue())
+            return *(const ulonglong_t *)(llvm::APInt::getAllOnesValue(128)).getRawData();
+        return *(const ulonglong_t *)m_integer.getRawData();
+    case e_float:
+        return (ulonglong_t)m_float.convertToFloat();
+    case e_double:
+        return (ulonglong_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return *(const ulonglong_t *)ldbl_val.getRawData();
+    }
+    return fail_value;
+}
+
+llvm::APInt
+Scalar::UInt128(llvm::APInt& fail_value) const
+{
+    switch (m_type)
+    {
+    case e_void:        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return m_integer;
+    case e_float:
+    case e_double:
+    case e_long_double:
+        return m_float.bitcastToAPInt();
     }
     return fail_value;
 }
 
+llvm::APInt
+Scalar::SInt128(llvm::APInt& fail_value) const
+{
+    switch (m_type)
+    {
+    case e_void:        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return m_integer;
+    case e_float:
+    case e_double:
+    case e_long_double:
+        return m_float.bitcastToAPInt();
+    }
+    return fail_value;
+}
 
 float
 Scalar::Float(float fail_value) const
@@ -915,15 +2265,26 @@ Scalar::Float(float fail_value) const
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (float)m_data.sint;
-    case e_uint:        return (float)m_data.uint;
-    case e_slong:       return (float)m_data.slong;
-    case e_ulong:       return (float)m_data.ulong;
-    case e_slonglong:   return (float)m_data.slonglong;
-    case e_ulonglong:   return (float)m_data.ulonglong;
-    case e_float:       return (float)m_data.flt;
-    case e_double:      return (float)m_data.dbl;
-    case e_long_double: return (float)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return m_integer.bitsToFloat();
+    case e_float:
+        return m_float.convertToFloat();
+    case e_double:
+        return (float_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return ldbl_val.bitsToFloat();
     }
     return fail_value;
 }
@@ -935,15 +2296,26 @@ Scalar::Double(double fail_value) const
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (double)m_data.sint;
-    case e_uint:        return (double)m_data.uint;
-    case e_slong:       return (double)m_data.slong;
-    case e_ulong:       return (double)m_data.ulong;
-    case e_slonglong:   return (double)m_data.slonglong;
-    case e_ulonglong:   return (double)m_data.ulonglong;
-    case e_float:       return (double)m_data.flt;
-    case e_double:      return (double)m_data.dbl;
-    case e_long_double: return (double)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return m_integer.bitsToDouble();
+    case e_float:
+        return (double_t)m_float.convertToFloat();
+    case e_double:
+        return m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return ldbl_val.bitsToFloat();
     }
     return fail_value;
 }
@@ -955,15 +2327,26 @@ Scalar::LongDouble(long double fail_valu
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        return (long double)m_data.sint;
-    case e_uint:        return (long double)m_data.uint;
-    case e_slong:       return (long double)m_data.slong;
-    case e_ulong:       return (long double)m_data.ulong;
-    case e_slonglong:   return (long double)m_data.slonglong;
-    case e_ulonglong:   return (long double)m_data.ulonglong;
-    case e_float:       return (long double)m_data.flt;
-    case e_double:      return (long double)m_data.dbl;
-    case e_long_double: return (long double)m_data.ldbl;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        return (long_double_t)m_integer.bitsToDouble();
+    case e_float:
+        return (long_double_t)m_float.convertToFloat();
+    case e_double:
+        return (long_double_t)m_float.convertToDouble();
+    case e_long_double:
+        llvm::APInt ldbl_val = m_float.bitcastToAPInt();
+        return (long_double_t)ldbl_val.bitsToDouble();
     }
     return fail_value;
 }
@@ -978,17 +2361,31 @@ Scalar::operator+= (const Scalar& rhs)
     if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) != Scalar::e_void)
     {
         switch (m_type)
-        {
-        case e_void:        break;
-        case e_sint:        m_data.sint         = a->m_data.sint        + b->m_data.sint;       break;
-        case e_uint:        m_data.uint         = a->m_data.uint        + b->m_data.uint;       break;
-        case e_slong:       m_data.slong        = a->m_data.slong       + b->m_data.slong;      break;
-        case e_ulong:       m_data.ulong        = a->m_data.ulong       + b->m_data.ulong;      break;
-        case e_slonglong:   m_data.slonglong    = a->m_data.slonglong   + b->m_data.slonglong;  break;
-        case e_ulonglong:   m_data.ulonglong    = a->m_data.ulonglong   + b->m_data.ulonglong;  break;
-        case e_float:       m_data.flt          = a->m_data.flt         + b->m_data.flt;        break;
-        case e_double:      m_data.dbl          = a->m_data.dbl         + b->m_data.dbl;        break;
-        case e_long_double: m_data.ldbl         = a->m_data.ldbl        + b->m_data.ldbl;       break;
+            {
+             case e_void:        break;
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:
+             case e_ulonglong:
+             case e_sint128:
+             case e_uint128:
+             {
+                 m_integer = a->m_integer + b->m_integer;
+                 break;
+             }
+             case e_float:
+             case e_double:
+             case e_long_double:
+             {
+                 m_float = a->m_float + b->m_float;
+                 break;
+             }
         }
     }
     return *this;
@@ -1005,111 +2402,42 @@ Scalar::operator<<= (const Scalar& rhs)
     case e_long_double:
         m_type = e_void;
         break;
-
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
     case e_sint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.sint <<= rhs.m_data.sint;        break;
-        case e_uint:            m_data.sint <<= rhs.m_data.uint;        break;
-        case e_slong:           m_data.sint <<= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.sint <<= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.sint <<= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.sint <<= rhs.m_data.ulonglong;   break;
-        }
-        break;
-
     case e_uint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.uint <<= rhs.m_data.sint;        break;
-        case e_uint:            m_data.uint <<= rhs.m_data.uint;        break;
-        case e_slong:           m_data.uint <<= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.uint <<= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.uint <<= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.uint <<= rhs.m_data.ulonglong;   break;
-        }
-        break;
-
     case e_slong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.slong <<= rhs.m_data.sint;       break;
-        case e_uint:            m_data.slong <<= rhs.m_data.uint;       break;
-        case e_slong:           m_data.slong <<= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.slong <<= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.slong <<= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.slong <<= rhs.m_data.ulonglong;  break;
-        }
-        break;
-
     case e_ulong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.ulong <<= rhs.m_data.sint;       break;
-        case e_uint:            m_data.ulong <<= rhs.m_data.uint;       break;
-        case e_slong:           m_data.ulong <<= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.ulong <<= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.ulong <<= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.ulong <<= rhs.m_data.ulonglong;  break;
-        }
-        break;
     case e_slonglong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.slonglong <<= rhs.m_data.sint;       break;
-        case e_uint:            m_data.slonglong <<= rhs.m_data.uint;       break;
-        case e_slong:           m_data.slonglong <<= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.slonglong <<= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.slonglong <<= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.slonglong <<= rhs.m_data.ulonglong;  break;
-        }
-        break;
-
     case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
         switch (rhs.m_type)
         {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.ulonglong <<= rhs.m_data.sint;       break;
-        case e_uint:            m_data.ulonglong <<= rhs.m_data.uint;       break;
-        case e_slong:           m_data.ulonglong <<= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.ulonglong <<= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.ulonglong <<= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.ulonglong <<= rhs.m_data.ulonglong;  break;
+             case e_void:
+             case e_float:
+             case e_double:
+             case e_long_double:
+                 m_type = e_void;
+                 break;
+             case e_schar:
+             case e_uchar:
+             case e_sshort:
+             case e_ushort:
+             case e_sint:
+             case e_uint:
+             case e_slong:
+             case e_ulong:
+             case e_slonglong:
+             case e_ulonglong:
+             case e_sint128:
+             case e_uint128:
+             {
+                 m_integer <<= *rhs.m_integer.getRawData();
+                 break;
+             }
         }
         break;
     }
@@ -1127,47 +2455,18 @@ Scalar::ShiftRightLogical(const Scalar&
     case e_long_double:
         m_type = e_void;
         break;
-
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
     case e_sint:
     case e_uint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.uint >>= rhs.m_data.sint;        break;
-        case e_uint:            m_data.uint >>= rhs.m_data.uint;        break;
-        case e_slong:           m_data.uint >>= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.uint >>= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.uint >>= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.uint >>= rhs.m_data.ulonglong;   break;
-        }
-        break;
-
     case e_slong:
     case e_ulong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.ulong >>= rhs.m_data.sint;       break;
-        case e_uint:            m_data.ulong >>= rhs.m_data.uint;       break;
-        case e_slong:           m_data.ulong >>= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.ulong >>= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.ulong >>= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.ulong >>= rhs.m_data.ulonglong;  break;
-        }
-        break;
-
     case e_slonglong:
     case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
         switch (rhs.m_type)
         {
         case e_void:
@@ -1176,12 +2475,19 @@ Scalar::ShiftRightLogical(const Scalar&
         case e_long_double:
             m_type = e_void;
             break;
-        case e_sint:            m_data.ulonglong >>= rhs.m_data.sint;       break;
-        case e_uint:            m_data.ulonglong >>= rhs.m_data.uint;       break;
-        case e_slong:           m_data.ulonglong >>= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.ulonglong >>= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.ulonglong >>= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.ulonglong >>= rhs.m_data.ulonglong;  break;
+        case e_schar:
+        case e_uchar:
+        case e_sshort:
+        case e_ushort:
+        case e_sint:
+        case e_uint:
+        case e_slong:
+        case e_ulong:
+        case e_slonglong:
+        case e_ulonglong:
+        case e_sint128:
+        case e_uint128:
+            m_integer = m_integer.lshr(*(const uint_t *) rhs.m_integer.getRawData());   break;
         }
         break;
     }
@@ -1196,206 +2502,23 @@ Scalar::operator>>= (const Scalar& rhs)
     {
     case e_void:
     case e_float:
-    case e_double:
-    case e_long_double:
-        m_type = e_void;
-        break;
-
-    case e_sint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.sint >>= rhs.m_data.sint;        break;
-        case e_uint:            m_data.sint >>= rhs.m_data.uint;        break;
-        case e_slong:           m_data.sint >>= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.sint >>= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.sint >>= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.sint >>= rhs.m_data.ulonglong;   break;
-        }
-        break;
-
-    case e_uint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.uint >>= rhs.m_data.sint;        break;
-        case e_uint:            m_data.uint >>= rhs.m_data.uint;        break;
-        case e_slong:           m_data.uint >>= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.uint >>= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.uint >>= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.uint >>= rhs.m_data.ulonglong;   break;
-        }
-        break;
-
-    case e_slong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.slong >>= rhs.m_data.sint;       break;
-        case e_uint:            m_data.slong >>= rhs.m_data.uint;       break;
-        case e_slong:           m_data.slong >>= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.slong >>= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.slong >>= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.slong >>= rhs.m_data.ulonglong;  break;
-        }
-        break;
-
-    case e_ulong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.ulong >>= rhs.m_data.sint;       break;
-        case e_uint:            m_data.ulong >>= rhs.m_data.uint;       break;
-        case e_slong:           m_data.ulong >>= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.ulong >>= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.ulong >>= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.ulong >>= rhs.m_data.ulonglong;  break;
-        }
-        break;
-    case e_slonglong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.slonglong >>= rhs.m_data.sint;       break;
-        case e_uint:            m_data.slonglong >>= rhs.m_data.uint;       break;
-        case e_slong:           m_data.slonglong >>= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.slonglong >>= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.slonglong >>= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.slonglong >>= rhs.m_data.ulonglong;  break;
-        }
-        break;
-
-    case e_ulonglong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.ulonglong >>= rhs.m_data.sint;       break;
-        case e_uint:            m_data.ulonglong >>= rhs.m_data.uint;       break;
-        case e_slong:           m_data.ulonglong >>= rhs.m_data.slong;      break;
-        case e_ulong:           m_data.ulonglong >>= rhs.m_data.ulong;      break;
-        case e_slonglong:       m_data.ulonglong >>= rhs.m_data.slonglong;  break;
-        case e_ulonglong:       m_data.ulonglong >>= rhs.m_data.ulonglong;  break;
-        }
-        break;
-    }
-    return *this;
-}
-
-
-Scalar&
-Scalar::operator&= (const Scalar& rhs)
-{
-    switch (m_type)
-    {
-    case e_void:
-    case e_float:
-    case e_double:
-    case e_long_double:
-        m_type = e_void;
-        break;
-
-    case e_sint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.sint &= rhs.m_data.sint;         break;
-        case e_uint:            m_data.sint &= rhs.m_data.uint;         break;
-        case e_slong:           m_data.sint &= rhs.m_data.slong;        break;
-        case e_ulong:           m_data.sint &= rhs.m_data.ulong;        break;
-        case e_slonglong:       m_data.sint &= rhs.m_data.slonglong;    break;
-        case e_ulonglong:       m_data.sint &= rhs.m_data.ulonglong;    break;
-        }
-        break;
-
-    case e_uint:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.uint &= rhs.m_data.sint;         break;
-        case e_uint:            m_data.uint &= rhs.m_data.uint;         break;
-        case e_slong:           m_data.uint &= rhs.m_data.slong;        break;
-        case e_ulong:           m_data.uint &= rhs.m_data.ulong;        break;
-        case e_slonglong:       m_data.uint &= rhs.m_data.slonglong;    break;
-        case e_ulonglong:       m_data.uint &= rhs.m_data.ulonglong;    break;
-        }
-        break;
-
-    case e_slong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.slong &= rhs.m_data.sint;        break;
-        case e_uint:            m_data.slong &= rhs.m_data.uint;        break;
-        case e_slong:           m_data.slong &= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.slong &= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.slong &= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.slong &= rhs.m_data.ulonglong;   break;
-        }
+    case e_double:
+    case e_long_double:
+        m_type = e_void;
         break;
 
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
     case e_ulong:
-        switch (rhs.m_type)
-        {
-        case e_void:
-        case e_float:
-        case e_double:
-        case e_long_double:
-            m_type = e_void;
-            break;
-        case e_sint:            m_data.ulong &= rhs.m_data.sint;        break;
-        case e_uint:            m_data.ulong &= rhs.m_data.uint;        break;
-        case e_slong:           m_data.ulong &= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.ulong &= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.ulong &= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.ulong &= rhs.m_data.ulonglong;   break;
-        }
-        break;
     case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
         switch (rhs.m_type)
         {
         case e_void:
@@ -1404,16 +2527,52 @@ Scalar::operator&= (const Scalar& rhs)
         case e_long_double:
             m_type = e_void;
             break;
-        case e_sint:            m_data.slonglong &= rhs.m_data.sint;        break;
-        case e_uint:            m_data.slonglong &= rhs.m_data.uint;        break;
-        case e_slong:           m_data.slonglong &= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.slonglong &= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.slonglong &= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.slonglong &= rhs.m_data.ulonglong;   break;
+        case e_schar:
+        case e_uchar:
+        case e_sshort:
+        case e_ushort:
+        case e_sint:
+        case e_uint:
+        case e_slong:
+        case e_ulong:
+        case e_slonglong:
+        case e_ulonglong:
+             case e_sint128:
+             case e_uint128:
+             {
+                 m_integer >> *rhs.m_integer.getRawData();
+                 break;
+             }
         }
         break;
+    }
+    return *this;
+}
 
+
+Scalar&
+Scalar::operator&= (const Scalar& rhs)
+{
+    switch (m_type)
+    {
+    case e_void:
+    case e_float:
+    case e_double:
+    case e_long_double:
+        m_type = e_void;
+        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
     case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
         switch (rhs.m_type)
         {
         case e_void:
@@ -1422,12 +2581,22 @@ Scalar::operator&= (const Scalar& rhs)
         case e_long_double:
             m_type = e_void;
             break;
-        case e_sint:            m_data.ulonglong &= rhs.m_data.sint;        break;
-        case e_uint:            m_data.ulonglong &= rhs.m_data.uint;        break;
-        case e_slong:           m_data.ulonglong &= rhs.m_data.slong;       break;
-        case e_ulong:           m_data.ulonglong &= rhs.m_data.ulong;       break;
-        case e_slonglong:       m_data.ulonglong &= rhs.m_data.slonglong;   break;
-        case e_ulonglong:       m_data.ulonglong &= rhs.m_data.ulonglong;   break;
+        case e_schar:
+        case e_uchar:
+        case e_sshort:
+        case e_ushort:
+        case e_sint:
+        case e_uint:
+        case e_slong:
+        case e_ulong:
+        case e_slonglong:
+        case e_ulonglong:
+             case e_sint128:
+             case e_uint128:
+             {
+                 m_integer &= rhs.m_integer;
+                 break;
+             }
         }
         break;
     }
@@ -1444,27 +2613,27 @@ Scalar::AbsoluteValue()
     case e_void:
         break;
 
+    case e_schar:
+    case e_sshort:
     case e_sint:
-        if (m_data.sint < 0)
-            m_data.sint = -m_data.sint;
-        return true;
-
     case e_slong:
-        if (m_data.slong < 0)
-            m_data.slong = -m_data.slong;
-        return true;
-
     case e_slonglong:
-        if (m_data.slonglong < 0)
-            m_data.slonglong = -m_data.slonglong;
+    case e_sint128:
+        if (m_integer.isNegative())
+            m_integer = -m_integer;
         return true;
 
+    case e_uchar:
+    case e_ushort:
     case e_uint:
     case e_ulong:
     case e_ulonglong:   return true;
-    case e_float:       m_data.flt = fabsf(m_data.flt);     return true;
-    case e_double:      m_data.dbl = fabs(m_data.dbl);      return true;
-    case e_long_double: m_data.ldbl = fabsl(m_data.ldbl);   return true;
+    case e_uint128:
+    case e_float:
+    case e_double:
+    case e_long_double:
+        m_float.clearSign(); 
+        return true;
     }
     return false;
 }
@@ -1476,15 +2645,23 @@ Scalar::UnaryNegate()
     switch (m_type)
     {
     case e_void:        break;
-    case e_sint:        m_data.sint = -m_data.sint;             return true;
-    case e_uint:        m_data.uint = -m_data.uint;             return true;
-    case e_slong:       m_data.slong = -m_data.slong;           return true;
-    case e_ulong:       m_data.ulong = -m_data.ulong;           return true;
-    case e_slonglong:   m_data.slonglong = -m_data.slonglong;   return true;
-    case e_ulonglong:   m_data.ulonglong = -m_data.ulonglong;   return true;
-    case e_float:       m_data.flt = -m_data.flt;               return true;
-    case e_double:      m_data.dbl = -m_data.dbl;               return true;
-    case e_long_double: m_data.ldbl = -m_data.ldbl;             return true;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        m_integer = -m_integer; return true;
+    case e_float:
+    case e_double:
+    case e_long_double:
+        m_float.changeSign(); return true;
     }
     return false;
 }
@@ -1494,12 +2671,19 @@ Scalar::OnesComplement()
 {
     switch (m_type)
     {
-    case e_sint:        m_data.sint = ~m_data.sint; return true;
-    case e_uint:        m_data.uint = ~m_data.uint; return true;
-    case e_slong:       m_data.slong = ~m_data.slong; return true;
-    case e_ulong:       m_data.ulong = ~m_data.ulong; return true;
-    case e_slonglong:   m_data.slonglong = ~m_data.slonglong; return true;
-    case e_ulonglong:   m_data.ulonglong = ~m_data.ulonglong; return true;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128:
+        m_integer = ~m_integer; return true;
 
     case e_void:
     case e_float:
@@ -1523,15 +2707,23 @@ lldb_private::operator+ (const Scalar& l
         switch (result.m_type)
         {
         case Scalar::e_void:            break;
-        case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        + b->m_data.sint;       break;
-        case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        + b->m_data.uint;       break;
-        case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       + b->m_data.slong;      break;
-        case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       + b->m_data.ulong;      break;
-        case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   + b->m_data.slonglong;  break;
-        case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   + b->m_data.ulonglong;  break;
-        case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         + b->m_data.flt;        break;
-        case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         + b->m_data.dbl;        break;
-        case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        + b->m_data.ldbl;       break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            result.m_integer = a->m_integer + b->m_integer;  break;
+        case Scalar::e_float:
+        case Scalar::e_double:
+        case Scalar::e_long_double:
+            result.m_float = a->m_float + b->m_float; break;
         }
     }
     return result;
@@ -1550,15 +2742,23 @@ lldb_private::operator- (const Scalar& l
         switch (result.m_type)
         {
         case Scalar::e_void:            break;
-        case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        - b->m_data.sint;       break;
-        case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        - b->m_data.uint;       break;
-        case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       - b->m_data.slong;      break;
-        case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       - b->m_data.ulong;      break;
-        case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   - b->m_data.slonglong;  break;
-        case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   - b->m_data.ulonglong;  break;
-        case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         - b->m_data.flt;        break;
-        case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         - b->m_data.dbl;        break;
-        case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        - b->m_data.ldbl;       break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:       
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            result.m_integer = a->m_integer - b->m_integer;  break;
+        case Scalar::e_float:
+        case Scalar::e_double:
+        case Scalar::e_long_double:
+            result.m_float = a->m_float - b->m_float; break;
         }
     }
     return result;
@@ -1576,16 +2776,35 @@ lldb_private::operator/ (const Scalar& l
         switch (result.m_type)
         {
         case Scalar::e_void:            break;
-
-        case Scalar::e_sint:            if (b->m_data.sint != 0)        { result.m_data.sint = a->m_data.sint/ b->m_data.sint; return result; } break;
-        case Scalar::e_uint:            if (b->m_data.uint != 0)        { result.m_data.uint = a->m_data.uint / b->m_data.uint; return result; } break;
-        case Scalar::e_slong:           if (b->m_data.slong != 0)       { result.m_data.slong = a->m_data.slong / b->m_data.slong; return result; } break;
-        case Scalar::e_ulong:           if (b->m_data.ulong != 0)       { result.m_data.ulong = a->m_data.ulong / b->m_data.ulong; return result; } break;
-        case Scalar::e_slonglong:       if (b->m_data.slonglong != 0)   { result.m_data.slonglong = a->m_data.slonglong / b->m_data.slonglong; return result; } break;
-        case Scalar::e_ulonglong:       if (b->m_data.ulonglong != 0)   { result.m_data.ulonglong = a->m_data.ulonglong / b->m_data.ulonglong; return result; } break;
-        case Scalar::e_float:           if (b->m_data.flt != 0.0f)      { result.m_data.flt = a->m_data.flt / b->m_data.flt; return result; } break;
-        case Scalar::e_double:      if (b->m_data.dbl != 0.0)       { result.m_data.dbl = a->m_data.dbl / b->m_data.dbl; return result; } break;
-        case Scalar::e_long_double: if (b->m_data.ldbl != 0.0)      { result.m_data.ldbl = a->m_data.ldbl / b->m_data.ldbl; return result; } break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+        {
+            if (b->m_integer != 0)
+            {
+                result.m_integer = *a->m_integer.getRawData() / *b->m_integer.getRawData();
+                return result;
+            }
+            break;
+        }
+        case Scalar::e_float:
+        case Scalar::e_double:
+        case Scalar::e_long_double:
+            if (b->m_float.isZero())
+            {
+                result.m_float = a->m_float / b->m_float;
+                return result;
+            }
+            break;
         }
     }
     // For division only, the only way it should make it here is if a promotion failed,
@@ -1606,15 +2825,23 @@ lldb_private::operator* (const Scalar& l
         switch (result.m_type)
         {
         case Scalar::e_void:            break;
-        case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        * b->m_data.sint;       break;
-        case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        * b->m_data.uint;       break;
-        case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       * b->m_data.slong;      break;
-        case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       * b->m_data.ulong;      break;
-        case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   * b->m_data.slonglong;  break;
-        case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   * b->m_data.ulonglong;  break;
-        case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         * b->m_data.flt;        break;
-        case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         * b->m_data.dbl;        break;
-        case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        * b->m_data.ldbl;       break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:       
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            result.m_integer = a->m_integer * b->m_integer;  break;
+        case Scalar::e_float:
+        case Scalar::e_double:
+        case Scalar::e_long_double:
+            result.m_float = a->m_float * b->m_float; break;
         }
     }
     return result;
@@ -1631,13 +2858,19 @@ lldb_private::operator& (const Scalar& l
     {
         switch (result.m_type)
         {
-        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        & b->m_data.sint;       break;
-        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        & b->m_data.uint;       break;
-        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       & b->m_data.slong;      break;
-        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       & b->m_data.ulong;      break;
-        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   & b->m_data.slonglong;  break;
-        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   & b->m_data.ulonglong;  break;
-
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            result.m_integer = a->m_integer & b->m_integer;  break;
         case Scalar::e_void:
         case Scalar::e_float:
         case Scalar::e_double:
@@ -1661,12 +2894,19 @@ lldb_private::operator| (const Scalar& l
     {
         switch (result.m_type)
         {
-        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        | b->m_data.sint;       break;
-        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        | b->m_data.uint;       break;
-        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       | b->m_data.slong;      break;
-        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       | b->m_data.ulong;      break;
-        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   | b->m_data.slonglong;  break;
-        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   | b->m_data.ulonglong;  break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            result.m_integer = a->m_integer | b->m_integer;  break;
 
         case Scalar::e_void:
         case Scalar::e_float:
@@ -1692,12 +2932,27 @@ lldb_private::operator% (const Scalar& l
         switch (result.m_type)
         {
         default:                    break;
-        case Scalar::e_sint:        if (b->m_data.sint != 0)        {   result.m_data.sint      = a->m_data.sint        % b->m_data.sint;       return result;  }   break;
-        case Scalar::e_uint:        if (b->m_data.uint != 0)        {   result.m_data.uint      = a->m_data.uint        % b->m_data.uint;       return result;  }   break;
-        case Scalar::e_slong:       if (b->m_data.slong != 0)       {   result.m_data.slong     = a->m_data.slong       % b->m_data.slong;      return result;  }   break;
-        case Scalar::e_ulong:       if (b->m_data.ulong != 0)       {   result.m_data.ulong     = a->m_data.ulong       % b->m_data.ulong;      return result;  }   break;
-        case Scalar::e_slonglong:   if (b->m_data.slonglong != 0)   {   result.m_data.slonglong = a->m_data.slonglong   % b->m_data.slonglong;  return result;  }   break;
-        case Scalar::e_ulonglong:   if (b->m_data.ulonglong != 0)   {   result.m_data.ulonglong = a->m_data.ulonglong   % b->m_data.ulonglong;  return result;  }   break;
+             case Scalar::e_void:            break;
+             case Scalar::e_schar:
+             case Scalar::e_uchar:
+             case Scalar::e_sshort:
+             case Scalar::e_ushort:
+             case Scalar::e_sint:
+             case Scalar::e_uint:
+             case Scalar::e_slong:
+             case Scalar::e_ulong:
+             case Scalar::e_slonglong:
+             case Scalar::e_ulonglong:
+             case Scalar::e_sint128:
+             case Scalar::e_uint128:
+             {
+                 if (b->m_integer != 0)
+                 {
+                     result.m_integer = *a->m_integer.getRawData() % *b->m_integer.getRawData();
+                     return result;
+                 }
+                 break;
+             }
         }
     }
     result.m_type = Scalar::e_void;
@@ -1715,12 +2970,19 @@ lldb_private::operator^ (const Scalar& l
     {
         switch (result.m_type)
         {
-        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        ^ b->m_data.sint;       break;
-        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        ^ b->m_data.uint;       break;
-        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       ^ b->m_data.slong;      break;
-        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       ^ b->m_data.ulong;      break;
-        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   ^ b->m_data.slonglong;  break;
-        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   ^ b->m_data.ulonglong;  break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            result.m_integer = a->m_integer ^ b->m_integer;  break;
 
         case Scalar::e_void:
         case Scalar::e_float:
@@ -1754,21 +3016,21 @@ lldb_private::operator>> (const Scalar&
 unsigned int
 Scalar::RawUInt () const
 {
-    return m_data.uint;
+    return *(const uint_t *) m_integer.getRawData();
 }
 
 // Return the raw unsigned long without any casting or conversion
 unsigned long
 Scalar::RawULong () const
 {
-    return m_data.ulong;
+    return *(const ulong_t *) m_integer.getRawData();
 }
 
 // Return the raw unsigned long long without any casting or conversion
 unsigned long long
 Scalar::RawULongLong () const
 {
-    return m_data.ulonglong;
+    return *(const ulonglong_t *) m_integer.getRawData();
 }
 
 
@@ -1801,9 +3063,11 @@ Scalar::SetValueFromCString (const char
                 m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize (byte_size);
                 switch (m_type)
                 {
-                case e_uint:        m_data.uint = (uint_t)uval64;           break;
-                case e_ulong:       m_data.ulong = (ulong_t)uval64;         break;
-                case e_ulonglong:   m_data.ulonglong = (ulonglong_t)uval64; break;
+                case e_uchar:       m_integer = llvm::APInt(sizeof(uchar_t) * 8, uval64, false);           break;
+                case e_ushort:      m_integer = llvm::APInt(sizeof(ushort_t) * 8, uval64, false);           break;
+                case e_uint:        m_integer = llvm::APInt(sizeof(uint_t) * 8, uval64, false);           break;
+                case e_ulong:       m_integer = llvm::APInt(sizeof(ulong_t) * 8, uval64, false);         break;
+                case e_ulonglong:   m_integer = llvm::APInt(sizeof(ulonglong_t) * 8, uval64, false); break;
                 default:
                     error.SetErrorStringWithFormat("unsupported unsigned integer byte size: %" PRIu64 "", (uint64_t)byte_size);
                     break;
@@ -1830,9 +3094,11 @@ Scalar::SetValueFromCString (const char
                 m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize (byte_size);
                 switch (m_type)
                 {
-                case e_sint:        m_data.sint = (sint_t)sval64;           break;
-                case e_slong:       m_data.slong = (slong_t)sval64;         break;
-                case e_slonglong:   m_data.slonglong = (slonglong_t)sval64; break;
+                case e_schar:       m_integer = llvm::APInt(sizeof(schar_t) * 8, sval64, true);           break;
+                case e_sshort:      m_integer = llvm::APInt(sizeof(sshort_t) * 8, sval64, true);           break;
+                case e_sint:        m_integer = llvm::APInt(sizeof(sint_t) * 8, sval64, true);           break;
+                case e_slong:       m_integer = llvm::APInt(sizeof(slong_t) * 8, sval64, true);         break;
+                case e_slonglong:   m_integer = llvm::APInt(sizeof(slonglong_t) * 8, sval64, true); break;
                 default:
                     error.SetErrorStringWithFormat("unsupported signed integer byte size: %" PRIu64 "", (uint64_t)byte_size);
                     break;
@@ -1847,24 +3113,36 @@ Scalar::SetValueFromCString (const char
         break;
 
     case eEncodingIEEE754:
+        static float f_val;
+        static double d_val;
+        static long double l_val;
         if (byte_size == sizeof (float))
         {
-            if (::sscanf (value_str, "%f", &m_data.flt) == 1)
+            if (::sscanf (value_str, "%f", &f_val) == 1)
+            {
+                m_float = llvm::APFloat(f_val);
                 m_type = e_float;
+            }
             else
                 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
         }
         else if (byte_size == sizeof (double))
         {
-            if (::sscanf (value_str, "%lf", &m_data.dbl) == 1)
+            if (::sscanf (value_str, "%lf", &d_val) == 1)
+            {
+                m_float = llvm::APFloat(d_val);
                 m_type = e_double;
+            }
             else
                 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
         }
         else if (byte_size == sizeof (long double))
         {
-            if (::sscanf (value_str, "%Lf", &m_data.ldbl) == 1)
+            if (::sscanf (value_str, "%Lf", &l_val) == 1)
+            {
+                m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&l_val)->x));
                 m_type = e_long_double;
+            }
             else
                 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
         }
@@ -1890,6 +3168,7 @@ Scalar::SetValueFromData (DataExtractor
 {
     Error error;
     
+    type128 int128;
     switch (encoding)
     {
     case lldb::eEncodingInvalid:
@@ -1904,10 +3183,25 @@ Scalar::SetValueFromData (DataExtractor
             
             switch (byte_size)
             {
-            case 1: operator=((uint8_t)data.GetU8(&offset)); break;
-            case 2: operator=((uint16_t)data.GetU16(&offset)); break;
-            case 4: operator=((uint32_t)data.GetU32(&offset)); break;
-            case 8: operator=((uint64_t)data.GetU64(&offset)); break;
+            case 1:  operator=((uint8_t)data.GetU8(&offset)); break;
+            case 2:  operator=((uint16_t)data.GetU16(&offset)); break;
+            case 4:  operator=((uint32_t)data.GetU32(&offset)); break;
+            case 8:  operator=((uint64_t)data.GetU64(&offset)); break;
+            case 16: 
+            {
+                if (data.GetByteOrder() == eByteOrderBig)
+                {
+                    int128.x[1] = (uint64_t)data.GetU64 (&offset);
+                    int128.x[0] = (uint64_t)data.GetU64 (&offset + 1);
+                }
+                else
+                {
+                    int128.x[0] = (uint64_t)data.GetU64 (&offset);
+                    int128.x[1] = (uint64_t)data.GetU64 (&offset + 1);
+                }
+                operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
+                break;
+            }
             default:
                 error.SetErrorStringWithFormat("unsupported unsigned integer byte size: %" PRIu64 "", (uint64_t)byte_size);
                 break;
@@ -1924,6 +3218,21 @@ Scalar::SetValueFromData (DataExtractor
             case 2: operator=((int16_t)data.GetU16(&offset)); break;
             case 4: operator=((int32_t)data.GetU32(&offset)); break;
             case 8: operator=((int64_t)data.GetU64(&offset)); break;
+            case 16:
+            {
+                if (data.GetByteOrder() == eByteOrderBig)
+                {
+                    int128.x[1] = (uint64_t)data.GetU64 (&offset);
+                    int128.x[0] = (uint64_t)data.GetU64 (&offset + 1);
+                }
+                else
+                {
+                    int128.x[0] = (uint64_t)data.GetU64 (&offset);
+                    int128.x[1] = (uint64_t)data.GetU64 (&offset + 1);
+                }
+                operator=(llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, int128.x));
+                break;
+            }
             default:
                 error.SetErrorStringWithFormat("unsupported signed integer byte size: %" PRIu64 "", (uint64_t)byte_size);
                 break;
@@ -1963,50 +3272,28 @@ Scalar::SignExtend (uint32_t sign_bit_po
         case Scalar::e_double:
         case Scalar::e_long_double: 
             return false;
-            
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
         case Scalar::e_sint:            
         case Scalar::e_uint:
-            if (max_bit_pos == sign_bit_pos)
-                return true;
-            else if (sign_bit_pos < (max_bit_pos-1))
-            {
-                unsigned int sign_bit = 1u << sign_bit_pos;
-                if (m_data.uint & sign_bit)
-                {
-                    const unsigned int mask = ~(sign_bit) + 1u;
-                    m_data.uint |= mask;
-                }
-                return true;
-            }
-            break;
-            
         case Scalar::e_slong:
         case Scalar::e_ulong:
-            if (max_bit_pos == sign_bit_pos)
-                return true;
-            else if (sign_bit_pos < (max_bit_pos-1))
-            {
-                unsigned long sign_bit = 1ul << sign_bit_pos;
-                if (m_data.ulong & sign_bit)
-                {
-                    const unsigned long mask = ~(sign_bit) + 1ul;
-                    m_data.ulong |= mask;
-                }
-                return true;
-            }
-            break;
-            
         case Scalar::e_slonglong:
         case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
             if (max_bit_pos == sign_bit_pos)
                 return true;
             else if (sign_bit_pos < (max_bit_pos-1))
             {
-                unsigned long long sign_bit = 1ull << sign_bit_pos;
-                if (m_data.ulonglong & sign_bit)
+                llvm::APInt sign_bit = llvm::APInt::getSignBit(sign_bit_pos + 1);
+                llvm::APInt bitwize_and = m_integer & sign_bit;
+                if (bitwize_and.getBoolValue())
                 {
-                    const unsigned long long mask = ~(sign_bit) + 1ull;
-                    m_data.ulonglong |= mask;
+                    const llvm::APInt mask = ~(sign_bit) + llvm::APInt(m_integer.getBitWidth(), 1); 
+                    m_integer |= mask;
                 }
                 return true;
             }
@@ -2053,66 +3340,44 @@ Scalar::ExtractBitfield (uint32_t bit_si
 
     uint32_t msbit = bit_offset + bit_size - 1;
     uint32_t lsbit = bit_offset;
+    uint64_t result;
     switch (m_type)
     {
         case Scalar::e_void:
             break;
             
         case e_float:
-            if (sizeof(m_data.flt) == sizeof(sint_t))
-                m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
-            else if (sizeof(m_data.flt) == sizeof(ulong_t))
-                m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
-            else if (sizeof(m_data.flt) == sizeof(ulonglong_t))
-                m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
-            else
-                return false;
+            result = SignedBits ((uint64_t )m_float.convertToFloat(), msbit, lsbit);
+            m_float = llvm::APFloat((float_t)result);
             return true;
-            
         case e_double:
-            if (sizeof(m_data.dbl) == sizeof(sint_t))
-                m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
-            else if (sizeof(m_data.dbl) == sizeof(ulong_t))
-                m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
-            else if (sizeof(m_data.dbl) == sizeof(ulonglong_t))
-                m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
-            else
-                return false;
-            return true;
-            
+            result = SignedBits ((uint64_t )m_float.convertToDouble(), msbit, lsbit);
+            m_float = llvm::APFloat((double_t)result);
         case e_long_double:
-            if (sizeof(m_data.ldbl) == sizeof(sint_t))
-                m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
-            else if (sizeof(m_data.ldbl) == sizeof(ulong_t))
-                m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
-            else if (sizeof(m_data.ldbl) == sizeof(ulonglong_t))
-                m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
+            m_integer = m_float.bitcastToAPInt();
+            result = SignedBits (*m_integer.getRawData(), msbit, lsbit);
+            if(m_ieee_quad)
+                m_float = llvm::APFloat(llvm::APFloat::IEEEquad, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&result)->x));
             else
-                return false;
+                m_float = llvm::APFloat(llvm::APFloat::x87DoubleExtended, llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)&result)->x));
             return true;
             
+        case Scalar::e_schar:
+        case Scalar::e_sshort:
         case Scalar::e_sint:
-            m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
-            return true;
-
-        case Scalar::e_uint:
-            m_data.uint = (uint_t)UnsignedBits (m_data.uint, msbit, lsbit);
-            return true;
-            
         case Scalar::e_slong:
-            m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
-            return true;
-
-        case Scalar::e_ulong:
-            m_data.ulong = (ulong_t)UnsignedBits (m_data.ulong, msbit, lsbit);
-            return true;
-            
         case Scalar::e_slonglong:
-            m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
+        case Scalar::e_sint128:
+            m_integer = SignedBits (*m_integer.getRawData(), msbit, lsbit);
             return true;
 
+        case Scalar::e_uchar:
+        case Scalar::e_ushort:
+        case Scalar::e_uint:
+        case Scalar::e_ulong:
         case Scalar::e_ulonglong:
-            m_data.ulonglong = (ulonglong_t)UnsignedBits (m_data.ulonglong, msbit, lsbit);
+        case Scalar::e_uint128:
+            m_integer = UnsignedBits (*m_integer.getRawData(), msbit, lsbit);
             return true;
     }
     return false;
@@ -2132,18 +3397,29 @@ lldb_private::operator== (const Scalar&
     Scalar temp_value;
     const Scalar* a;
     const Scalar* b;
+    llvm::APFloat::cmpResult result;
     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
     {
     case Scalar::e_void:            break;
-    case Scalar::e_sint:            return a->m_data.sint       == b->m_data.sint;
-    case Scalar::e_uint:            return a->m_data.uint       == b->m_data.uint;
-    case Scalar::e_slong:           return a->m_data.slong      == b->m_data.slong;
-    case Scalar::e_ulong:           return a->m_data.ulong      == b->m_data.ulong;
-    case Scalar::e_slonglong:       return a->m_data.slonglong  == b->m_data.slonglong;
-    case Scalar::e_ulonglong:       return a->m_data.ulonglong  == b->m_data.ulonglong;
-    case Scalar::e_float:           return a->m_data.flt        == b->m_data.flt;
-    case Scalar::e_double:      return a->m_data.dbl        == b->m_data.dbl;
-    case Scalar::e_long_double: return a->m_data.ldbl       == b->m_data.ldbl;
+    case Scalar::e_schar:
+    case Scalar::e_uchar:
+    case Scalar::e_sshort:
+    case Scalar::e_ushort:
+    case Scalar::e_sint:
+    case Scalar::e_uint:
+    case Scalar::e_slong:
+    case Scalar::e_ulong:
+    case Scalar::e_slonglong:
+    case Scalar::e_ulonglong:
+    case Scalar::e_sint128:
+    case Scalar::e_uint128:
+        return a->m_integer == b->m_integer;
+    case Scalar::e_float:
+    case Scalar::e_double:
+    case Scalar::e_long_double:
+        result = a->m_float.compare(b->m_float);
+        if(result == llvm::APFloat::cmpEqual)
+            return true;
     }
     return false;
 }
@@ -2158,18 +3434,29 @@ lldb_private::operator!= (const Scalar&
     Scalar temp_value;  // A temp value that might get a copy of either promoted value
     const Scalar* a;
     const Scalar* b;
+    llvm::APFloat::cmpResult result;
     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
     {
     case Scalar::e_void:            break;
-    case Scalar::e_sint:            return a->m_data.sint       != b->m_data.sint;
-    case Scalar::e_uint:            return a->m_data.uint       != b->m_data.uint;
-    case Scalar::e_slong:           return a->m_data.slong      != b->m_data.slong;
-    case Scalar::e_ulong:           return a->m_data.ulong      != b->m_data.ulong;
-    case Scalar::e_slonglong:       return a->m_data.slonglong  != b->m_data.slonglong;
-    case Scalar::e_ulonglong:       return a->m_data.ulonglong  != b->m_data.ulonglong;
-    case Scalar::e_float:           return a->m_data.flt        != b->m_data.flt;
-    case Scalar::e_double:      return a->m_data.dbl        != b->m_data.dbl;
-    case Scalar::e_long_double: return a->m_data.ldbl       != b->m_data.ldbl;
+    case Scalar::e_schar:
+    case Scalar::e_uchar:
+    case Scalar::e_sshort:
+    case Scalar::e_ushort:
+    case Scalar::e_sint:
+    case Scalar::e_uint:
+    case Scalar::e_slong:
+    case Scalar::e_ulong:
+    case Scalar::e_slonglong:
+    case Scalar::e_ulonglong:
+    case Scalar::e_sint128:
+    case Scalar::e_uint128:
+        return a->m_integer != b->m_integer;
+    case Scalar::e_float:
+    case Scalar::e_double:
+    case Scalar::e_long_double:
+        result = a->m_float.compare(b->m_float);
+        if(result != llvm::APFloat::cmpEqual)
+            return true;
     }
     return true;
 }
@@ -2183,18 +3470,29 @@ lldb_private::operator< (const Scalar& l
     Scalar temp_value;
     const Scalar* a;
     const Scalar* b;
+    llvm::APFloat::cmpResult result;
     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
     {
     case Scalar::e_void:            break;
-    case Scalar::e_sint:            return a->m_data.sint       < b->m_data.sint;
-    case Scalar::e_uint:            return a->m_data.uint       < b->m_data.uint;
-    case Scalar::e_slong:           return a->m_data.slong      < b->m_data.slong;
-    case Scalar::e_ulong:           return a->m_data.ulong      < b->m_data.ulong;
-    case Scalar::e_slonglong:       return a->m_data.slonglong  < b->m_data.slonglong;
-    case Scalar::e_ulonglong:       return a->m_data.ulonglong  < b->m_data.ulonglong;
-    case Scalar::e_float:           return a->m_data.flt        < b->m_data.flt;
-    case Scalar::e_double:      return a->m_data.dbl        < b->m_data.dbl;
-    case Scalar::e_long_double: return a->m_data.ldbl       < b->m_data.ldbl;
+    case Scalar::e_schar:
+    case Scalar::e_uchar:
+    case Scalar::e_sshort:
+    case Scalar::e_ushort:
+    case Scalar::e_sint:
+    case Scalar::e_uint:
+    case Scalar::e_slong:
+    case Scalar::e_ulong:
+    case Scalar::e_slonglong:
+    case Scalar::e_ulonglong:
+    case Scalar::e_sint128:
+    case Scalar::e_uint128:
+        return a->m_integer < b->m_integer;
+    case Scalar::e_float:
+    case Scalar::e_double:
+    case Scalar::e_long_double:
+        result = a->m_float.compare(b->m_float);
+        if(result == llvm::APFloat::cmpLessThan)
+            return true;
     }
     return false;
 }
@@ -2208,18 +3506,29 @@ lldb_private::operator<= (const Scalar&
     Scalar temp_value;
     const Scalar* a;
     const Scalar* b;
+    llvm::APFloat::cmpResult result;
     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
     {
     case Scalar::e_void:            break;
-    case Scalar::e_sint:            return a->m_data.sint       <= b->m_data.sint;
-    case Scalar::e_uint:            return a->m_data.uint       <= b->m_data.uint;
-    case Scalar::e_slong:           return a->m_data.slong      <= b->m_data.slong;
-    case Scalar::e_ulong:           return a->m_data.ulong      <= b->m_data.ulong;
-    case Scalar::e_slonglong:       return a->m_data.slonglong  <= b->m_data.slonglong;
-    case Scalar::e_ulonglong:       return a->m_data.ulonglong  <= b->m_data.ulonglong;
-    case Scalar::e_float:           return a->m_data.flt        <= b->m_data.flt;
-    case Scalar::e_double:      return a->m_data.dbl        <= b->m_data.dbl;
-    case Scalar::e_long_double: return a->m_data.ldbl       <= b->m_data.ldbl;
+    case Scalar::e_schar:
+    case Scalar::e_uchar:
+    case Scalar::e_sshort:
+    case Scalar::e_ushort:
+    case Scalar::e_sint:
+    case Scalar::e_uint:
+    case Scalar::e_slong:
+    case Scalar::e_ulong:
+    case Scalar::e_slonglong:
+    case Scalar::e_ulonglong:
+    case Scalar::e_sint128:
+    case Scalar::e_uint128:
+        return a->m_integer <= b->m_integer;
+    case Scalar::e_float:
+    case Scalar::e_double:
+    case Scalar::e_long_double:
+        result = a->m_float.compare(b->m_float);
+        if(result == llvm::APFloat::cmpLessThan || result == llvm::APFloat::cmpEqual)
+            return true;
     }
     return false;
 }
@@ -2234,18 +3543,28 @@ lldb_private::operator> (const Scalar& l
     Scalar temp_value;
     const Scalar* a;
     const Scalar* b;
+    llvm::APFloat::cmpResult result;
     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
     {
-    case Scalar::e_void:            break;
-    case Scalar::e_sint:            return a->m_data.sint       > b->m_data.sint;
-    case Scalar::e_uint:            return a->m_data.uint       > b->m_data.uint;
-    case Scalar::e_slong:           return a->m_data.slong      > b->m_data.slong;
-    case Scalar::e_ulong:           return a->m_data.ulong      > b->m_data.ulong;
-    case Scalar::e_slonglong:       return a->m_data.slonglong  > b->m_data.slonglong;
-    case Scalar::e_ulonglong:       return a->m_data.ulonglong  > b->m_data.ulonglong;
-    case Scalar::e_float:           return a->m_data.flt        > b->m_data.flt;
-    case Scalar::e_double:      return a->m_data.dbl        > b->m_data.dbl;
-    case Scalar::e_long_double: return a->m_data.ldbl       > b->m_data.ldbl;
+        case Scalar::e_void:            break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+        case Scalar::e_float:
+        case Scalar::e_double:
+        case Scalar::e_long_double:
+        result = a->m_float.compare(b->m_float);
+        if(result == llvm::APFloat::cmpGreaterThan)
+            return true;
     }
     return false;
 }
@@ -2259,22 +3578,81 @@ lldb_private::operator>= (const Scalar&
     Scalar temp_value;
     const Scalar* a;
     const Scalar* b;
+    llvm::APFloat::cmpResult result;
     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
     {
-    case Scalar::e_void:            break;
-    case Scalar::e_sint:            return a->m_data.sint       >= b->m_data.sint;
-    case Scalar::e_uint:            return a->m_data.uint       >= b->m_data.uint;
-    case Scalar::e_slong:           return a->m_data.slong      >= b->m_data.slong;
-    case Scalar::e_ulong:           return a->m_data.ulong      >= b->m_data.ulong;
-    case Scalar::e_slonglong:       return a->m_data.slonglong  >= b->m_data.slonglong;
-    case Scalar::e_ulonglong:       return a->m_data.ulonglong  >= b->m_data.ulonglong;
-    case Scalar::e_float:           return a->m_data.flt        >= b->m_data.flt;
-    case Scalar::e_double:      return a->m_data.dbl        >= b->m_data.dbl;
-    case Scalar::e_long_double: return a->m_data.ldbl       >= b->m_data.ldbl;
+        case Scalar::e_void:            break;
+        case Scalar::e_schar:
+        case Scalar::e_uchar:
+        case Scalar::e_sshort:
+        case Scalar::e_ushort:
+        case Scalar::e_sint:
+        case Scalar::e_uint:
+        case Scalar::e_slong:
+        case Scalar::e_ulong:
+        case Scalar::e_slonglong:
+        case Scalar::e_ulonglong:
+        case Scalar::e_sint128:
+        case Scalar::e_uint128:
+            return a->m_integer <= b->m_integer;
+        case Scalar::e_float:
+        case Scalar::e_double:
+        case Scalar::e_long_double:
+        result = a->m_float.compare(b->m_float);
+        if(result == llvm::APFloat::cmpGreaterThan || result == llvm::APFloat::cmpEqual)
+            return true;
     }
     return false;
 }
 
+bool
+Scalar::ClearBit (uint32_t bit)
+{
+    switch (m_type)
+    {
+    case e_void:
+        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128: m_integer.clearBit(bit); return true;
+    case e_float:
+    case e_double:
+    case e_long_double: break;
+    }
+    return false;
+}
 
-
-
+bool
+Scalar::SetBit (uint32_t bit)
+{
+    switch (m_type)
+    {
+    case e_void:
+        break;
+    case e_schar:
+    case e_uchar:
+    case e_sshort:
+    case e_ushort:
+    case e_sint:
+    case e_uint:
+    case e_slong:
+    case e_ulong:
+    case e_slonglong:
+    case e_ulonglong:
+    case e_sint128:
+    case e_uint128: m_integer.setBit(bit); return true;
+    case e_float:
+    case e_double:
+    case e_long_double: break;
+    }
+    return false;
+}

Modified: lldb/trunk/source/Core/ValueObject.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Core/ValueObject.cpp (original)
+++ lldb/trunk/source/Core/ValueObject.cpp Fri Aug  7 01:39:38 2015
@@ -1897,7 +1897,7 @@ ValueObject::SetValueFromCString (const
         // If the value is already a scalar, then let the scalar change itself:
         m_value.GetScalar().SetValueFromCString (value_str, encoding, byte_size);
     }
-    else if (byte_size <= Scalar::GetMaxByteSize())
+    else if (byte_size <= 16)
     {
         // If the value fits in a scalar, then make a new scalar and again let the
         // scalar code do the conversion, then figure out where to put the new value.

Modified: lldb/trunk/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp (original)
+++ lldb/trunk/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp Fri Aug  7 01:39:38 2015
@@ -33,7 +33,7 @@
 #include "llvm/ADT/STLExtras.h"
 
 #include "Plugins/Process/Utility/InstructionUtils.h"
-#include "Plugins/Process/Utility/RegisterContext_mips64.h"  //mips32 has same registers nos as mips64
+#include "Plugins/Process/Utility/RegisterContext_mips.h"  //mips32 has same registers nos as mips64
 
 using namespace lldb;
 using namespace lldb_private;
@@ -302,38 +302,38 @@ EmulateInstructionMIPS::GetRegisterName
         case gcc_dwarf_bad_mips:      return "bad";
         case gcc_dwarf_cause_mips:    return "cause";
         case gcc_dwarf_pc_mips:       return "pc";
-        case gcc_dwarf_f0_mips:       return "fp_reg[0]";
-        case gcc_dwarf_f1_mips:       return "fp_reg[1]";
-        case gcc_dwarf_f2_mips:       return "fp_reg[2]";
-        case gcc_dwarf_f3_mips:       return "fp_reg[3]";
-        case gcc_dwarf_f4_mips:       return "fp_reg[4]";
-        case gcc_dwarf_f5_mips:       return "fp_reg[5]";
-        case gcc_dwarf_f6_mips:       return "fp_reg[6]";
-        case gcc_dwarf_f7_mips:       return "fp_reg[7]";
-        case gcc_dwarf_f8_mips:       return "fp_reg[8]";
-        case gcc_dwarf_f9_mips:       return "fp_reg[9]";
-        case gcc_dwarf_f10_mips:      return "fp_reg[10]";
-        case gcc_dwarf_f11_mips:      return "fp_reg[11]";
-        case gcc_dwarf_f12_mips:      return "fp_reg[12]";
-        case gcc_dwarf_f13_mips:      return "fp_reg[13]";
-        case gcc_dwarf_f14_mips:      return "fp_reg[14]";
-        case gcc_dwarf_f15_mips:      return "fp_reg[15]";
-        case gcc_dwarf_f16_mips:      return "fp_reg[16]";
-        case gcc_dwarf_f17_mips:      return "fp_reg[17]";
-        case gcc_dwarf_f18_mips:      return "fp_reg[18]";
-        case gcc_dwarf_f19_mips:      return "fp_reg[19]";
-        case gcc_dwarf_f20_mips:      return "fp_reg[20]";
-        case gcc_dwarf_f21_mips:      return "fp_reg[21]";
-        case gcc_dwarf_f22_mips:      return "fp_reg[22]";
-        case gcc_dwarf_f23_mips:      return "fp_reg[23]";
-        case gcc_dwarf_f24_mips:      return "fp_reg[24]";
-        case gcc_dwarf_f25_mips:      return "fp_reg[25]";
-        case gcc_dwarf_f26_mips:      return "fp_reg[26]";
-        case gcc_dwarf_f27_mips:      return "fp_reg[27]";
-        case gcc_dwarf_f28_mips:      return "fp_reg[28]";
-        case gcc_dwarf_f29_mips:      return "fp_reg[29]";
-        case gcc_dwarf_f30_mips:      return "fp_reg[30]";
-        case gcc_dwarf_f31_mips:      return "fp_reg[31]";
+        case gcc_dwarf_f0_mips:       return "f0";
+        case gcc_dwarf_f1_mips:       return "f1";
+        case gcc_dwarf_f2_mips:       return "f2";
+        case gcc_dwarf_f3_mips:       return "f3";
+        case gcc_dwarf_f4_mips:       return "f4";
+        case gcc_dwarf_f5_mips:       return "f5";
+        case gcc_dwarf_f6_mips:       return "f6";
+        case gcc_dwarf_f7_mips:       return "f7";
+        case gcc_dwarf_f8_mips:       return "f8";
+        case gcc_dwarf_f9_mips:       return "f9";
+        case gcc_dwarf_f10_mips:      return "f10";
+        case gcc_dwarf_f11_mips:      return "f11";
+        case gcc_dwarf_f12_mips:      return "f12";
+        case gcc_dwarf_f13_mips:      return "f13";
+        case gcc_dwarf_f14_mips:      return "f14";
+        case gcc_dwarf_f15_mips:      return "f15";
+        case gcc_dwarf_f16_mips:      return "f16";
+        case gcc_dwarf_f17_mips:      return "f17";
+        case gcc_dwarf_f18_mips:      return "f18";
+        case gcc_dwarf_f19_mips:      return "f19";
+        case gcc_dwarf_f20_mips:      return "f20";
+        case gcc_dwarf_f21_mips:      return "f21";
+        case gcc_dwarf_f22_mips:      return "f22";
+        case gcc_dwarf_f23_mips:      return "f23";
+        case gcc_dwarf_f24_mips:      return "f24";
+        case gcc_dwarf_f25_mips:      return "f25";
+        case gcc_dwarf_f26_mips:      return "f26";
+        case gcc_dwarf_f27_mips:      return "f27";
+        case gcc_dwarf_f28_mips:      return "f28";
+        case gcc_dwarf_f29_mips:      return "f29";
+        case gcc_dwarf_f30_mips:      return "f30";
+        case gcc_dwarf_f31_mips:      return "f31";
         case gcc_dwarf_fcsr_mips:     return "fcsr";
         case gcc_dwarf_fir_mips:      return "fir";
     }

Modified: lldb/trunk/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp (original)
+++ lldb/trunk/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp Fri Aug  7 01:39:38 2015
@@ -33,7 +33,7 @@
 #include "llvm/ADT/STLExtras.h"
 
 #include "Plugins/Process/Utility/InstructionUtils.h"
-#include "Plugins/Process/Utility/RegisterContext_mips64.h"
+#include "Plugins/Process/Utility/RegisterContext_mips.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -302,38 +302,38 @@ EmulateInstructionMIPS64::GetRegisterNam
         case gcc_dwarf_bad_mips64:      return "bad";
         case gcc_dwarf_cause_mips64:    return "cause";
         case gcc_dwarf_pc_mips64:       return "pc";
-        case gcc_dwarf_f0_mips64:       return "fp_reg[0]";
-        case gcc_dwarf_f1_mips64:       return "fp_reg[1]";
-        case gcc_dwarf_f2_mips64:       return "fp_reg[2]";
-        case gcc_dwarf_f3_mips64:       return "fp_reg[3]";
-        case gcc_dwarf_f4_mips64:       return "fp_reg[4]";
-        case gcc_dwarf_f5_mips64:       return "fp_reg[5]";
-        case gcc_dwarf_f6_mips64:       return "fp_reg[6]";
-        case gcc_dwarf_f7_mips64:       return "fp_reg[7]";
-        case gcc_dwarf_f8_mips64:       return "fp_reg[8]";
-        case gcc_dwarf_f9_mips64:       return "fp_reg[9]";
-        case gcc_dwarf_f10_mips64:      return "fp_reg[10]";
-        case gcc_dwarf_f11_mips64:      return "fp_reg[11]";
-        case gcc_dwarf_f12_mips64:      return "fp_reg[12]";
-        case gcc_dwarf_f13_mips64:      return "fp_reg[13]";
-        case gcc_dwarf_f14_mips64:      return "fp_reg[14]";
-        case gcc_dwarf_f15_mips64:      return "fp_reg[15]";
-        case gcc_dwarf_f16_mips64:      return "fp_reg[16]";
-        case gcc_dwarf_f17_mips64:      return "fp_reg[17]";
-        case gcc_dwarf_f18_mips64:      return "fp_reg[18]";
-        case gcc_dwarf_f19_mips64:      return "fp_reg[19]";
-        case gcc_dwarf_f20_mips64:      return "fp_reg[20]";
-        case gcc_dwarf_f21_mips64:      return "fp_reg[21]";
-        case gcc_dwarf_f22_mips64:      return "fp_reg[22]";
-        case gcc_dwarf_f23_mips64:      return "fp_reg[23]";
-        case gcc_dwarf_f24_mips64:      return "fp_reg[24]";
-        case gcc_dwarf_f25_mips64:      return "fp_reg[25]";
-        case gcc_dwarf_f26_mips64:      return "fp_reg[26]";
-        case gcc_dwarf_f27_mips64:      return "fp_reg[27]";
-        case gcc_dwarf_f28_mips64:      return "fp_reg[28]";
-        case gcc_dwarf_f29_mips64:      return "fp_reg[29]";
-        case gcc_dwarf_f30_mips64:      return "fp_reg[30]";
-        case gcc_dwarf_f31_mips64:      return "fp_reg[31]";
+        case gcc_dwarf_f0_mips64:       return "f0";
+        case gcc_dwarf_f1_mips64:       return "f1";
+        case gcc_dwarf_f2_mips64:       return "f2";
+        case gcc_dwarf_f3_mips64:       return "f3";
+        case gcc_dwarf_f4_mips64:       return "f4";
+        case gcc_dwarf_f5_mips64:       return "f5";
+        case gcc_dwarf_f6_mips64:       return "f6";
+        case gcc_dwarf_f7_mips64:       return "f7";
+        case gcc_dwarf_f8_mips64:       return "f8";
+        case gcc_dwarf_f9_mips64:       return "f9";
+        case gcc_dwarf_f10_mips64:      return "f10";
+        case gcc_dwarf_f11_mips64:      return "f11";
+        case gcc_dwarf_f12_mips64:      return "f12";
+        case gcc_dwarf_f13_mips64:      return "f13";
+        case gcc_dwarf_f14_mips64:      return "f14";
+        case gcc_dwarf_f15_mips64:      return "f15";
+        case gcc_dwarf_f16_mips64:      return "f16";
+        case gcc_dwarf_f17_mips64:      return "f17";
+        case gcc_dwarf_f18_mips64:      return "f18";
+        case gcc_dwarf_f19_mips64:      return "f19";
+        case gcc_dwarf_f20_mips64:      return "f20";
+        case gcc_dwarf_f21_mips64:      return "f21";
+        case gcc_dwarf_f22_mips64:      return "f22";
+        case gcc_dwarf_f23_mips64:      return "f23";
+        case gcc_dwarf_f24_mips64:      return "f24";
+        case gcc_dwarf_f25_mips64:      return "f25";
+        case gcc_dwarf_f26_mips64:      return "f26";
+        case gcc_dwarf_f27_mips64:      return "f27";
+        case gcc_dwarf_f28_mips64:      return "f28";
+        case gcc_dwarf_f29_mips64:      return "f29";
+        case gcc_dwarf_f30_mips64:      return "f30";
+        case gcc_dwarf_f31_mips64:      return "f31";
         case gcc_dwarf_fcsr_mips64:     return "fcsr";
         case gcc_dwarf_fir_mips64:      return "fir";
     }

Modified: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux.cpp Fri Aug  7 01:39:38 2015
@@ -136,7 +136,7 @@ NativeRegisterContextLinux::ReadFPR()
 {
     void* buf = GetFPRBuffer();
     if (!buf)
-        return Error("GPR buffer is NULL");
+        return Error("FPR buffer is NULL");
     size_t buf_size = GetFPRSize();
 
     return DoReadFPR(buf, buf_size);
@@ -147,7 +147,7 @@ NativeRegisterContextLinux::WriteFPR()
 {
     void* buf = GetFPRBuffer();
     if (!buf)
-        return Error("GPR buffer is NULL");
+        return Error("FPR buffer is NULL");
     size_t buf_size = GetFPRSize();
 
     return DoWriteFPR(buf, buf_size);

Modified: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.cpp Fri Aug  7 01:39:38 2015
@@ -25,6 +25,10 @@
 #include "Plugins/Process/Linux/Procfs.h"
 #include "Plugins/Process/Utility/RegisterContextLinux_mips64.h"
 #include "Plugins/Process/Utility/RegisterContextLinux_mips.h"
+#define NT_MIPS_MSA 0x600
+#define CONFIG5_FRE (1 << 8)
+#define SR_FR (1 << 26)
+#define NUM_REGISTERS 32
 
 #include <sys/ptrace.h>
 #include <asm/ptrace.h>
@@ -118,12 +122,13 @@ namespace
         gpr_sp_mips,
         gpr_r30_mips,
         gpr_ra_mips,
+        gpr_sr_mips,
         gpr_mullo_mips,
         gpr_mulhi_mips,
-        gpr_pc_mips,
         gpr_badvaddr_mips,
-        gpr_sr_mips,
         gpr_cause_mips,
+        gpr_pc_mips,
+        gpr_config5_mips,
         LLDB_INVALID_REGNUM     // register sets need to end with this flag
     };
 
@@ -168,12 +173,60 @@ namespace
         fpr_f31_mips,
         fpr_fcsr_mips,
         fpr_fir_mips,
+        fpr_config5_mips,
         LLDB_INVALID_REGNUM     // register sets need to end with this flag
     };
 
     static_assert((sizeof(g_fp_regnums_mips) / sizeof(g_fp_regnums_mips[0])) - 1 == k_num_fpr_registers_mips,
                   "g_fp_regnums_mips has wrong number of register infos");
 
+    // mips MSA registers.
+    const uint32_t
+    g_msa_regnums_mips[] =
+    {
+        msa_w0_mips,
+        msa_w1_mips,
+        msa_w2_mips,
+        msa_w3_mips,
+        msa_w4_mips,
+        msa_w5_mips,
+        msa_w6_mips,
+        msa_w7_mips,
+        msa_w8_mips,
+        msa_w9_mips,
+        msa_w10_mips,
+        msa_w11_mips,
+        msa_w12_mips,
+        msa_w13_mips,
+        msa_w14_mips,
+        msa_w15_mips,
+        msa_w16_mips,
+        msa_w17_mips,
+        msa_w18_mips,
+        msa_w19_mips,
+        msa_w20_mips,
+        msa_w21_mips,
+        msa_w22_mips,
+        msa_w23_mips,
+        msa_w24_mips,
+        msa_w25_mips,
+        msa_w26_mips,
+        msa_w27_mips,
+        msa_w28_mips,
+        msa_w29_mips,
+        msa_w30_mips,
+        msa_w31_mips,
+        msa_fcsr_mips,
+        msa_fir_mips,
+        msa_mcsr_mips,
+        msa_mir_mips,
+        msa_config5_mips,
+        LLDB_INVALID_REGNUM     // register sets need to end with this flag
+    };
+
+    static_assert((sizeof(g_msa_regnums_mips) / sizeof(g_msa_regnums_mips[0])) - 1 == k_num_msa_registers_mips,
+                  "g_msa_regnums_mips has wrong number of register infos");
+
     // mips64 general purpose registers.
     const uint32_t
     g_gp_regnums_mips64[] =
@@ -210,14 +263,13 @@ namespace
         gpr_sp_mips64,
         gpr_r30_mips64,
         gpr_ra_mips64,
+        gpr_sr_mips64,
         gpr_mullo_mips64,
         gpr_mulhi_mips64,
-        gpr_pc_mips64,
         gpr_badvaddr_mips64,
-        gpr_sr_mips64,
         gpr_cause_mips64,
-        gpr_ic_mips64,
-        gpr_dummy_mips64,
+        gpr_pc_mips64,
+        gpr_config5_mips64,
         LLDB_INVALID_REGNUM     // register sets need to end with this flag
     };
 
@@ -262,16 +314,64 @@ namespace
         fpr_f31_mips64,
         fpr_fcsr_mips64,
         fpr_fir_mips64,
+        fpr_config5_mips64,
         LLDB_INVALID_REGNUM     // register sets need to end with this flag
     };
 
     static_assert((sizeof(g_fp_regnums_mips64) / sizeof(g_fp_regnums_mips64[0])) - 1 == k_num_fpr_registers_mips64,
                   "g_fp_regnums_mips64 has wrong number of register infos");
 
+    // mips64 MSA registers.
+    const uint32_t
+    g_msa_regnums_mips64[] =
+    {
+        msa_w0_mips64,
+        msa_w1_mips64,
+        msa_w2_mips64,
+        msa_w3_mips64,
+        msa_w4_mips64,
+        msa_w5_mips64,
+        msa_w6_mips64,
+        msa_w7_mips64,
+        msa_w8_mips64,
+        msa_w9_mips64,
+        msa_w10_mips64,
+        msa_w11_mips64,
+        msa_w12_mips64,
+        msa_w13_mips64,
+        msa_w14_mips64,
+        msa_w15_mips64,
+        msa_w16_mips64,
+        msa_w17_mips64,
+        msa_w18_mips64,
+        msa_w19_mips64,
+        msa_w20_mips64,
+        msa_w21_mips64,
+        msa_w22_mips64,
+        msa_w23_mips64,
+        msa_w24_mips64,
+        msa_w25_mips64,
+        msa_w26_mips64,
+        msa_w27_mips64,
+        msa_w28_mips64,
+        msa_w29_mips64,
+        msa_w30_mips64,
+        msa_w31_mips64,
+        msa_fcsr_mips64,
+        msa_fir_mips64,
+        msa_mcsr_mips64,
+        msa_mir_mips64,
+        msa_config5_mips64,
+        LLDB_INVALID_REGNUM     // register sets need to end with this flag
+    };
+
+    static_assert((sizeof(g_msa_regnums_mips64) / sizeof(g_msa_regnums_mips64[0])) - 1 == k_num_msa_registers_mips64,
+                  "g_msa_regnums_mips64 has wrong number of register infos");
+
     // Number of register sets provided by this context.
     enum
     {
-        k_num_register_sets = 2
+        k_num_register_sets = 3
     };
 
     // Register sets for mips.
@@ -279,7 +379,8 @@ namespace
     g_reg_sets_mips[k_num_register_sets] =
     {
         { "General Purpose Registers",  "gpr", k_num_gpr_registers_mips, g_gp_regnums_mips },
-        { "Floating Point Registers",   "fpu", k_num_fpr_registers_mips, g_fp_regnums_mips }
+        { "Floating Point Registers",   "fpu", k_num_fpr_registers_mips, g_fp_regnums_mips },
+        { "MSA Registers",              "msa", k_num_msa_registers_mips, g_msa_regnums_mips }
     };
 
     // Register sets for mips64.
@@ -287,7 +388,8 @@ namespace
     g_reg_sets_mips64[k_num_register_sets] =
     {
         { "General Purpose Registers",  "gpr", k_num_gpr_registers_mips64, g_gp_regnums_mips64 },
-        { "Floating Point Registers",   "fpu", k_num_fpr_registers_mips64, g_fp_regnums_mips64 }
+        { "Floating Point Registers",   "fpu", k_num_fpr_registers_mips64, g_fp_regnums_mips64 },
+        { "MSA Registers",              "msa", k_num_msa_registers_mips64, g_msa_regnums_mips64 },
     };
 
 } // end of anonymous namespace
@@ -300,7 +402,7 @@ NativeRegisterContextLinux::CreateHostNa
     return new NativeRegisterContextLinux_mips64(target_arch, native_thread, concrete_frame_idx);
 }
 
-#define REG_CONTEXT_SIZE (GetRegisterInfoInterface ().GetGPRSize () + sizeof(FPR_mips))
+#define REG_CONTEXT_SIZE (GetRegisterInfoInterface ().GetGPRSize () + sizeof(FPR_linux_mips) + sizeof(MSA_linux_mips))
 
 // ----------------------------------------------------------------------------
 // NativeRegisterContextLinux_mips64 members.
@@ -338,6 +440,8 @@ NativeRegisterContextLinux_mips64::Nativ
             m_reg_info.last_gpr             = k_last_gpr_mips;
             m_reg_info.first_fpr            = k_first_fpr_mips;
             m_reg_info.last_fpr             = k_last_fpr_mips;
+            m_reg_info.first_msa            = k_first_msa_mips;
+            m_reg_info.last_msa             = k_last_msa_mips;
             break;
         case llvm::Triple::mips64:
         case llvm::Triple::mips64el:
@@ -347,18 +451,27 @@ NativeRegisterContextLinux_mips64::Nativ
             m_reg_info.last_gpr             = k_last_gpr_mips64;
             m_reg_info.first_fpr            = k_first_fpr_mips64;
             m_reg_info.last_fpr             = k_last_fpr_mips64;
+            m_reg_info.first_msa            = k_first_msa_mips64;
+            m_reg_info.last_msa             = k_last_msa_mips64;
             break;
         default:
             assert(false && "Unhandled target architecture.");
             break;
     }
 
-    // Clear out the FPR state.
-    ::memset(&m_fpr, 0, sizeof(FPR_mips));
+    // Initialize m_iovec to point to the buffer and buffer size
+    // using the conventions of Berkeley style UIO structures, as required
+    // by PTRACE extensions.
+    m_iovec.iov_base = &m_msa;
+    m_iovec.iov_len = sizeof(MSA_linux_mips);
 
     // init h/w watchpoint addr map
     for (int index = 0;index <= MAX_NUM_WP; index++)
         hw_addr_map[index] = LLDB_INVALID_ADDRESS;
+
+    ::memset(&m_gpr, 0, sizeof(GPR_linux_mips));
+    ::memset(&m_fpr, 0, sizeof(FPR_linux_mips));
+    ::memset(&m_msa, 0, sizeof(MSA_linux_mips));
 }
 
 uint32_t
@@ -460,16 +573,38 @@ NativeRegisterContextLinux_mips64::ReadR
         return error;
     }
 
-    if (IsFPR(reg))
+    if (IsMSA(reg) && !IsMSAAvailable())
+    {
+        error.SetErrorString ("MSA not available on this processor");
+        return error;
+    }
+
+    if (IsMSA(reg) || IsFPR(reg))
     {
-        error = ReadFPR();
+        uint8_t *src;
+        type128 int128;
+
+        error = ReadCP1();
+
         if (!error.Success())
         {
-            error.SetErrorString ("failed to read floating point register");
+            error.SetErrorString ("failed to read co-processor 1 register");
             return error;
         }
-        assert (reg_info->byte_offset < sizeof(FPR_mips));
-        uint8_t *src = (uint8_t *)&m_fpr + reg_info->byte_offset;
+
+        if (IsFPR(reg))
+        {
+            assert (reg_info->byte_offset < sizeof(UserArea));
+            src = (uint8_t *)&m_fpr + reg_info->byte_offset - (sizeof(m_gpr));
+        }
+        else
+        {
+            assert (reg_info->byte_offset < sizeof(UserArea));
+            src = (uint8_t *)&m_msa + reg_info->byte_offset - (sizeof(m_gpr) + sizeof(m_fpr));
+        }
+        int128.x[0] = *(uint64_t *)src;
+        int128.x[1] = *(uint64_t *)(src + 8); 
+        llvm::APInt rhs = llvm::APInt(128, 2, int128.x);
         switch (reg_info->byte_size)
         {
             case 4:
@@ -478,6 +613,9 @@ NativeRegisterContextLinux_mips64::ReadR
             case 8:
                 reg_value.SetUInt64(*(uint64_t *)src);
                 break;
+            case 16:
+                reg_value.SetUInt128(rhs);
+                break;
             default:
                 assert(false && "Unhandled data size.");
                 error.SetErrorStringWithFormat ("unhandled byte size: %" PRIu32, reg_info->byte_size);
@@ -511,10 +649,32 @@ NativeRegisterContextLinux_mips64::Write
     if (reg_index == LLDB_INVALID_REGNUM)
         return Error ("no lldb regnum for %s", reg_info && reg_info->name ? reg_info->name : "<unknown register>");
 
-    if (IsFPR(reg_index))
+    if (IsMSA(reg_index) && !IsMSAAvailable())
+    {
+        error.SetErrorString ("MSA not available on this processor");
+        return error;
+    }
+
+    if (IsFPR(reg_index) || IsMSA(reg_index))
     {
-        assert (reg_info->byte_offset < sizeof(FPR_mips));
-        uint8_t *dst = (uint8_t *)&m_fpr + reg_info->byte_offset;
+        uint8_t *dst;
+        const uint64_t *src;
+
+        // Initialise the FP and MSA buffers by reading all co-processor 1 registers
+        ReadCP1();
+
+        if (IsFPR(reg_index))
+        {
+            assert (reg_info->byte_offset < sizeof(UserArea));
+            dst = (uint8_t *)&m_fpr + reg_info->byte_offset - (sizeof(m_gpr));
+        }
+        else
+        {
+            assert (reg_info->byte_offset < sizeof(UserArea));
+            dst = (uint8_t *)&m_msa + reg_info->byte_offset - (sizeof(m_gpr) + sizeof(m_fpr));
+        }
+        llvm::APInt lhs;
+        llvm::APInt fail_value = llvm::APInt::getMaxValue(128);
         switch (reg_info->byte_size)
         {
             case 4:
@@ -523,15 +683,21 @@ NativeRegisterContextLinux_mips64::Write
             case 8:
                 *(uint64_t *)dst = reg_value.GetAsUInt64();
                 break;
+            case 16:
+                lhs = reg_value.GetAsUInt128(fail_value);
+                src = lhs.getRawData();
+                *(uint64_t *)dst = *src; 
+                *(uint64_t *)(dst + 8) = *(src + 1);
+                break;
             default:
                 assert(false && "Unhandled data size.");
                 error.SetErrorStringWithFormat ("unhandled byte size: %" PRIu32, reg_info->byte_size);
                 break;
         }
-        error = WriteFPR();
+        error = WriteCP1();
         if (!error.Success())
         {
-            error.SetErrorString ("failed to write floating point register");
+            error.SetErrorString ("failed to write co-processor 1 register");
             return error;
         }
     }
@@ -562,10 +728,10 @@ NativeRegisterContextLinux_mips64::ReadA
         return error;
     }
 
-    error = ReadFPR();
+    error = ReadCP1();
     if (!error.Success())
     {
-        error.SetErrorString ("ReadFPR() failed");
+        error.SetErrorString ("ReadCP1() failed");
         return error;
     }
 
@@ -576,10 +742,13 @@ NativeRegisterContextLinux_mips64::ReadA
         return error;
     }
 
-    ::memcpy (dst, &m_gpr_mips64, GetRegisterInfoInterface ().GetGPRSize ());
+    ::memcpy (dst, &m_gpr, GetRegisterInfoInterface ().GetGPRSize ());
     dst += GetRegisterInfoInterface ().GetGPRSize ();
 
-    ::memcpy (dst, &m_fpr, sizeof(FPR_mips));
+    ::memcpy (dst, &m_fpr, GetFPRSize ());
+    dst += GetFPRSize ();
+
+    ::memcpy (dst, &m_msa, sizeof(MSA_linux_mips));
 
     return error;
 }
@@ -608,10 +777,14 @@ NativeRegisterContextLinux_mips64::Write
         error.SetErrorStringWithFormat ("NativeRegisterContextLinux_mips64::%s DataBuffer::GetBytes() returned a null pointer", __FUNCTION__);
         return error;
     }
-    ::memcpy (&m_gpr_mips64, src, GetRegisterInfoInterface ().GetGPRSize ());
+
+    ::memcpy (&m_gpr, src, GetRegisterInfoInterface ().GetGPRSize ());
     src += GetRegisterInfoInterface ().GetGPRSize ();
 
-    ::memcpy (&m_fpr, src, sizeof(FPR_mips));
+    ::memcpy (&m_fpr, src, GetFPRSize ());
+    src += GetFPRSize ();
+
+    ::memcpy (&m_msa, src, sizeof(MSA_linux_mips));
 
     error = WriteGPR();
     if (!error.Success())
@@ -620,10 +793,10 @@ NativeRegisterContextLinux_mips64::Write
         return error;
     }
 
-    error = WriteFPR();
+    error = WriteCP1();
     if (!error.Success())
     {
-        error.SetErrorStringWithFormat ("NativeRegisterContextLinux_mips64::%s WriteFPR() failed", __FUNCTION__);
+        error.SetErrorStringWithFormat ("NativeRegisterContextLinux_mips64::%s WriteCP1() failed", __FUNCTION__);
         return error;
     }
 
@@ -631,22 +804,47 @@ NativeRegisterContextLinux_mips64::Write
 }
 
 Error
-NativeRegisterContextLinux_mips64::ReadFPR()
+NativeRegisterContextLinux_mips64::ReadCP1()
 {
-    void* buf = GetFPRBuffer();
-    if (!buf)
-        return Error("FPR buffer is NULL");
+    Error error;
 
-    Error error = NativeRegisterContextLinux::ReadFPR();
+    uint8_t *src, *dst;
 
-    if (IsFR0())
+    lldb::ByteOrder byte_order = GetByteOrder();
+
+    uint32_t IsBigEndian = (byte_order == lldb::eByteOrderBig);
+
+    if (IsMSAAvailable())
+    {
+        error = NativeRegisterContextLinux::ReadRegisterSet(&m_iovec, sizeof(MSA_linux_mips), NT_MIPS_MSA);
+        src = (uint8_t *)&m_msa + (IsBigEndian * 8);
+        dst = (uint8_t *)&m_fpr;
+        for ( int i = 0; i < NUM_REGISTERS; i++)
+        {
+            // Copy fp values from msa buffer fetched via ptrace
+            *(uint64_t *) dst = *(uint64_t *) src;
+            src = src + 16;
+            dst = dst + 8;
+        }
+        m_fpr.fir = m_msa.fir;
+        m_fpr.fcsr = m_msa.fcsr;
+        m_fpr.config5 = m_msa.config5;
+    }
+    else
     {
-         for (int i = 0; i < 16; i++)
+        error = NativeRegisterContextLinux::ReadFPR();
+    }
+
+    if (IsFR0() || IsFRE())
+    {
+         src = (uint8_t *)&m_fpr + 4 + (IsBigEndian * 4);
+         dst = (uint8_t *)&m_fpr + 8 + (IsBigEndian * 4);
+         for (int i = 0; i < (NUM_REGISTERS / 2); i++)
          {
               // copy odd single from top of neighbouring even double
-              uint8_t * src = (uint8_t *)buf + 4 + (i * 16);
-              uint8_t * dst = (uint8_t *)buf + 8 + (i * 16);
               *(uint32_t *) dst = *(uint32_t *) src;
+              src = src + 16;
+              dst = dst + 16;
          }
     }
 
@@ -654,37 +852,77 @@ NativeRegisterContextLinux_mips64::ReadF
 }
 
 Error
-NativeRegisterContextLinux_mips64::WriteFPR()
+NativeRegisterContextLinux_mips64::WriteCP1()
 {
-    void* buf = GetFPRBuffer();
-    if (!buf)
-        return Error("FPR buffer is NULL");
+    Error error;
+
+    uint8_t *src, *dst;
+
+    lldb::ByteOrder byte_order = GetByteOrder();
 
-    if (IsFR0())
+    uint32_t IsBigEndian = (byte_order == lldb::eByteOrderBig);
+
+    if (IsFR0() || IsFRE())
     {
-         for (int i = 0; i < 16; i++)
-         {
+        src = (uint8_t *)&m_fpr + 8 + (IsBigEndian * 4);
+        dst = (uint8_t *)&m_fpr + 4 + (IsBigEndian * 4);
+        for (int i = 0; i < (NUM_REGISTERS / 2); i++)
+        {
              // copy odd single to top of neighbouring even double
-             uint8_t * src = (uint8_t *)buf + 8 + (i * 16);
-             uint8_t * dst = (uint8_t *)buf + 4 + (i * 16);
              *(uint32_t *) dst = *(uint32_t *) src;
-         }
+             src = src + 16;
+             dst = dst + 16;
+        }
+    }
+
+    if (IsMSAAvailable())
+    {
+        dst = (uint8_t *)&m_msa + (IsBigEndian * 8);
+        src = (uint8_t *)&m_fpr;
+        for (int i = 0; i < NUM_REGISTERS; i++)
+        {
+            // Copy fp values to msa buffer for ptrace
+            *(uint64_t *) dst = *(uint64_t *) src;
+            dst = dst + 16;
+            src = src + 8;
+        }
+        m_msa.fir = m_fpr.fir;
+        m_msa.fcsr = m_fpr.fcsr;
+        m_msa.config5 = m_fpr.config5;
+        error = NativeRegisterContextLinux::WriteRegisterSet(&m_iovec, sizeof(MSA_linux_mips), NT_MIPS_MSA);
+    }
+    else
+    {
+        error = NativeRegisterContextLinux::WriteFPR();
     }
 
-    return NativeRegisterContextLinux::WriteFPR();
+    return error;
 }
 
 bool
 NativeRegisterContextLinux_mips64::IsFR0()
 {
-    const RegisterInfo *const reg_info_p = GetRegisterInfoAtIndex (36); // Status Register is at index 36 of the register array
+    const RegisterInfo *const reg_info_p = GetRegisterInfoAtIndex (gpr_sr_mips64);
 
     RegisterValue reg_value;
     ReadRegister (reg_info_p, reg_value);
 
     uint64_t value = reg_value.GetAsUInt64();
 
-    return (!(value & 0x4000000));
+    return (!(value & SR_FR));
+}
+
+bool
+NativeRegisterContextLinux_mips64::IsFRE()
+{
+    const RegisterInfo *const reg_info_p = GetRegisterInfoAtIndex (gpr_config5_mips64);
+
+    RegisterValue reg_value;
+    ReadRegister (reg_info_p, reg_value);
+
+    uint64_t config5 = reg_value.GetAsUInt64();
+
+    return (config5 & CONFIG5_FRE);
 }
 
 bool
@@ -869,6 +1107,25 @@ GetVacantWatchIndex (struct pt_watch_reg
     return 0;
 }
 
+bool
+NativeRegisterContextLinux_mips64::IsMSA(uint32_t reg_index) const
+{
+    return (m_reg_info.first_msa <= reg_index && reg_index <= m_reg_info.last_msa);
+}
+
+bool
+NativeRegisterContextLinux_mips64::IsMSAAvailable()
+{
+    Error error = NativeRegisterContextLinux::ReadRegisterSet(&m_msa, sizeof(MSA_linux_mips), NT_MIPS_MSA);
+
+    if (error.Success() && m_msa.mir)
+    {
+        return true;
+    }
+
+    return false;
+}
+
 Error
 NativeRegisterContextLinux_mips64::IsWatchpointHit (uint32_t wp_index, bool &is_hit)
 {
@@ -1028,13 +1285,14 @@ NativeRegisterContextLinux_mips64::DoRea
                                                        uint32_t size,
                                                        RegisterValue &value)
 {
-    elf_gregset_t regs;
+    GPR_linux_mips regs;
+    ::memset(&regs, 0, sizeof(GPR_linux_mips));
     Error error = NativeProcessLinux::PtraceWrapper(PTRACE_GETREGS, m_thread.GetID(), NULL, &regs, sizeof regs);
     if (error.Success())
     {
         lldb_private::ArchSpec arch;
         if (m_thread.GetProcess()->GetArchitecture(arch))
-            value.SetBytes((void *)(((unsigned char *)(regs)) + offset), 8, arch.GetByteOrder());
+            value.SetBytes((void *)(((unsigned char *)(&regs)) + offset), 8, arch.GetByteOrder());
         else
             error.SetErrorString("failed to get architecture");
     }

Modified: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.h (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.h Fri Aug  7 01:39:38 2015
@@ -13,8 +13,8 @@
 #define lldb_NativeRegisterContextLinux_mips64_h
 
 #include "Plugins/Process/Linux/NativeRegisterContextLinux.h"
-#include "Plugins/Process/Utility/RegisterContext_mips64.h"
-#include "Plugins/Process/Utility/lldb-mips64-register-enums.h"
+#include "Plugins/Process/Utility/RegisterContext_mips.h"
+#include "Plugins/Process/Utility/lldb-mips-linux-register-enums.h"
 
 #define MAX_NUM_WP 8
 
@@ -52,10 +52,10 @@ namespace process_linux {
         WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) override;
 
         Error
-        ReadFPR() override;
+        ReadCP1();
 
         Error
-        WriteFPR() override;
+        WriteCP1();
 
         Error
         IsWatchpointHit (uint32_t wp_index, bool &is_hit) override;
@@ -108,16 +108,25 @@ namespace process_linux {
         IsFR0();
 
         bool
+        IsFRE();
+
+        bool
         IsFPR(uint32_t reg_index) const;
 
+        bool
+        IsMSA(uint32_t reg_index) const;
+
+        bool
+        IsMSAAvailable();
+
         void*
-        GetGPRBuffer() override { return &m_gpr_mips64; }
+        GetGPRBuffer() override { return &m_gpr; }
 
         void*
         GetFPRBuffer() override { return &m_fpr; }
 
         size_t
-        GetFPRSize() override { return sizeof(FPR_mips); }
+        GetFPRSize() override { return sizeof(FPR_linux_mips); }
 
     private:
         // Info about register ranges.
@@ -130,15 +139,21 @@ namespace process_linux {
             uint32_t last_gpr;
             uint32_t first_fpr;
             uint32_t last_fpr;
+            uint32_t first_msa;
+            uint32_t last_msa;
         };
 
         RegInfo m_reg_info;
 
-        uint64_t m_gpr_mips64[k_num_gpr_registers_mips64];
+        GPR_linux_mips m_gpr;
 
-        FPR_mips m_fpr;
+        FPR_linux_mips m_fpr;
+
+        MSA_linux_mips m_msa;
 
         lldb::addr_t hw_addr_map[MAX_NUM_WP];
+
+        IOVEC_mips m_iovec;
     };
 
 } // namespace process_linux

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextFreeBSD_mips64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextFreeBSD_mips64.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextFreeBSD_mips64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextFreeBSD_mips64.cpp Fri Aug  7 01:39:38 2015
@@ -57,7 +57,7 @@ typedef struct _GPR
     uint64_t pc;
     uint64_t ic;
     uint64_t dummy;
-} GPR;
+} GPR_freebsd_mips;
 
 //---------------------------------------------------------------------------
 // Include RegisterInfos_mips64 to declare our g_register_infos_mips64 structure.
@@ -74,7 +74,7 @@ RegisterContextFreeBSD_mips64::RegisterC
 size_t
 RegisterContextFreeBSD_mips64::GetGPRSize() const
 {
-    return sizeof(GPR);
+    return sizeof(GPR_freebsd_mips);
 }
 
 const RegisterInfo *

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.cpp Fri Aug  7 01:39:38 2015
@@ -10,59 +10,17 @@
 #include <vector>
 #include <stddef.h>
 
-// For GDB, GCC and DWARF Register numbers
 #include "RegisterContextLinux_mips.h"
 
 // Internal codes for mips registers
-#include "lldb-mips64-register-enums.h"
-#include "RegisterContext_mips64.h"
+#include "lldb-mips-linux-register-enums.h"
+
+// For GP and FP buffers
+#include "RegisterContext_mips.h"
 
 using namespace lldb_private;
 using namespace lldb;
 
-// GP registers
-typedef struct _GPR
-{
-    uint32_t zero;
-    uint32_t r1;
-    uint32_t r2;
-    uint32_t r3;
-    uint32_t r4;
-    uint32_t r5;
-    uint32_t r6;
-    uint32_t r7;
-    uint32_t r8;
-    uint32_t r9;
-    uint32_t r10;
-    uint32_t r11;
-    uint32_t r12;
-    uint32_t r13;
-    uint32_t r14;
-    uint32_t r15;
-    uint32_t r16;
-    uint32_t r17;
-    uint32_t r18;
-    uint32_t r19;
-    uint32_t r20;
-    uint32_t r21;
-    uint32_t r22;
-    uint32_t r23;
-    uint32_t r24;
-    uint32_t r25;
-    uint32_t r26;
-    uint32_t r27;
-    uint32_t gp;
-    uint32_t sp;
-    uint32_t r30;
-    uint32_t ra;
-    uint32_t mullo;
-    uint32_t mulhi;
-    uint32_t pc;
-    uint32_t badvaddr;
-    uint32_t sr;
-    uint32_t cause;
-} GPR;
-
 //---------------------------------------------------------------------------
 // Include RegisterInfos_mips to declare our g_register_infos_mips structure.
 //---------------------------------------------------------------------------
@@ -78,7 +36,7 @@ RegisterContextLinux_mips::RegisterConte
 size_t
 RegisterContextLinux_mips::GetGPRSize() const
 {
-    return sizeof(GPR);
+    return sizeof(GPR_linux_mips);
 }
 
 const RegisterInfo *
@@ -100,3 +58,9 @@ RegisterContextLinux_mips::GetRegisterCo
 {
     return static_cast<uint32_t> (sizeof (g_register_infos_mips) / sizeof (g_register_infos_mips [0]));
 }
+
+uint32_t
+RegisterContextLinux_mips::GetUserRegisterCount () const
+{
+    return static_cast<uint32_t> (k_num_user_registers_mips);
+}

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips.h Fri Aug  7 01:39:38 2015
@@ -27,6 +27,9 @@ public:
 
     uint32_t
     GetRegisterCount () const override;
+
+    uint32_t
+    GetUserRegisterCount () const override;
 };
 
 #endif

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.cpp?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.cpp Fri Aug  7 01:39:38 2015
@@ -12,66 +12,24 @@
 #include <vector>
 #include <stddef.h>
 
-// For GDB, GCC and DWARF Register numbers
 #include "RegisterContextLinux_mips64.h"
 
-// Internal codes for all mips64 registers
-#include "lldb-mips64-register-enums.h"
-#include "RegisterContext_mips64.h"
+// For GP and FP buffers
+#include "RegisterContext_mips.h"
+
+// Internal codes for all mips32 and mips64 registers
+#include "lldb-mips-linux-register-enums.h"
 
 using namespace lldb;
 using namespace lldb_private;
 
-// GP registers
-typedef struct _GPR
-{
-    uint64_t zero;
-    uint64_t r1;
-    uint64_t r2;
-    uint64_t r3;
-    uint64_t r4;
-    uint64_t r5;
-    uint64_t r6;
-    uint64_t r7;
-    uint64_t r8;
-    uint64_t r9;
-    uint64_t r10;
-    uint64_t r11;
-    uint64_t r12;
-    uint64_t r13;
-    uint64_t r14;
-    uint64_t r15;
-    uint64_t r16;
-    uint64_t r17;
-    uint64_t r18;
-    uint64_t r19;
-    uint64_t r20;
-    uint64_t r21;
-    uint64_t r22;
-    uint64_t r23;
-    uint64_t r24;
-    uint64_t r25;
-    uint64_t r26;
-    uint64_t r27;
-    uint64_t gp;
-    uint64_t sp;
-    uint64_t r30;
-    uint64_t ra;
-    uint64_t mullo;
-    uint64_t mulhi;
-    uint64_t pc;
-    uint64_t badvaddr;
-    uint64_t sr;
-    uint64_t cause;
-    uint64_t ic;
-    uint64_t dummy;
-} GPR;
-
 //---------------------------------------------------------------------------
 // Include RegisterInfos_mips64 to declare our g_register_infos_mips64 structure.
 //---------------------------------------------------------------------------
 #define DECLARE_REGISTER_INFOS_MIPS64_STRUCT
+#define LINUX_MIPS64
 #include "RegisterInfos_mips64.h"
+#undef LINUX_MIPS64
 #undef DECLARE_REGISTER_INFOS_MIPS64_STRUCT
 
 //---------------------------------------------------------------------------
@@ -115,17 +73,35 @@ GetRegisterInfoCount (const ArchSpec &ta
     }
 }
 
+uint32_t
+GetUserRegisterInfoCount (const ArchSpec &target_arch)
+{
+    switch (target_arch.GetMachine())
+    {
+        case llvm::Triple::mips:
+        case llvm::Triple::mipsel:
+            return static_cast<uint32_t> (k_num_user_registers_mips);
+        case llvm::Triple::mips64el:
+        case llvm::Triple::mips64:
+            return static_cast<uint32_t> (k_num_user_registers_mips64);
+        default:
+            assert(false && "Unhandled target architecture.");
+            return 0;
+    }
+}
+
 RegisterContextLinux_mips64::RegisterContextLinux_mips64(const ArchSpec &target_arch) :
     lldb_private::RegisterInfoInterface(target_arch),
     m_register_info_p (GetRegisterInfoPtr (target_arch)),
-    m_register_info_count (GetRegisterInfoCount (target_arch))
+    m_register_info_count (GetRegisterInfoCount (target_arch)),
+    m_user_register_count (GetUserRegisterInfoCount (target_arch))
 {
 }
 
 size_t
 RegisterContextLinux_mips64::GetGPRSize() const
 {
-    return sizeof(GPR);
+    return sizeof(GPR_linux_mips);
 }
 
 const RegisterInfo *
@@ -140,4 +116,10 @@ RegisterContextLinux_mips64::GetRegister
     return m_register_info_count;
 }
 
+uint32_t
+RegisterContextLinux_mips64::GetUserRegisterCount () const
+{
+    return m_user_register_count;
+}
+
 #endif

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLinux_mips64.h Fri Aug  7 01:39:38 2015
@@ -30,9 +30,13 @@ public:
     uint32_t
     GetRegisterCount () const override;
 
+    uint32_t
+    GetUserRegisterCount () const override;
+
 private:
     const lldb_private::RegisterInfo *m_register_info_p;
     uint32_t m_register_info_count;
+    uint32_t m_user_register_count;
 };
 
 #endif

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextPOSIX_mips64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextPOSIX_mips64.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextPOSIX_mips64.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextPOSIX_mips64.h Fri Aug  7 01:39:38 2015
@@ -12,8 +12,8 @@
 
 #include "lldb/Core/Log.h"
 #include "RegisterContextPOSIX.h"
-#include "RegisterContext_mips64.h"
-#include "lldb-mips64-register-enums.h"
+#include "RegisterContext_mips.h"
+#include "lldb-mips-freebsd-register-enums.h"
 
 using namespace lldb_private;
 

Added: lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips.h?rev=244308&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips.h (added)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips.h Fri Aug  7 01:39:38 2015
@@ -0,0 +1,614 @@
+//===-- RegisterContext_mips.h --------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_RegisterContext_mips64_H_
+#define liblldb_RegisterContext_mips64_H_
+
+#if defined(__mips64)
+    #define ENABLE_128_BIT_SUPPORT 1
+#endif
+
+// GCC and DWARF Register numbers (eRegisterKindGCC & eRegisterKindDWARF)
+enum
+{
+    // GP Registers
+    gcc_dwarf_zero_mips = 0,
+    gcc_dwarf_r1_mips,
+    gcc_dwarf_r2_mips,
+    gcc_dwarf_r3_mips,
+    gcc_dwarf_r4_mips,
+    gcc_dwarf_r5_mips,
+    gcc_dwarf_r6_mips,
+    gcc_dwarf_r7_mips,
+    gcc_dwarf_r8_mips,
+    gcc_dwarf_r9_mips,
+    gcc_dwarf_r10_mips,
+    gcc_dwarf_r11_mips,
+    gcc_dwarf_r12_mips,
+    gcc_dwarf_r13_mips,
+    gcc_dwarf_r14_mips,
+    gcc_dwarf_r15_mips,
+    gcc_dwarf_r16_mips,
+    gcc_dwarf_r17_mips,
+    gcc_dwarf_r18_mips,
+    gcc_dwarf_r19_mips,
+    gcc_dwarf_r20_mips,
+    gcc_dwarf_r21_mips,
+    gcc_dwarf_r22_mips,
+    gcc_dwarf_r23_mips,
+    gcc_dwarf_r24_mips,
+    gcc_dwarf_r25_mips,
+    gcc_dwarf_r26_mips,
+    gcc_dwarf_r27_mips,
+    gcc_dwarf_gp_mips,
+    gcc_dwarf_sp_mips,
+    gcc_dwarf_r30_mips,
+    gcc_dwarf_ra_mips,
+    gcc_dwarf_sr_mips,
+    gcc_dwarf_lo_mips,
+    gcc_dwarf_hi_mips,
+    gcc_dwarf_bad_mips,
+    gcc_dwarf_cause_mips,
+    gcc_dwarf_pc_mips,
+    gcc_dwarf_f0_mips,
+    gcc_dwarf_f1_mips,
+    gcc_dwarf_f2_mips,
+    gcc_dwarf_f3_mips,
+    gcc_dwarf_f4_mips,
+    gcc_dwarf_f5_mips,
+    gcc_dwarf_f6_mips,
+    gcc_dwarf_f7_mips,
+    gcc_dwarf_f8_mips,
+    gcc_dwarf_f9_mips,
+    gcc_dwarf_f10_mips,
+    gcc_dwarf_f11_mips,
+    gcc_dwarf_f12_mips,
+    gcc_dwarf_f13_mips,
+    gcc_dwarf_f14_mips,
+    gcc_dwarf_f15_mips,
+    gcc_dwarf_f16_mips,
+    gcc_dwarf_f17_mips,
+    gcc_dwarf_f18_mips,
+    gcc_dwarf_f19_mips,
+    gcc_dwarf_f20_mips,
+    gcc_dwarf_f21_mips,
+    gcc_dwarf_f22_mips,
+    gcc_dwarf_f23_mips,
+    gcc_dwarf_f24_mips,
+    gcc_dwarf_f25_mips,
+    gcc_dwarf_f26_mips,
+    gcc_dwarf_f27_mips,
+    gcc_dwarf_f28_mips,
+    gcc_dwarf_f29_mips,
+    gcc_dwarf_f30_mips,
+    gcc_dwarf_f31_mips,
+    gcc_dwarf_fcsr_mips,
+    gcc_dwarf_fir_mips,
+    gcc_dwarf_w0_mips,
+    gcc_dwarf_w1_mips,
+    gcc_dwarf_w2_mips,
+    gcc_dwarf_w3_mips,
+    gcc_dwarf_w4_mips,
+    gcc_dwarf_w5_mips,
+    gcc_dwarf_w6_mips,
+    gcc_dwarf_w7_mips,
+    gcc_dwarf_w8_mips,
+    gcc_dwarf_w9_mips,
+    gcc_dwarf_w10_mips,
+    gcc_dwarf_w11_mips,
+    gcc_dwarf_w12_mips,
+    gcc_dwarf_w13_mips,
+    gcc_dwarf_w14_mips,
+    gcc_dwarf_w15_mips,
+    gcc_dwarf_w16_mips,
+    gcc_dwarf_w17_mips,
+    gcc_dwarf_w18_mips,
+    gcc_dwarf_w19_mips,
+    gcc_dwarf_w20_mips,
+    gcc_dwarf_w21_mips,
+    gcc_dwarf_w22_mips,
+    gcc_dwarf_w23_mips,
+    gcc_dwarf_w24_mips,
+    gcc_dwarf_w25_mips,
+    gcc_dwarf_w26_mips,
+    gcc_dwarf_w27_mips,
+    gcc_dwarf_w28_mips,
+    gcc_dwarf_w29_mips,
+    gcc_dwarf_w30_mips,
+    gcc_dwarf_w31_mips,
+    gcc_dwarf_mcsr_mips,
+    gcc_dwarf_mir_mips,
+    gcc_dwarf_config5_mips,
+    gcc_dwarf_ic_mips,
+    gcc_dwarf_dummy_mips
+};
+
+enum
+{
+    gcc_dwarf_zero_mips64 = 0,
+    gcc_dwarf_r1_mips64,
+    gcc_dwarf_r2_mips64,
+    gcc_dwarf_r3_mips64,
+    gcc_dwarf_r4_mips64,
+    gcc_dwarf_r5_mips64,
+    gcc_dwarf_r6_mips64,
+    gcc_dwarf_r7_mips64,
+    gcc_dwarf_r8_mips64,
+    gcc_dwarf_r9_mips64,
+    gcc_dwarf_r10_mips64,
+    gcc_dwarf_r11_mips64,
+    gcc_dwarf_r12_mips64,
+    gcc_dwarf_r13_mips64,
+    gcc_dwarf_r14_mips64,
+    gcc_dwarf_r15_mips64,
+    gcc_dwarf_r16_mips64,
+    gcc_dwarf_r17_mips64,
+    gcc_dwarf_r18_mips64,
+    gcc_dwarf_r19_mips64,
+    gcc_dwarf_r20_mips64,
+    gcc_dwarf_r21_mips64,
+    gcc_dwarf_r22_mips64,
+    gcc_dwarf_r23_mips64,
+    gcc_dwarf_r24_mips64,
+    gcc_dwarf_r25_mips64,
+    gcc_dwarf_r26_mips64,
+    gcc_dwarf_r27_mips64,
+    gcc_dwarf_gp_mips64,
+    gcc_dwarf_sp_mips64,
+    gcc_dwarf_r30_mips64,
+    gcc_dwarf_ra_mips64,
+    gcc_dwarf_sr_mips64,
+    gcc_dwarf_lo_mips64,
+    gcc_dwarf_hi_mips64,
+    gcc_dwarf_bad_mips64,
+    gcc_dwarf_cause_mips64,
+    gcc_dwarf_pc_mips64,
+    gcc_dwarf_f0_mips64,
+    gcc_dwarf_f1_mips64,
+    gcc_dwarf_f2_mips64,
+    gcc_dwarf_f3_mips64,
+    gcc_dwarf_f4_mips64,
+    gcc_dwarf_f5_mips64,
+    gcc_dwarf_f6_mips64,
+    gcc_dwarf_f7_mips64,
+    gcc_dwarf_f8_mips64,
+    gcc_dwarf_f9_mips64,
+    gcc_dwarf_f10_mips64,
+    gcc_dwarf_f11_mips64,
+    gcc_dwarf_f12_mips64,
+    gcc_dwarf_f13_mips64,
+    gcc_dwarf_f14_mips64,
+    gcc_dwarf_f15_mips64,
+    gcc_dwarf_f16_mips64,
+    gcc_dwarf_f17_mips64,
+    gcc_dwarf_f18_mips64,
+    gcc_dwarf_f19_mips64,
+    gcc_dwarf_f20_mips64,
+    gcc_dwarf_f21_mips64,
+    gcc_dwarf_f22_mips64,
+    gcc_dwarf_f23_mips64,
+    gcc_dwarf_f24_mips64,
+    gcc_dwarf_f25_mips64,
+    gcc_dwarf_f26_mips64,
+    gcc_dwarf_f27_mips64,
+    gcc_dwarf_f28_mips64,
+    gcc_dwarf_f29_mips64,
+    gcc_dwarf_f30_mips64,
+    gcc_dwarf_f31_mips64,
+    gcc_dwarf_fcsr_mips64,
+    gcc_dwarf_fir_mips64,
+    gcc_dwarf_ic_mips64,
+    gcc_dwarf_dummy_mips64,
+    gcc_dwarf_w0_mips64,
+    gcc_dwarf_w1_mips64,
+    gcc_dwarf_w2_mips64,
+    gcc_dwarf_w3_mips64,
+    gcc_dwarf_w4_mips64,
+    gcc_dwarf_w5_mips64,
+    gcc_dwarf_w6_mips64,
+    gcc_dwarf_w7_mips64,
+    gcc_dwarf_w8_mips64,
+    gcc_dwarf_w9_mips64,
+    gcc_dwarf_w10_mips64,
+    gcc_dwarf_w11_mips64,
+    gcc_dwarf_w12_mips64,
+    gcc_dwarf_w13_mips64,
+    gcc_dwarf_w14_mips64,
+    gcc_dwarf_w15_mips64,
+    gcc_dwarf_w16_mips64,
+    gcc_dwarf_w17_mips64,
+    gcc_dwarf_w18_mips64,
+    gcc_dwarf_w19_mips64,
+    gcc_dwarf_w20_mips64,
+    gcc_dwarf_w21_mips64,
+    gcc_dwarf_w22_mips64,
+    gcc_dwarf_w23_mips64,
+    gcc_dwarf_w24_mips64,
+    gcc_dwarf_w25_mips64,
+    gcc_dwarf_w26_mips64,
+    gcc_dwarf_w27_mips64,
+    gcc_dwarf_w28_mips64,
+    gcc_dwarf_w29_mips64,
+    gcc_dwarf_w30_mips64,
+    gcc_dwarf_w31_mips64,
+    gcc_dwarf_mcsr_mips64,
+    gcc_dwarf_mir_mips64,
+    gcc_dwarf_config5_mips64,
+};
+
+// GDB Register numbers (eRegisterKindGDB)
+enum
+{
+    gdb_zero_mips = 0,
+    gdb_r1_mips,
+    gdb_r2_mips,
+    gdb_r3_mips,
+    gdb_r4_mips,
+    gdb_r5_mips,
+    gdb_r6_mips,
+    gdb_r7_mips,
+    gdb_r8_mips,
+    gdb_r9_mips,
+    gdb_r10_mips,
+    gdb_r11_mips,
+    gdb_r12_mips,
+    gdb_r13_mips,
+    gdb_r14_mips,
+    gdb_r15_mips,
+    gdb_r16_mips,
+    gdb_r17_mips,
+    gdb_r18_mips,
+    gdb_r19_mips,
+    gdb_r20_mips,
+    gdb_r21_mips,
+    gdb_r22_mips,
+    gdb_r23_mips,
+    gdb_r24_mips,
+    gdb_r25_mips,
+    gdb_r26_mips,
+    gdb_r27_mips,
+    gdb_gp_mips,
+    gdb_sp_mips,
+    gdb_r30_mips,
+    gdb_ra_mips,
+    gdb_sr_mips,
+    gdb_lo_mips,
+    gdb_hi_mips,
+    gdb_bad_mips,
+    gdb_cause_mips,
+    gdb_pc_mips,
+    gdb_f0_mips,
+    gdb_f1_mips,
+    gdb_f2_mips,
+    gdb_f3_mips,
+    gdb_f4_mips,
+    gdb_f5_mips,
+    gdb_f6_mips,
+    gdb_f7_mips,
+    gdb_f8_mips,
+    gdb_f9_mips,
+    gdb_f10_mips,
+    gdb_f11_mips,
+    gdb_f12_mips,
+    gdb_f13_mips,
+    gdb_f14_mips,
+    gdb_f15_mips,
+    gdb_f16_mips,
+    gdb_f17_mips,
+    gdb_f18_mips,
+    gdb_f19_mips,
+    gdb_f20_mips,
+    gdb_f21_mips,
+    gdb_f22_mips,
+    gdb_f23_mips,
+    gdb_f24_mips,
+    gdb_f25_mips,
+    gdb_f26_mips,
+    gdb_f27_mips,
+    gdb_f28_mips,
+    gdb_f29_mips,
+    gdb_f30_mips,
+    gdb_f31_mips,
+    gdb_fcsr_mips,
+    gdb_fir_mips,
+    gdb_w0_mips,
+    gdb_w1_mips,
+    gdb_w2_mips,
+    gdb_w3_mips,
+    gdb_w4_mips,
+    gdb_w5_mips,
+    gdb_w6_mips,
+    gdb_w7_mips,
+    gdb_w8_mips,
+    gdb_w9_mips,
+    gdb_w10_mips,
+    gdb_w11_mips,
+    gdb_w12_mips,
+    gdb_w13_mips,
+    gdb_w14_mips,
+    gdb_w15_mips,
+    gdb_w16_mips,
+    gdb_w17_mips,
+    gdb_w18_mips,
+    gdb_w19_mips,
+    gdb_w20_mips,
+    gdb_w21_mips,
+    gdb_w22_mips,
+    gdb_w23_mips,
+    gdb_w24_mips,
+    gdb_w25_mips,
+    gdb_w26_mips,
+    gdb_w27_mips,
+    gdb_w28_mips,
+    gdb_w29_mips,
+    gdb_w30_mips,
+    gdb_w31_mips,
+    gdb_mcsr_mips,
+    gdb_mir_mips,
+    gdb_config5_mips,
+    gdb_ic_mips,
+    gdb_dummy_mips
+};
+
+enum
+{
+    gdb_zero_mips64 = 0,
+    gdb_r1_mips64,
+    gdb_r2_mips64,
+    gdb_r3_mips64,
+    gdb_r4_mips64,
+    gdb_r5_mips64,
+    gdb_r6_mips64,
+    gdb_r7_mips64,
+    gdb_r8_mips64,
+    gdb_r9_mips64,
+    gdb_r10_mips64,
+    gdb_r11_mips64,
+    gdb_r12_mips64,
+    gdb_r13_mips64,
+    gdb_r14_mips64,
+    gdb_r15_mips64,
+    gdb_r16_mips64,
+    gdb_r17_mips64,
+    gdb_r18_mips64,
+    gdb_r19_mips64,
+    gdb_r20_mips64,
+    gdb_r21_mips64,
+    gdb_r22_mips64,
+    gdb_r23_mips64,
+    gdb_r24_mips64,
+    gdb_r25_mips64,
+    gdb_r26_mips64,
+    gdb_r27_mips64,
+    gdb_gp_mips64,
+    gdb_sp_mips64,
+    gdb_r30_mips64,
+    gdb_ra_mips64,
+    gdb_sr_mips64,
+    gdb_lo_mips64,
+    gdb_hi_mips64,
+    gdb_bad_mips64,
+    gdb_cause_mips64,
+    gdb_pc_mips64,
+    gdb_f0_mips64,
+    gdb_f1_mips64,
+    gdb_f2_mips64,
+    gdb_f3_mips64,
+    gdb_f4_mips64,
+    gdb_f5_mips64,
+    gdb_f6_mips64,
+    gdb_f7_mips64,
+    gdb_f8_mips64,
+    gdb_f9_mips64,
+    gdb_f10_mips64,
+    gdb_f11_mips64,
+    gdb_f12_mips64,
+    gdb_f13_mips64,
+    gdb_f14_mips64,
+    gdb_f15_mips64,
+    gdb_f16_mips64,
+    gdb_f17_mips64,
+    gdb_f18_mips64,
+    gdb_f19_mips64,
+    gdb_f20_mips64,
+    gdb_f21_mips64,
+    gdb_f22_mips64,
+    gdb_f23_mips64,
+    gdb_f24_mips64,
+    gdb_f25_mips64,
+    gdb_f26_mips64,
+    gdb_f27_mips64,
+    gdb_f28_mips64,
+    gdb_f29_mips64,
+    gdb_f30_mips64,
+    gdb_f31_mips64,
+    gdb_fcsr_mips64,
+    gdb_fir_mips64,
+    gdb_ic_mips64,
+    gdb_dummy_mips64,
+    gdb_w0_mips64,
+    gdb_w1_mips64,
+    gdb_w2_mips64,
+    gdb_w3_mips64,
+    gdb_w4_mips64,
+    gdb_w5_mips64,
+    gdb_w6_mips64,
+    gdb_w7_mips64,
+    gdb_w8_mips64,
+    gdb_w9_mips64,
+    gdb_w10_mips64,
+    gdb_w11_mips64,
+    gdb_w12_mips64,
+    gdb_w13_mips64,
+    gdb_w14_mips64,
+    gdb_w15_mips64,
+    gdb_w16_mips64,
+    gdb_w17_mips64,
+    gdb_w18_mips64,
+    gdb_w19_mips64,
+    gdb_w20_mips64,
+    gdb_w21_mips64,
+    gdb_w22_mips64,
+    gdb_w23_mips64,
+    gdb_w24_mips64,
+    gdb_w25_mips64,
+    gdb_w26_mips64,
+    gdb_w27_mips64,
+    gdb_w28_mips64,
+    gdb_w29_mips64,
+    gdb_w30_mips64,
+    gdb_w31_mips64,
+    gdb_mcsr_mips64,
+    gdb_mir_mips64,
+    gdb_config5_mips64,
+};
+
+struct IOVEC_mips
+{
+    void    *iov_base;
+    size_t   iov_len;
+};
+
+// GP registers
+struct GPR_linux_mips
+{
+    uint64_t zero;
+    uint64_t r1;
+    uint64_t r2;
+    uint64_t r3;
+    uint64_t r4;
+    uint64_t r5;
+    uint64_t r6;
+    uint64_t r7;
+    uint64_t r8;
+    uint64_t r9;
+    uint64_t r10;
+    uint64_t r11;
+    uint64_t r12;
+    uint64_t r13;
+    uint64_t r14;
+    uint64_t r15;
+    uint64_t r16;
+    uint64_t r17;
+    uint64_t r18;
+    uint64_t r19;
+    uint64_t r20;
+    uint64_t r21;
+    uint64_t r22;
+    uint64_t r23;
+    uint64_t r24;
+    uint64_t r25;
+    uint64_t r26;
+    uint64_t r27;
+    uint64_t gp;
+    uint64_t sp;
+    uint64_t r30;
+    uint64_t ra;
+    uint64_t mullo;
+    uint64_t mulhi;
+    uint64_t pc;
+    uint64_t badvaddr;
+    uint64_t sr;
+    uint64_t cause;
+    uint64_t config5;
+};
+
+struct FPR_linux_mips
+{
+     uint64_t f0;
+     uint64_t f1;
+     uint64_t f2;
+     uint64_t f3;
+     uint64_t f4;
+     uint64_t f5;
+     uint64_t f6;
+     uint64_t f7;
+     uint64_t f8;
+     uint64_t f9;
+     uint64_t f10;
+     uint64_t f11;
+     uint64_t f12;
+     uint64_t f13;
+     uint64_t f14;
+     uint64_t f15;
+     uint64_t f16;
+     uint64_t f17;
+     uint64_t f18;
+     uint64_t f19;
+     uint64_t f20;
+     uint64_t f21;
+     uint64_t f22;
+     uint64_t f23;
+     uint64_t f24;
+     uint64_t f25;
+     uint64_t f26;
+     uint64_t f27;
+     uint64_t f28;
+     uint64_t f29;
+     uint64_t f30;
+     uint64_t f31;
+     uint32_t fcsr;
+     uint32_t fir;
+     uint32_t config5;
+};
+
+struct MSAReg
+{
+    uint8_t byte[16];
+};
+
+struct MSA_linux_mips
+{
+    MSAReg  w0;
+    MSAReg  w1;
+    MSAReg  w2;
+    MSAReg  w3;
+    MSAReg  w4;
+    MSAReg  w5;
+    MSAReg  w6;
+    MSAReg  w7;
+    MSAReg  w8;
+    MSAReg  w9;
+    MSAReg  w10;
+    MSAReg  w11;
+    MSAReg  w12;
+    MSAReg  w13;
+    MSAReg  w14;
+    MSAReg  w15;
+    MSAReg  w16;
+    MSAReg  w17;
+    MSAReg  w18;
+    MSAReg  w19;
+    MSAReg  w20;
+    MSAReg  w21;
+    MSAReg  w22;
+    MSAReg  w23;
+    MSAReg  w24;
+    MSAReg  w25;
+    MSAReg  w26;
+    MSAReg  w27;
+    MSAReg  w28;
+    MSAReg  w29;
+    MSAReg  w30;
+    MSAReg  w31;
+    uint32_t fcsr;      /* FPU control status register */
+    uint32_t fir;       /* FPU implementaion revision */
+    uint32_t mcsr;      /* MSA control status register */
+    uint32_t mir;       /* MSA implementation revision */
+    uint32_t config5;   /* Config5 register */
+};
+
+struct UserArea
+{
+    GPR_linux_mips gpr; // General purpose registers.
+    FPR_linux_mips fpr; // Floating point registers.
+    MSA_linux_mips msa; // MSA registers.
+};
+
+#endif // liblldb_RegisterContext_mips64_H_

Removed: lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips64.h?rev=244307&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips64.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContext_mips64.h (removed)
@@ -1,336 +0,0 @@
-//===-- RegisterContext_mips64.h --------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef liblldb_RegisterContext_mips64_H_
-#define liblldb_RegisterContext_mips64_H_
-
-// GCC and DWARF Register numbers (eRegisterKindGCC & eRegisterKindDWARF)
-enum
-{
-    // GP Registers
-    gcc_dwarf_zero_mips = 0,
-    gcc_dwarf_r1_mips,
-    gcc_dwarf_r2_mips,
-    gcc_dwarf_r3_mips,
-    gcc_dwarf_r4_mips,
-    gcc_dwarf_r5_mips,
-    gcc_dwarf_r6_mips,
-    gcc_dwarf_r7_mips,
-    gcc_dwarf_r8_mips,
-    gcc_dwarf_r9_mips,
-    gcc_dwarf_r10_mips,
-    gcc_dwarf_r11_mips,
-    gcc_dwarf_r12_mips,
-    gcc_dwarf_r13_mips,
-    gcc_dwarf_r14_mips,
-    gcc_dwarf_r15_mips,
-    gcc_dwarf_r16_mips,
-    gcc_dwarf_r17_mips,
-    gcc_dwarf_r18_mips,
-    gcc_dwarf_r19_mips,
-    gcc_dwarf_r20_mips,
-    gcc_dwarf_r21_mips,
-    gcc_dwarf_r22_mips,
-    gcc_dwarf_r23_mips,
-    gcc_dwarf_r24_mips,
-    gcc_dwarf_r25_mips,
-    gcc_dwarf_r26_mips,
-    gcc_dwarf_r27_mips,
-    gcc_dwarf_gp_mips,
-    gcc_dwarf_sp_mips,
-    gcc_dwarf_r30_mips,
-    gcc_dwarf_ra_mips,
-    gcc_dwarf_lo_mips,
-    gcc_dwarf_hi_mips,
-    gcc_dwarf_pc_mips,
-    gcc_dwarf_bad_mips,
-    gcc_dwarf_sr_mips,
-    gcc_dwarf_cause_mips,
-    gcc_dwarf_f0_mips,
-    gcc_dwarf_f1_mips,
-    gcc_dwarf_f2_mips,
-    gcc_dwarf_f3_mips,
-    gcc_dwarf_f4_mips,
-    gcc_dwarf_f5_mips,
-    gcc_dwarf_f6_mips,
-    gcc_dwarf_f7_mips,
-    gcc_dwarf_f8_mips,
-    gcc_dwarf_f9_mips,
-    gcc_dwarf_f10_mips,
-    gcc_dwarf_f11_mips,
-    gcc_dwarf_f12_mips,
-    gcc_dwarf_f13_mips,
-    gcc_dwarf_f14_mips,
-    gcc_dwarf_f15_mips,
-    gcc_dwarf_f16_mips,
-    gcc_dwarf_f17_mips,
-    gcc_dwarf_f18_mips,
-    gcc_dwarf_f19_mips,
-    gcc_dwarf_f20_mips,
-    gcc_dwarf_f21_mips,
-    gcc_dwarf_f22_mips,
-    gcc_dwarf_f23_mips,
-    gcc_dwarf_f24_mips,
-    gcc_dwarf_f25_mips,
-    gcc_dwarf_f26_mips,
-    gcc_dwarf_f27_mips,
-    gcc_dwarf_f28_mips,
-    gcc_dwarf_f29_mips,
-    gcc_dwarf_f30_mips,
-    gcc_dwarf_f31_mips,
-    gcc_dwarf_fcsr_mips,
-    gcc_dwarf_fir_mips,
-    gcc_dwarf_ic_mips,
-    gcc_dwarf_dummy_mips
-};
-
-enum
-{
-    gcc_dwarf_zero_mips64 = 0,
-    gcc_dwarf_r1_mips64,
-    gcc_dwarf_r2_mips64,
-    gcc_dwarf_r3_mips64,
-    gcc_dwarf_r4_mips64,
-    gcc_dwarf_r5_mips64,
-    gcc_dwarf_r6_mips64,
-    gcc_dwarf_r7_mips64,
-    gcc_dwarf_r8_mips64,
-    gcc_dwarf_r9_mips64,
-    gcc_dwarf_r10_mips64,
-    gcc_dwarf_r11_mips64,
-    gcc_dwarf_r12_mips64,
-    gcc_dwarf_r13_mips64,
-    gcc_dwarf_r14_mips64,
-    gcc_dwarf_r15_mips64,
-    gcc_dwarf_r16_mips64,
-    gcc_dwarf_r17_mips64,
-    gcc_dwarf_r18_mips64,
-    gcc_dwarf_r19_mips64,
-    gcc_dwarf_r20_mips64,
-    gcc_dwarf_r21_mips64,
-    gcc_dwarf_r22_mips64,
-    gcc_dwarf_r23_mips64,
-    gcc_dwarf_r24_mips64,
-    gcc_dwarf_r25_mips64,
-    gcc_dwarf_r26_mips64,
-    gcc_dwarf_r27_mips64,
-    gcc_dwarf_gp_mips64,
-    gcc_dwarf_sp_mips64,
-    gcc_dwarf_r30_mips64,
-    gcc_dwarf_ra_mips64,
-    gcc_dwarf_sr_mips64,
-    gcc_dwarf_lo_mips64,
-    gcc_dwarf_hi_mips64,
-    gcc_dwarf_bad_mips64,
-    gcc_dwarf_cause_mips64,
-    gcc_dwarf_pc_mips64,
-    gcc_dwarf_f0_mips64,
-    gcc_dwarf_f1_mips64,
-    gcc_dwarf_f2_mips64,
-    gcc_dwarf_f3_mips64,
-    gcc_dwarf_f4_mips64,
-    gcc_dwarf_f5_mips64,
-    gcc_dwarf_f6_mips64,
-    gcc_dwarf_f7_mips64,
-    gcc_dwarf_f8_mips64,
-    gcc_dwarf_f9_mips64,
-    gcc_dwarf_f10_mips64,
-    gcc_dwarf_f11_mips64,
-    gcc_dwarf_f12_mips64,
-    gcc_dwarf_f13_mips64,
-    gcc_dwarf_f14_mips64,
-    gcc_dwarf_f15_mips64,
-    gcc_dwarf_f16_mips64,
-    gcc_dwarf_f17_mips64,
-    gcc_dwarf_f18_mips64,
-    gcc_dwarf_f19_mips64,
-    gcc_dwarf_f20_mips64,
-    gcc_dwarf_f21_mips64,
-    gcc_dwarf_f22_mips64,
-    gcc_dwarf_f23_mips64,
-    gcc_dwarf_f24_mips64,
-    gcc_dwarf_f25_mips64,
-    gcc_dwarf_f26_mips64,
-    gcc_dwarf_f27_mips64,
-    gcc_dwarf_f28_mips64,
-    gcc_dwarf_f29_mips64,
-    gcc_dwarf_f30_mips64,
-    gcc_dwarf_f31_mips64,
-    gcc_dwarf_fcsr_mips64,
-    gcc_dwarf_fir_mips64,
-    gcc_dwarf_ic_mips64,
-    gcc_dwarf_dummy_mips64
-};
-
-// GDB Register numbers (eRegisterKindGDB)
-enum
-{
-    gdb_zero_mips = 0,
-    gdb_r1_mips,
-    gdb_r2_mips,
-    gdb_r3_mips,
-    gdb_r4_mips,
-    gdb_r5_mips,
-    gdb_r6_mips,
-    gdb_r7_mips,
-    gdb_r8_mips,
-    gdb_r9_mips,
-    gdb_r10_mips,
-    gdb_r11_mips,
-    gdb_r12_mips,
-    gdb_r13_mips,
-    gdb_r14_mips,
-    gdb_r15_mips,
-    gdb_r16_mips,
-    gdb_r17_mips,
-    gdb_r18_mips,
-    gdb_r19_mips,
-    gdb_r20_mips,
-    gdb_r21_mips,
-    gdb_r22_mips,
-    gdb_r23_mips,
-    gdb_r24_mips,
-    gdb_r25_mips,
-    gdb_r26_mips,
-    gdb_r27_mips,
-    gdb_gp_mips,
-    gdb_sp_mips,
-    gdb_r30_mips,
-    gdb_ra_mips,
-    gdb_lo_mips,
-    gdb_hi_mips,
-    gdb_pc_mips,
-    gdb_bad_mips,
-    gdb_sr_mips,
-    gdb_cause_mips,
-    gdb_f0_mips,
-    gdb_f1_mips,
-    gdb_f2_mips,
-    gdb_f3_mips,
-    gdb_f4_mips,
-    gdb_f5_mips,
-    gdb_f6_mips,
-    gdb_f7_mips,
-    gdb_f8_mips,
-    gdb_f9_mips,
-    gdb_f10_mips,
-    gdb_f11_mips,
-    gdb_f12_mips,
-    gdb_f13_mips,
-    gdb_f14_mips,
-    gdb_f15_mips,
-    gdb_f16_mips,
-    gdb_f17_mips,
-    gdb_f18_mips,
-    gdb_f19_mips,
-    gdb_f20_mips,
-    gdb_f21_mips,
-    gdb_f22_mips,
-    gdb_f23_mips,
-    gdb_f24_mips,
-    gdb_f25_mips,
-    gdb_f26_mips,
-    gdb_f27_mips,
-    gdb_f28_mips,
-    gdb_f29_mips,
-    gdb_f30_mips,
-    gdb_f31_mips,
-    gdb_fcsr_mips,
-    gdb_fir_mips,
-    gdb_ic_mips,
-    gdb_dummy_mips
-};
-
-enum
-{
-    gdb_zero_mips64 = 0,
-    gdb_r1_mips64,
-    gdb_r2_mips64,
-    gdb_r3_mips64,
-    gdb_r4_mips64,
-    gdb_r5_mips64,
-    gdb_r6_mips64,
-    gdb_r7_mips64,
-    gdb_r8_mips64,
-    gdb_r9_mips64,
-    gdb_r10_mips64,
-    gdb_r11_mips64,
-    gdb_r12_mips64,
-    gdb_r13_mips64,
-    gdb_r14_mips64,
-    gdb_r15_mips64,
-    gdb_r16_mips64,
-    gdb_r17_mips64,
-    gdb_r18_mips64,
-    gdb_r19_mips64,
-    gdb_r20_mips64,
-    gdb_r21_mips64,
-    gdb_r22_mips64,
-    gdb_r23_mips64,
-    gdb_r24_mips64,
-    gdb_r25_mips64,
-    gdb_r26_mips64,
-    gdb_r27_mips64,
-    gdb_gp_mips64,
-    gdb_sp_mips64,
-    gdb_r30_mips64,
-    gdb_ra_mips64,
-    gdb_sr_mips64,
-    gdb_lo_mips64,
-    gdb_hi_mips64,
-    gdb_bad_mips64,
-    gdb_cause_mips64,
-    gdb_pc_mips64,
-    gdb_f0_mips64,
-    gdb_f1_mips64,
-    gdb_f2_mips64,
-    gdb_f3_mips64,
-    gdb_f4_mips64,
-    gdb_f5_mips64,
-    gdb_f6_mips64,
-    gdb_f7_mips64,
-    gdb_f8_mips64,
-    gdb_f9_mips64,
-    gdb_f10_mips64,
-    gdb_f11_mips64,
-    gdb_f12_mips64,
-    gdb_f13_mips64,
-    gdb_f14_mips64,
-    gdb_f15_mips64,
-    gdb_f16_mips64,
-    gdb_f17_mips64,
-    gdb_f18_mips64,
-    gdb_f19_mips64,
-    gdb_f20_mips64,
-    gdb_f21_mips64,
-    gdb_f22_mips64,
-    gdb_f23_mips64,
-    gdb_f24_mips64,
-    gdb_f25_mips64,
-    gdb_f26_mips64,
-    gdb_f27_mips64,
-    gdb_f28_mips64,
-    gdb_f29_mips64,
-    gdb_f30_mips64,
-    gdb_f31_mips64,
-    gdb_fcsr_mips64,
-    gdb_fir_mips64,
-    gdb_ic_mips64,
-    gdb_dummy_mips64
-};
-
-// FP registers
-struct FPR_mips
-{
-    uint64_t    fp_reg[32];
-    uint32_t    fcsr;        /* FPU status register */
-    uint32_t    fir;        /* FPU control register */
-};
-
-#endif // liblldb_RegisterContext_mips64_H_

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips.h Fri Aug  7 01:39:38 2015
@@ -14,24 +14,35 @@
 
 // Computes the offset of the given GPR in the user data area.
 #define GPR_OFFSET(regname) \
-    (LLVM_EXTENSION offsetof(GPR, regname))
+    (LLVM_EXTENSION offsetof(UserArea, gpr) + \
+     LLVM_EXTENSION offsetof(GPR_linux_mips, regname))
 
 // Computes the offset of the given FPR in the extended data area.
 #define FPR_OFFSET(regname)  \
-     (LLVM_EXTENSION offsetof(FPR_mips, regname))
+     (LLVM_EXTENSION offsetof(UserArea, fpr) + \
+      LLVM_EXTENSION offsetof(FPR_linux_mips, regname))
+
+// Computes the offset of the given MSA in the extended data area.
+#define MSA_OFFSET(regname)  \
+     (LLVM_EXTENSION offsetof(UserArea, msa) + \
+      LLVM_EXTENSION offsetof(MSA_linux_mips, regname))
 
 // Note that the size and offset will be updated by platform-specific classes.
 #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)            \
-    { #reg, alt, sizeof(((GPR*)NULL)->reg), GPR_OFFSET(reg), eEncodingUint,  \
+    { #reg, alt, sizeof(((GPR_linux_mips*)NULL)->reg) / 2, GPR_OFFSET(reg), eEncodingUint,  \
       eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips }, NULL, NULL }
 
-#define DEFINE_FPR(member, reg, alt, kind1, kind2, kind3, kind4)           \
-    { #reg, alt, sizeof(((FPR_mips*)NULL)->member) / 2, FPR_OFFSET(member), eEncodingUint,   \
+#define DEFINE_FPR(reg, alt, kind1, kind2, kind3, kind4)           \
+    { #reg, alt, sizeof(((FPR_linux_mips*)NULL)->reg), FPR_OFFSET(reg), eEncodingUint,   \
       eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips }, NULL, NULL }
 
-#define DEFINE_FPR_INFO(member, reg, alt, kind1, kind2, kind3, kind4)           \
-    { #reg, alt, sizeof(((FPR_mips*)NULL)->member), FPR_OFFSET(member), eEncodingUint,   \
-      eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips }, NULL, NULL }
+#define DEFINE_MSA(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingVector,   \
+      eFormatVectorOfUInt8, { kind1, kind2, kind3, kind4, msa_##reg##_mips }, NULL, NULL }
+
+#define DEFINE_MSA_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingUint, \
+      eFormatHex, { kind1, kind2, kind3, kind4, msa_##reg##_mips }, NULL, NULL }
 
 // RegisterKind: GCC, DWARF, Generic, GDB, LLDB
 
@@ -70,53 +81,95 @@ g_register_infos_mips[] =
     DEFINE_GPR (sp,       "sp",   gcc_dwarf_sp_mips,    gcc_dwarf_sp_mips,    LLDB_REGNUM_GENERIC_SP, gdb_sp_mips),
     DEFINE_GPR (r30,      "fp",   gcc_dwarf_r30_mips,   gcc_dwarf_r30_mips,   LLDB_REGNUM_GENERIC_FP, gdb_r30_mips),
     DEFINE_GPR (ra,       "ra",   gcc_dwarf_ra_mips,    gcc_dwarf_ra_mips,    LLDB_REGNUM_GENERIC_RA, gdb_ra_mips),
+    DEFINE_GPR (sr,   "status",   gcc_dwarf_sr_mips,    gcc_dwarf_sr_mips,    LLDB_REGNUM_GENERIC_FLAGS,    LLDB_INVALID_REGNUM),
     DEFINE_GPR (mullo,    NULL,   gcc_dwarf_lo_mips,    gcc_dwarf_lo_mips,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
     DEFINE_GPR (mulhi,    NULL,   gcc_dwarf_hi_mips,    gcc_dwarf_hi_mips,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
-    DEFINE_GPR (pc,       NULL,   gcc_dwarf_pc_mips,    gcc_dwarf_pc_mips,    LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM),
     DEFINE_GPR (badvaddr, NULL,   gcc_dwarf_bad_mips,    gcc_dwarf_bad_mips,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
-    DEFINE_GPR (sr,   "status",   gcc_dwarf_sr_mips,    gcc_dwarf_sr_mips,    LLDB_REGNUM_GENERIC_FLAGS,    LLDB_INVALID_REGNUM),
     DEFINE_GPR (cause,    NULL,   gcc_dwarf_cause_mips,    gcc_dwarf_cause_mips,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
-    DEFINE_FPR (fp_reg[0],   f0,    NULL,   gcc_dwarf_f0_mips,   gcc_dwarf_f0_mips,   LLDB_INVALID_REGNUM,    gdb_f0_mips),
-    DEFINE_FPR (fp_reg[1],   f1,    NULL,   gcc_dwarf_f1_mips,   gcc_dwarf_f1_mips,   LLDB_INVALID_REGNUM,    gdb_f1_mips),
-    DEFINE_FPR (fp_reg[2],   f2,    NULL,   gcc_dwarf_f2_mips,   gcc_dwarf_f2_mips,   LLDB_INVALID_REGNUM,    gdb_f2_mips),
-    DEFINE_FPR (fp_reg[3],   f3,    NULL,   gcc_dwarf_f3_mips,   gcc_dwarf_f3_mips,   LLDB_INVALID_REGNUM,    gdb_f3_mips),
-    DEFINE_FPR (fp_reg[4],   f4,    NULL,   gcc_dwarf_f4_mips,   gcc_dwarf_f4_mips,   LLDB_INVALID_REGNUM,    gdb_f4_mips),
-    DEFINE_FPR (fp_reg[5],   f5,    NULL,   gcc_dwarf_f5_mips,   gcc_dwarf_f5_mips,   LLDB_INVALID_REGNUM,    gdb_f5_mips),
-    DEFINE_FPR (fp_reg[6],   f6,    NULL,   gcc_dwarf_f6_mips,   gcc_dwarf_f6_mips,   LLDB_INVALID_REGNUM,    gdb_f6_mips),
-    DEFINE_FPR (fp_reg[7],   f7,    NULL,   gcc_dwarf_f7_mips,   gcc_dwarf_f7_mips,   LLDB_INVALID_REGNUM,    gdb_f7_mips),
-    DEFINE_FPR (fp_reg[8],   f8,    NULL,   gcc_dwarf_f8_mips,   gcc_dwarf_f8_mips,   LLDB_INVALID_REGNUM,    gdb_f8_mips),
-    DEFINE_FPR (fp_reg[9],   f9,    NULL,   gcc_dwarf_f9_mips,   gcc_dwarf_f9_mips,   LLDB_INVALID_REGNUM,    gdb_f9_mips),
-    DEFINE_FPR (fp_reg[10],  f10,   NULL,   gcc_dwarf_f10_mips,  gcc_dwarf_f10_mips,  LLDB_INVALID_REGNUM,    gdb_f10_mips),
-    DEFINE_FPR (fp_reg[11],  f11,   NULL,   gcc_dwarf_f11_mips,  gcc_dwarf_f11_mips,  LLDB_INVALID_REGNUM,    gdb_f11_mips),
-    DEFINE_FPR (fp_reg[12],  f12,   NULL,   gcc_dwarf_f12_mips,  gcc_dwarf_f12_mips,  LLDB_INVALID_REGNUM,    gdb_f12_mips),
-    DEFINE_FPR (fp_reg[13],  f13,   NULL,   gcc_dwarf_f13_mips,  gcc_dwarf_f13_mips,  LLDB_INVALID_REGNUM,    gdb_f13_mips),
-    DEFINE_FPR (fp_reg[14],  f14,   NULL,   gcc_dwarf_f14_mips,  gcc_dwarf_f14_mips,  LLDB_INVALID_REGNUM,    gdb_f14_mips),
-    DEFINE_FPR (fp_reg[15],  f15,   NULL,   gcc_dwarf_f15_mips,  gcc_dwarf_f15_mips,  LLDB_INVALID_REGNUM,    gdb_f15_mips),
-    DEFINE_FPR (fp_reg[16],  f16,   NULL,   gcc_dwarf_f16_mips,  gcc_dwarf_f16_mips,  LLDB_INVALID_REGNUM,    gdb_f16_mips),
-    DEFINE_FPR (fp_reg[17],  f17,   NULL,   gcc_dwarf_f17_mips,  gcc_dwarf_f17_mips,  LLDB_INVALID_REGNUM,    gdb_f17_mips),
-    DEFINE_FPR (fp_reg[18],  f18,   NULL,   gcc_dwarf_f18_mips,  gcc_dwarf_f18_mips,  LLDB_INVALID_REGNUM,    gdb_f18_mips),
-    DEFINE_FPR (fp_reg[19],  f19,   NULL,   gcc_dwarf_f19_mips,  gcc_dwarf_f19_mips,  LLDB_INVALID_REGNUM,    gdb_f19_mips),
-    DEFINE_FPR (fp_reg[20],  f20,   NULL,   gcc_dwarf_f20_mips,  gcc_dwarf_f20_mips,  LLDB_INVALID_REGNUM,    gdb_f20_mips),
-    DEFINE_FPR (fp_reg[21],  f21,   NULL,   gcc_dwarf_f21_mips,  gcc_dwarf_f21_mips,  LLDB_INVALID_REGNUM,    gdb_f21_mips),
-    DEFINE_FPR (fp_reg[22],  f22,   NULL,   gcc_dwarf_f22_mips,  gcc_dwarf_f22_mips,  LLDB_INVALID_REGNUM,    gdb_f22_mips),
-    DEFINE_FPR (fp_reg[23],  f23,   NULL,   gcc_dwarf_f23_mips,  gcc_dwarf_f23_mips,  LLDB_INVALID_REGNUM,    gdb_f23_mips),
-    DEFINE_FPR (fp_reg[24],  f24,   NULL,   gcc_dwarf_f24_mips,  gcc_dwarf_f24_mips,  LLDB_INVALID_REGNUM,    gdb_f24_mips),
-    DEFINE_FPR (fp_reg[25],  f25,   NULL,   gcc_dwarf_f25_mips,  gcc_dwarf_f25_mips,  LLDB_INVALID_REGNUM,    gdb_f25_mips),
-    DEFINE_FPR (fp_reg[26],  f26,   NULL,   gcc_dwarf_f26_mips,  gcc_dwarf_f26_mips,  LLDB_INVALID_REGNUM,    gdb_f26_mips),
-    DEFINE_FPR (fp_reg[27],  f27,   NULL,   gcc_dwarf_f27_mips,  gcc_dwarf_f27_mips,  LLDB_INVALID_REGNUM,    gdb_f27_mips),
-    DEFINE_FPR (fp_reg[28],  f28,   NULL,   gcc_dwarf_f28_mips,  gcc_dwarf_f28_mips,  LLDB_INVALID_REGNUM,    gdb_f28_mips),
-    DEFINE_FPR (fp_reg[29],  f29,   NULL,   gcc_dwarf_f29_mips,  gcc_dwarf_f29_mips,  LLDB_INVALID_REGNUM,    gdb_f29_mips),
-    DEFINE_FPR (fp_reg[30],  f30,   NULL,   gcc_dwarf_f30_mips,  gcc_dwarf_f30_mips,  LLDB_INVALID_REGNUM,    gdb_f30_mips),
-    DEFINE_FPR (fp_reg[31],  f31,   NULL,   gcc_dwarf_f31_mips,  gcc_dwarf_f31_mips,  LLDB_INVALID_REGNUM,    gdb_f31_mips),
-    DEFINE_FPR_INFO (fcsr,        fcsr,  NULL,   gcc_dwarf_fcsr_mips, gcc_dwarf_fcsr_mips, LLDB_INVALID_REGNUM,    gdb_fcsr_mips),
-    DEFINE_FPR_INFO (fir,         fir,   NULL,   gcc_dwarf_fir_mips,  gcc_dwarf_fir_mips,  LLDB_INVALID_REGNUM,    gdb_fir_mips)
+    DEFINE_GPR (pc,       NULL,   gcc_dwarf_pc_mips,    gcc_dwarf_pc_mips,    LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM),
+    DEFINE_GPR (config5,    NULL,   gcc_dwarf_config5_mips,    gcc_dwarf_config5_mips,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_FPR (f0,    NULL,   gcc_dwarf_f0_mips,   gcc_dwarf_f0_mips,   LLDB_INVALID_REGNUM,    gdb_f0_mips),
+    DEFINE_FPR (f1,    NULL,   gcc_dwarf_f1_mips,   gcc_dwarf_f1_mips,   LLDB_INVALID_REGNUM,    gdb_f1_mips),
+    DEFINE_FPR (f2,    NULL,   gcc_dwarf_f2_mips,   gcc_dwarf_f2_mips,   LLDB_INVALID_REGNUM,    gdb_f2_mips),
+    DEFINE_FPR (f3,    NULL,   gcc_dwarf_f3_mips,   gcc_dwarf_f3_mips,   LLDB_INVALID_REGNUM,    gdb_f3_mips),
+    DEFINE_FPR (f4,    NULL,   gcc_dwarf_f4_mips,   gcc_dwarf_f4_mips,   LLDB_INVALID_REGNUM,    gdb_f4_mips),
+    DEFINE_FPR (f5,    NULL,   gcc_dwarf_f5_mips,   gcc_dwarf_f5_mips,   LLDB_INVALID_REGNUM,    gdb_f5_mips),
+    DEFINE_FPR (f6,    NULL,   gcc_dwarf_f6_mips,   gcc_dwarf_f6_mips,   LLDB_INVALID_REGNUM,    gdb_f6_mips),
+    DEFINE_FPR (f7,    NULL,   gcc_dwarf_f7_mips,   gcc_dwarf_f7_mips,   LLDB_INVALID_REGNUM,    gdb_f7_mips),
+    DEFINE_FPR (f8,    NULL,   gcc_dwarf_f8_mips,   gcc_dwarf_f8_mips,   LLDB_INVALID_REGNUM,    gdb_f8_mips),
+    DEFINE_FPR (f9,    NULL,   gcc_dwarf_f9_mips,   gcc_dwarf_f9_mips,   LLDB_INVALID_REGNUM,    gdb_f9_mips),
+    DEFINE_FPR (f10,   NULL,   gcc_dwarf_f10_mips,  gcc_dwarf_f10_mips,  LLDB_INVALID_REGNUM,    gdb_f10_mips),
+    DEFINE_FPR (f11,   NULL,   gcc_dwarf_f11_mips,  gcc_dwarf_f11_mips,  LLDB_INVALID_REGNUM,    gdb_f11_mips),
+    DEFINE_FPR (f12,   NULL,   gcc_dwarf_f12_mips,  gcc_dwarf_f12_mips,  LLDB_INVALID_REGNUM,    gdb_f12_mips),
+    DEFINE_FPR (f13,   NULL,   gcc_dwarf_f13_mips,  gcc_dwarf_f13_mips,  LLDB_INVALID_REGNUM,    gdb_f13_mips),
+    DEFINE_FPR (f14,   NULL,   gcc_dwarf_f14_mips,  gcc_dwarf_f14_mips,  LLDB_INVALID_REGNUM,    gdb_f14_mips),
+    DEFINE_FPR (f15,   NULL,   gcc_dwarf_f15_mips,  gcc_dwarf_f15_mips,  LLDB_INVALID_REGNUM,    gdb_f15_mips),
+    DEFINE_FPR (f16,   NULL,   gcc_dwarf_f16_mips,  gcc_dwarf_f16_mips,  LLDB_INVALID_REGNUM,    gdb_f16_mips),
+    DEFINE_FPR (f17,   NULL,   gcc_dwarf_f17_mips,  gcc_dwarf_f17_mips,  LLDB_INVALID_REGNUM,    gdb_f17_mips),
+    DEFINE_FPR (f18,   NULL,   gcc_dwarf_f18_mips,  gcc_dwarf_f18_mips,  LLDB_INVALID_REGNUM,    gdb_f18_mips),
+    DEFINE_FPR (f19,   NULL,   gcc_dwarf_f19_mips,  gcc_dwarf_f19_mips,  LLDB_INVALID_REGNUM,    gdb_f19_mips),
+    DEFINE_FPR (f20,   NULL,   gcc_dwarf_f20_mips,  gcc_dwarf_f20_mips,  LLDB_INVALID_REGNUM,    gdb_f20_mips),
+    DEFINE_FPR (f21,   NULL,   gcc_dwarf_f21_mips,  gcc_dwarf_f21_mips,  LLDB_INVALID_REGNUM,    gdb_f21_mips),
+    DEFINE_FPR (f22,   NULL,   gcc_dwarf_f22_mips,  gcc_dwarf_f22_mips,  LLDB_INVALID_REGNUM,    gdb_f22_mips),
+    DEFINE_FPR (f23,   NULL,   gcc_dwarf_f23_mips,  gcc_dwarf_f23_mips,  LLDB_INVALID_REGNUM,    gdb_f23_mips),
+    DEFINE_FPR (f24,   NULL,   gcc_dwarf_f24_mips,  gcc_dwarf_f24_mips,  LLDB_INVALID_REGNUM,    gdb_f24_mips),
+    DEFINE_FPR (f25,   NULL,   gcc_dwarf_f25_mips,  gcc_dwarf_f25_mips,  LLDB_INVALID_REGNUM,    gdb_f25_mips),
+    DEFINE_FPR (f26,   NULL,   gcc_dwarf_f26_mips,  gcc_dwarf_f26_mips,  LLDB_INVALID_REGNUM,    gdb_f26_mips),
+    DEFINE_FPR (f27,   NULL,   gcc_dwarf_f27_mips,  gcc_dwarf_f27_mips,  LLDB_INVALID_REGNUM,    gdb_f27_mips),
+    DEFINE_FPR (f28,   NULL,   gcc_dwarf_f28_mips,  gcc_dwarf_f28_mips,  LLDB_INVALID_REGNUM,    gdb_f28_mips),
+    DEFINE_FPR (f29,   NULL,   gcc_dwarf_f29_mips,  gcc_dwarf_f29_mips,  LLDB_INVALID_REGNUM,    gdb_f29_mips),
+    DEFINE_FPR (f30,   NULL,   gcc_dwarf_f30_mips,  gcc_dwarf_f30_mips,  LLDB_INVALID_REGNUM,    gdb_f30_mips),
+    DEFINE_FPR (f31,   NULL,   gcc_dwarf_f31_mips,  gcc_dwarf_f31_mips,  LLDB_INVALID_REGNUM,    gdb_f31_mips),
+    DEFINE_FPR (fcsr,  NULL,   gcc_dwarf_fcsr_mips, gcc_dwarf_fcsr_mips, LLDB_INVALID_REGNUM,    gdb_fcsr_mips),
+    DEFINE_FPR (fir,   NULL,   gcc_dwarf_fir_mips,  gcc_dwarf_fir_mips,  LLDB_INVALID_REGNUM,    gdb_fir_mips),
+    DEFINE_FPR (config5,   NULL,   gcc_dwarf_config5_mips,  gcc_dwarf_config5_mips,  LLDB_INVALID_REGNUM,    gdb_config5_mips),
+    DEFINE_MSA (w0,    NULL,   gcc_dwarf_w0_mips,   gcc_dwarf_w0_mips,   LLDB_INVALID_REGNUM,    gdb_w0_mips),
+    DEFINE_MSA (w1,    NULL,   gcc_dwarf_w1_mips,   gcc_dwarf_w1_mips,   LLDB_INVALID_REGNUM,    gdb_w1_mips),
+    DEFINE_MSA (w2,    NULL,   gcc_dwarf_w2_mips,   gcc_dwarf_w2_mips,   LLDB_INVALID_REGNUM,    gdb_w2_mips),
+    DEFINE_MSA (w3,    NULL,   gcc_dwarf_w3_mips,   gcc_dwarf_w3_mips,   LLDB_INVALID_REGNUM,    gdb_w3_mips),
+    DEFINE_MSA (w4,    NULL,   gcc_dwarf_w4_mips,   gcc_dwarf_w4_mips,   LLDB_INVALID_REGNUM,    gdb_w4_mips),
+    DEFINE_MSA (w5,    NULL,   gcc_dwarf_w5_mips,   gcc_dwarf_w5_mips,   LLDB_INVALID_REGNUM,    gdb_w5_mips),
+    DEFINE_MSA (w6,    NULL,   gcc_dwarf_w6_mips,   gcc_dwarf_w6_mips,   LLDB_INVALID_REGNUM,    gdb_w6_mips),
+    DEFINE_MSA (w7,    NULL,   gcc_dwarf_w7_mips,   gcc_dwarf_w7_mips,   LLDB_INVALID_REGNUM,    gdb_w7_mips),
+    DEFINE_MSA (w8,    NULL,   gcc_dwarf_w8_mips,   gcc_dwarf_w8_mips,   LLDB_INVALID_REGNUM,    gdb_w8_mips),
+    DEFINE_MSA (w9,    NULL,   gcc_dwarf_w9_mips,   gcc_dwarf_w9_mips,   LLDB_INVALID_REGNUM,    gdb_w9_mips),
+    DEFINE_MSA (w10,   NULL,   gcc_dwarf_w10_mips,  gcc_dwarf_w10_mips,  LLDB_INVALID_REGNUM,    gdb_w10_mips),
+    DEFINE_MSA (w11,   NULL,   gcc_dwarf_w11_mips,  gcc_dwarf_w11_mips,  LLDB_INVALID_REGNUM,    gdb_w11_mips),
+    DEFINE_MSA (w12,   NULL,   gcc_dwarf_w12_mips,  gcc_dwarf_w12_mips,  LLDB_INVALID_REGNUM,    gdb_w12_mips),
+    DEFINE_MSA (w13,   NULL,   gcc_dwarf_w13_mips,  gcc_dwarf_w13_mips,  LLDB_INVALID_REGNUM,    gdb_w13_mips),
+    DEFINE_MSA (w14,   NULL,   gcc_dwarf_w14_mips,  gcc_dwarf_w14_mips,  LLDB_INVALID_REGNUM,    gdb_w14_mips),
+    DEFINE_MSA (w15,   NULL,   gcc_dwarf_w15_mips,  gcc_dwarf_w15_mips,  LLDB_INVALID_REGNUM,    gdb_w15_mips),
+    DEFINE_MSA (w16,   NULL,   gcc_dwarf_w16_mips,  gcc_dwarf_w16_mips,  LLDB_INVALID_REGNUM,    gdb_w16_mips),
+    DEFINE_MSA (w17,   NULL,   gcc_dwarf_w17_mips,  gcc_dwarf_w17_mips,  LLDB_INVALID_REGNUM,    gdb_w17_mips),
+    DEFINE_MSA (w18,   NULL,   gcc_dwarf_w18_mips,  gcc_dwarf_w18_mips,  LLDB_INVALID_REGNUM,    gdb_w18_mips),
+    DEFINE_MSA (w19,   NULL,   gcc_dwarf_w19_mips,  gcc_dwarf_w19_mips,  LLDB_INVALID_REGNUM,    gdb_w19_mips),
+    DEFINE_MSA (w20,   NULL,   gcc_dwarf_w10_mips,  gcc_dwarf_w20_mips,  LLDB_INVALID_REGNUM,    gdb_w20_mips),
+    DEFINE_MSA (w21,   NULL,   gcc_dwarf_w21_mips,  gcc_dwarf_w21_mips,  LLDB_INVALID_REGNUM,    gdb_w21_mips),
+    DEFINE_MSA (w22,   NULL,   gcc_dwarf_w22_mips,  gcc_dwarf_w22_mips,  LLDB_INVALID_REGNUM,    gdb_w22_mips),
+    DEFINE_MSA (w23,   NULL,   gcc_dwarf_w23_mips,  gcc_dwarf_w23_mips,  LLDB_INVALID_REGNUM,    gdb_w23_mips),
+    DEFINE_MSA (w24,   NULL,   gcc_dwarf_w24_mips,  gcc_dwarf_w24_mips,  LLDB_INVALID_REGNUM,    gdb_w24_mips),
+    DEFINE_MSA (w25,   NULL,   gcc_dwarf_w25_mips,  gcc_dwarf_w25_mips,  LLDB_INVALID_REGNUM,    gdb_w25_mips),
+    DEFINE_MSA (w26,   NULL,   gcc_dwarf_w26_mips,  gcc_dwarf_w26_mips,  LLDB_INVALID_REGNUM,    gdb_w26_mips),
+    DEFINE_MSA (w27,   NULL,   gcc_dwarf_w27_mips,  gcc_dwarf_w27_mips,  LLDB_INVALID_REGNUM,    gdb_w27_mips),
+    DEFINE_MSA (w28,   NULL,   gcc_dwarf_w28_mips,  gcc_dwarf_w28_mips,  LLDB_INVALID_REGNUM,    gdb_w28_mips),
+    DEFINE_MSA (w29,   NULL,   gcc_dwarf_w29_mips,  gcc_dwarf_w29_mips,  LLDB_INVALID_REGNUM,    gdb_w29_mips),
+    DEFINE_MSA (w30,   NULL,   gcc_dwarf_w30_mips,  gcc_dwarf_w30_mips,  LLDB_INVALID_REGNUM,    gdb_w30_mips),
+    DEFINE_MSA (w31,   NULL,   gcc_dwarf_w31_mips,  gcc_dwarf_w31_mips,  LLDB_INVALID_REGNUM,    gdb_w31_mips),
+    DEFINE_MSA_INFO (mcsr,  NULL,   gcc_dwarf_mcsr_mips, gcc_dwarf_mcsr_mips, LLDB_INVALID_REGNUM,    gdb_mcsr_mips),
+    DEFINE_MSA_INFO (mir,   NULL,   gcc_dwarf_mir_mips,  gcc_dwarf_mir_mips,  LLDB_INVALID_REGNUM,    gdb_mir_mips),
+    DEFINE_MSA_INFO (fcsr,  NULL,   gcc_dwarf_fcsr_mips, gcc_dwarf_fcsr_mips, LLDB_INVALID_REGNUM,    gdb_fcsr_mips),
+    DEFINE_MSA_INFO (fir,   NULL,   gcc_dwarf_fir_mips,  gcc_dwarf_fir_mips,  LLDB_INVALID_REGNUM,    gdb_fir_mips),
+    DEFINE_MSA_INFO (config5, NULL,   gcc_dwarf_config5_mips,  gcc_dwarf_config5_mips,  LLDB_INVALID_REGNUM,    gdb_config5_mips)
 };
 static_assert((sizeof(g_register_infos_mips) / sizeof(g_register_infos_mips[0])) == k_num_registers_mips,
     "g_register_infos_mips has wrong number of register infos");
 
 #undef GPR_OFFSET
 #undef FPR_OFFSET
+#undef MSA_OFFSET
 #undef DEFINE_GPR
 #undef DEFINE_FPR
+#undef DEFINE_MSA
+#undef DEFINE_MSA_INFO
 
 #endif // DECLARE_REGISTER_INFOS_MIPS_STRUCT

Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips64.h?rev=244308&r1=244307&r2=244308&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips64.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterInfos_mips64.h Fri Aug  7 01:39:38 2015
@@ -13,28 +13,59 @@
 #ifdef DECLARE_REGISTER_INFOS_MIPS64_STRUCT
 
 // Computes the offset of the given GPR in the user data area.
-#define GPR_OFFSET(regname) \
-    (LLVM_EXTENSION offsetof(GPR, regname))
+#ifdef LINUX_MIPS64
+    #define GPR_OFFSET(regname) \
+        (LLVM_EXTENSION offsetof(UserArea, gpr) + \
+         LLVM_EXTENSION offsetof(GPR_linux_mips, regname))
+#else
+    #define GPR_OFFSET(regname) \
+        (LLVM_EXTENSION offsetof(GPR_freebsd_mips, regname))
+#endif
 
 // Computes the offset of the given FPR in the extended data area.
 #define FPR_OFFSET(regname) \
-     LLVM_EXTENSION offsetof(FPR_mips, regname) \
+     (LLVM_EXTENSION offsetof(UserArea, fpr) + \
+      LLVM_EXTENSION offsetof(FPR_linux_mips, regname))
+
+// Computes the offset of the given MSA in the extended data area.
+#define MSA_OFFSET(regname) \
+     (LLVM_EXTENSION offsetof(UserArea, msa) + \
+      LLVM_EXTENSION offsetof(MSA_linux_mips, regname))
 
 // RegisterKind: GCC, DWARF, Generic, GDB, LLDB
 
 // Note that the size and offset will be updated by platform-specific classes.
-#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)    \
-    { #reg, alt, sizeof(((GPR*)0)->reg), GPR_OFFSET(reg), eEncodingUint, \
+#ifdef LINUX_MIPS64
+    #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4) \
+         { #reg, alt, sizeof(((GPR_linux_mips*)0)->reg), GPR_OFFSET(reg), eEncodingUint, \
+          eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL }
+#else
+    #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)    \
+         { #reg, alt, sizeof(((GPR_freebsd_mips*)0)->reg), GPR_OFFSET(reg), eEncodingUint, \
+          eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL }
+#endif
+
+#define DEFINE_GPR_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(((GPR_linux_mips*)0)->reg) / 2, GPR_OFFSET(reg), eEncodingUint, \
       eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL }
 
-#define DEFINE_FPR(member, reg, alt, kind1, kind2, kind3, kind4)    \
-    { #reg, alt, sizeof(((FPR_mips*)0)->member), FPR_OFFSET(member), eEncodingUint,   \
+#define DEFINE_FPR(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(((FPR_linux_mips*)0)->reg), FPR_OFFSET(reg), eEncodingUint,   \
       eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips64 }, NULL, NULL }
 
+#define DEFINE_MSA(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingVector,   \
+      eFormatVectorOfUInt8, { kind1, kind2, kind3, kind4, msa_##reg##_mips64 }, NULL, NULL }
+
+#define DEFINE_MSA_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingUint,   \
+      eFormatHex, { kind1, kind2, kind3, kind4, msa_##reg##_mips64 }, NULL, NULL }
+
 static RegisterInfo
 g_register_infos_mips64[] =
 {
     // General purpose registers.                 GCC,                  DWARF,              Generic,                GDB
+#ifndef LINUX_MIPS64
     DEFINE_GPR(zero,     "r0",  gcc_dwarf_zero_mips64,  gcc_dwarf_zero_mips64,  LLDB_INVALID_REGNUM,    gdb_zero_mips64),
     DEFINE_GPR(r1,       NULL,  gcc_dwarf_r1_mips64,    gcc_dwarf_r1_mips64,    LLDB_INVALID_REGNUM,    gdb_r1_mips64),
     DEFINE_GPR(r2,       NULL,  gcc_dwarf_r2_mips64,    gcc_dwarf_r2_mips64,    LLDB_INVALID_REGNUM,    gdb_r2_mips64),
@@ -67,56 +98,140 @@ g_register_infos_mips64[] =
     DEFINE_GPR(sp,       "r29", gcc_dwarf_sp_mips64,    gcc_dwarf_sp_mips64,    LLDB_REGNUM_GENERIC_SP, gdb_sp_mips64),
     DEFINE_GPR(r30,      NULL,  gcc_dwarf_r30_mips64,   gcc_dwarf_r30_mips64,   LLDB_REGNUM_GENERIC_FP,    gdb_r30_mips64),
     DEFINE_GPR(ra,       "r31", gcc_dwarf_ra_mips64,    gcc_dwarf_ra_mips64,    LLDB_REGNUM_GENERIC_RA,    gdb_ra_mips64),
+    DEFINE_GPR(sr,       NULL,  gcc_dwarf_sr_mips64,    gcc_dwarf_sr_mips64,    LLDB_REGNUM_GENERIC_FLAGS,    LLDB_INVALID_REGNUM),
     DEFINE_GPR(mullo,    NULL,  gcc_dwarf_lo_mips64,    gcc_dwarf_lo_mips64,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
     DEFINE_GPR(mulhi,    NULL,  gcc_dwarf_hi_mips64,    gcc_dwarf_hi_mips64,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
-    DEFINE_GPR(pc,       "pc",  gcc_dwarf_pc_mips64,    gcc_dwarf_pc_mips64,    LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM),
     DEFINE_GPR(badvaddr, NULL,  gcc_dwarf_bad_mips64,   gcc_dwarf_bad_mips64,   LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
-    DEFINE_GPR(sr,       NULL,  gcc_dwarf_sr_mips64,    gcc_dwarf_sr_mips64,    LLDB_REGNUM_GENERIC_FLAGS,    LLDB_INVALID_REGNUM),
     DEFINE_GPR(cause,    NULL,  gcc_dwarf_cause_mips64, gcc_dwarf_cause_mips64, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_GPR(pc,       "pc",  gcc_dwarf_pc_mips64,    gcc_dwarf_pc_mips64,    LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM),
     DEFINE_GPR(ic,       NULL,  gcc_dwarf_ic_mips64,    gcc_dwarf_ic_mips64,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
     DEFINE_GPR(dummy,    NULL,  gcc_dwarf_dummy_mips64, gcc_dwarf_dummy_mips64, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+#else
 
-    DEFINE_FPR (fp_reg[0],   f0,    NULL,   gcc_dwarf_f0_mips64,   gcc_dwarf_f0_mips64,   LLDB_INVALID_REGNUM,    gdb_f0_mips64),
-    DEFINE_FPR (fp_reg[1],   f1,    NULL,   gcc_dwarf_f1_mips64,   gcc_dwarf_f1_mips64,   LLDB_INVALID_REGNUM,    gdb_f1_mips64),
-    DEFINE_FPR (fp_reg[2],   f2,    NULL,   gcc_dwarf_f2_mips64,   gcc_dwarf_f2_mips64,   LLDB_INVALID_REGNUM,    gdb_f2_mips64),
-    DEFINE_FPR (fp_reg[3],   f3,    NULL,   gcc_dwarf_f3_mips64,   gcc_dwarf_f3_mips64,   LLDB_INVALID_REGNUM,    gdb_f3_mips64),
-    DEFINE_FPR (fp_reg[4],   f4,    NULL,   gcc_dwarf_f4_mips64,   gcc_dwarf_f4_mips64,   LLDB_INVALID_REGNUM,    gdb_f4_mips64),
-    DEFINE_FPR (fp_reg[5],   f5,    NULL,   gcc_dwarf_f5_mips64,   gcc_dwarf_f5_mips64,   LLDB_INVALID_REGNUM,    gdb_f5_mips64),
-    DEFINE_FPR (fp_reg[6],   f6,    NULL,   gcc_dwarf_f6_mips64,   gcc_dwarf_f6_mips64,   LLDB_INVALID_REGNUM,    gdb_f6_mips64),
-    DEFINE_FPR (fp_reg[7],   f7,    NULL,   gcc_dwarf_f7_mips64,   gcc_dwarf_f7_mips64,   LLDB_INVALID_REGNUM,    gdb_f7_mips64),
-    DEFINE_FPR (fp_reg[8],   f8,    NULL,   gcc_dwarf_f8_mips64,   gcc_dwarf_f8_mips64,   LLDB_INVALID_REGNUM,    gdb_f8_mips64),
-    DEFINE_FPR (fp_reg[9],   f9,    NULL,   gcc_dwarf_f9_mips64,   gcc_dwarf_f9_mips64,   LLDB_INVALID_REGNUM,    gdb_f9_mips64),
-    DEFINE_FPR (fp_reg[10],  f10,   NULL,   gcc_dwarf_f10_mips64,  gcc_dwarf_f10_mips64,  LLDB_INVALID_REGNUM,    gdb_f10_mips64),
-    DEFINE_FPR (fp_reg[11],  f11,   NULL,   gcc_dwarf_f11_mips64,  gcc_dwarf_f11_mips64,  LLDB_INVALID_REGNUM,    gdb_f11_mips64),
-    DEFINE_FPR (fp_reg[12],  f12,   NULL,   gcc_dwarf_f12_mips64,  gcc_dwarf_f12_mips64,  LLDB_INVALID_REGNUM,    gdb_f12_mips64),
-    DEFINE_FPR (fp_reg[13],  f13,   NULL,   gcc_dwarf_f13_mips64,  gcc_dwarf_f13_mips64,  LLDB_INVALID_REGNUM,    gdb_f13_mips64),
-    DEFINE_FPR (fp_reg[14],  f14,   NULL,   gcc_dwarf_f14_mips64,  gcc_dwarf_f14_mips64,  LLDB_INVALID_REGNUM,    gdb_f14_mips64),
-    DEFINE_FPR (fp_reg[15],  f15,   NULL,   gcc_dwarf_f15_mips64,  gcc_dwarf_f15_mips64,  LLDB_INVALID_REGNUM,    gdb_f15_mips64),
-    DEFINE_FPR (fp_reg[16],  f16,   NULL,   gcc_dwarf_f16_mips64,  gcc_dwarf_f16_mips64,  LLDB_INVALID_REGNUM,    gdb_f16_mips64),
-    DEFINE_FPR (fp_reg[17],  f17,   NULL,   gcc_dwarf_f17_mips64,  gcc_dwarf_f17_mips64,  LLDB_INVALID_REGNUM,    gdb_f17_mips64),
-    DEFINE_FPR (fp_reg[18],  f18,   NULL,   gcc_dwarf_f18_mips64,  gcc_dwarf_f18_mips64,  LLDB_INVALID_REGNUM,    gdb_f18_mips64),
-    DEFINE_FPR (fp_reg[19],  f19,   NULL,   gcc_dwarf_f19_mips64,  gcc_dwarf_f19_mips64,  LLDB_INVALID_REGNUM,    gdb_f19_mips64),
-    DEFINE_FPR (fp_reg[20],  f20,   NULL,   gcc_dwarf_f20_mips64,  gcc_dwarf_f20_mips64,  LLDB_INVALID_REGNUM,    gdb_f20_mips64),
-    DEFINE_FPR (fp_reg[21],  f21,   NULL,   gcc_dwarf_f21_mips64,  gcc_dwarf_f21_mips64,  LLDB_INVALID_REGNUM,    gdb_f21_mips64),
-    DEFINE_FPR (fp_reg[22],  f22,   NULL,   gcc_dwarf_f22_mips64,  gcc_dwarf_f22_mips64,  LLDB_INVALID_REGNUM,    gdb_f22_mips64),
-    DEFINE_FPR (fp_reg[23],  f23,   NULL,   gcc_dwarf_f23_mips64,  gcc_dwarf_f23_mips64,  LLDB_INVALID_REGNUM,    gdb_f23_mips64),
-    DEFINE_FPR (fp_reg[24],  f24,   NULL,   gcc_dwarf_f24_mips64,  gcc_dwarf_f24_mips64,  LLDB_INVALID_REGNUM,    gdb_f24_mips64),
-    DEFINE_FPR (fp_reg[25],  f25,   NULL,   gcc_dwarf_f25_mips64,  gcc_dwarf_f25_mips64,  LLDB_INVALID_REGNUM,    gdb_f25_mips64),
-    DEFINE_FPR (fp_reg[26],  f26,   NULL,   gcc_dwarf_f26_mips64,  gcc_dwarf_f26_mips64,  LLDB_INVALID_REGNUM,    gdb_f26_mips64),
-    DEFINE_FPR (fp_reg[27],  f27,   NULL,   gcc_dwarf_f27_mips64,  gcc_dwarf_f27_mips64,  LLDB_INVALID_REGNUM,    gdb_f27_mips64),
-    DEFINE_FPR (fp_reg[28],  f28,   NULL,   gcc_dwarf_f28_mips64,  gcc_dwarf_f28_mips64,  LLDB_INVALID_REGNUM,    gdb_f28_mips64),
-    DEFINE_FPR (fp_reg[29],  f29,   NULL,   gcc_dwarf_f29_mips64,  gcc_dwarf_f29_mips64,  LLDB_INVALID_REGNUM,    gdb_f29_mips64),
-    DEFINE_FPR (fp_reg[30],  f30,   NULL,   gcc_dwarf_f30_mips64,  gcc_dwarf_f30_mips64,  LLDB_INVALID_REGNUM,    gdb_f30_mips64),
-    DEFINE_FPR (fp_reg[31],  f31,   NULL,   gcc_dwarf_f31_mips64,  gcc_dwarf_f31_mips64,  LLDB_INVALID_REGNUM,    gdb_f31_mips64),
-    DEFINE_FPR (fcsr,        fcsr,  NULL,   gcc_dwarf_fcsr_mips64, gcc_dwarf_fcsr_mips64, LLDB_INVALID_REGNUM,    gdb_fcsr_mips64),
-    DEFINE_FPR (fir,         fir,   NULL,   gcc_dwarf_fir_mips64,  gcc_dwarf_fir_mips64,  LLDB_INVALID_REGNUM,    gdb_fir_mips64)
+    DEFINE_GPR(zero,     "r0",  gcc_dwarf_zero_mips64,  gcc_dwarf_zero_mips64,  LLDB_INVALID_REGNUM,    gdb_zero_mips64),
+    DEFINE_GPR(r1,       NULL,  gcc_dwarf_r1_mips64,    gcc_dwarf_r1_mips64,    LLDB_INVALID_REGNUM,    gdb_r1_mips64),
+    DEFINE_GPR(r2,       NULL,  gcc_dwarf_r2_mips64,    gcc_dwarf_r2_mips64,    LLDB_INVALID_REGNUM,    gdb_r2_mips64),
+    DEFINE_GPR(r3,       NULL,  gcc_dwarf_r3_mips64,    gcc_dwarf_r3_mips64,    LLDB_INVALID_REGNUM,    gdb_r3_mips64),
+    DEFINE_GPR(r4,       NULL,  gcc_dwarf_r4_mips64,    gcc_dwarf_r4_mips64,    LLDB_REGNUM_GENERIC_ARG1,    gdb_r4_mips64),
+    DEFINE_GPR(r5,       NULL,  gcc_dwarf_r5_mips64,    gcc_dwarf_r5_mips64,    LLDB_REGNUM_GENERIC_ARG2,    gdb_r5_mips64),
+    DEFINE_GPR(r6,       NULL,  gcc_dwarf_r6_mips64,    gcc_dwarf_r6_mips64,    LLDB_REGNUM_GENERIC_ARG3,    gdb_r6_mips64),
+    DEFINE_GPR(r7,       NULL,  gcc_dwarf_r7_mips64,    gcc_dwarf_r7_mips64,    LLDB_REGNUM_GENERIC_ARG4,    gdb_r7_mips64),
+    DEFINE_GPR(r8,       NULL,  gcc_dwarf_r8_mips64,    gcc_dwarf_r8_mips64,    LLDB_REGNUM_GENERIC_ARG5,    gdb_r8_mips64),
+    DEFINE_GPR(r9,       NULL,  gcc_dwarf_r9_mips64,    gcc_dwarf_r9_mips64,    LLDB_REGNUM_GENERIC_ARG6,    gdb_r9_mips64),
+    DEFINE_GPR(r10,      NULL,  gcc_dwarf_r10_mips64,   gcc_dwarf_r10_mips64,   LLDB_REGNUM_GENERIC_ARG7,    gdb_r10_mips64),
+    DEFINE_GPR(r11,      NULL,  gcc_dwarf_r11_mips64,   gcc_dwarf_r11_mips64,   LLDB_REGNUM_GENERIC_ARG8,    gdb_r11_mips64),
+    DEFINE_GPR(r12,      NULL,  gcc_dwarf_r12_mips64,   gcc_dwarf_r12_mips64,   LLDB_INVALID_REGNUM,    gdb_r12_mips64),
+    DEFINE_GPR(r13,      NULL,  gcc_dwarf_r13_mips64,   gcc_dwarf_r13_mips64,   LLDB_INVALID_REGNUM,    gdb_r13_mips64),
+    DEFINE_GPR(r14,      NULL,  gcc_dwarf_r14_mips64,   gcc_dwarf_r14_mips64,   LLDB_INVALID_REGNUM,    gdb_r14_mips64),
+    DEFINE_GPR(r15,      NULL,  gcc_dwarf_r15_mips64,   gcc_dwarf_r15_mips64,   LLDB_INVALID_REGNUM,    gdb_r15_mips64),
+    DEFINE_GPR(r16,      NULL,  gcc_dwarf_r16_mips64,   gcc_dwarf_r16_mips64,   LLDB_INVALID_REGNUM,    gdb_r16_mips64),
+    DEFINE_GPR(r17,      NULL,  gcc_dwarf_r17_mips64,   gcc_dwarf_r17_mips64,   LLDB_INVALID_REGNUM,    gdb_r17_mips64),
+    DEFINE_GPR(r18,      NULL,  gcc_dwarf_r18_mips64,   gcc_dwarf_r18_mips64,   LLDB_INVALID_REGNUM,    gdb_r18_mips64),
+    DEFINE_GPR(r19,      NULL,  gcc_dwarf_r19_mips64,   gcc_dwarf_r19_mips64,   LLDB_INVALID_REGNUM,    gdb_r19_mips64),
+    DEFINE_GPR(r20,      NULL,  gcc_dwarf_r20_mips64,   gcc_dwarf_r20_mips64,   LLDB_INVALID_REGNUM,    gdb_r20_mips64),
+    DEFINE_GPR(r21,      NULL,  gcc_dwarf_r21_mips64,   gcc_dwarf_r21_mips64,   LLDB_INVALID_REGNUM,    gdb_r21_mips64),
+    DEFINE_GPR(r22,      NULL,  gcc_dwarf_r22_mips64,   gcc_dwarf_r22_mips64,   LLDB_INVALID_REGNUM,    gdb_r22_mips64),
+    DEFINE_GPR(r23,      NULL,  gcc_dwarf_r23_mips64,   gcc_dwarf_r23_mips64,   LLDB_INVALID_REGNUM,    gdb_r23_mips64),
+    DEFINE_GPR(r24,      NULL,  gcc_dwarf_r24_mips64,   gcc_dwarf_r24_mips64,   LLDB_INVALID_REGNUM,    gdb_r24_mips64),
+    DEFINE_GPR(r25,      NULL,  gcc_dwarf_r25_mips64,   gcc_dwarf_r25_mips64,   LLDB_INVALID_REGNUM,    gdb_r25_mips64),
+    DEFINE_GPR(r26,      NULL,  gcc_dwarf_r26_mips64,   gcc_dwarf_r26_mips64,   LLDB_INVALID_REGNUM,    gdb_r26_mips64),
+    DEFINE_GPR(r27,      NULL,  gcc_dwarf_r27_mips64,   gcc_dwarf_r27_mips64,   LLDB_INVALID_REGNUM,    gdb_r27_mips64),
+    DEFINE_GPR(gp,       "r28", gcc_dwarf_gp_mips64,    gcc_dwarf_gp_mips64,    LLDB_INVALID_REGNUM,    gdb_gp_mips64),
+    DEFINE_GPR(sp,       "r29", gcc_dwarf_sp_mips64,    gcc_dwarf_sp_mips64,    LLDB_REGNUM_GENERIC_SP, gdb_sp_mips64),
+    DEFINE_GPR(r30,      NULL,  gcc_dwarf_r30_mips64,   gcc_dwarf_r30_mips64,   LLDB_REGNUM_GENERIC_FP,    gdb_r30_mips64),
+    DEFINE_GPR(ra,       "r31", gcc_dwarf_ra_mips64,    gcc_dwarf_ra_mips64,    LLDB_REGNUM_GENERIC_RA,    gdb_ra_mips64),
+    DEFINE_GPR_INFO(sr,       NULL,  gcc_dwarf_sr_mips64,    gcc_dwarf_sr_mips64,    LLDB_REGNUM_GENERIC_FLAGS,    LLDB_INVALID_REGNUM),
+    DEFINE_GPR(mullo,    NULL,  gcc_dwarf_lo_mips64,    gcc_dwarf_lo_mips64,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_GPR(mulhi,    NULL,  gcc_dwarf_hi_mips64,    gcc_dwarf_hi_mips64,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_GPR(badvaddr, NULL,  gcc_dwarf_bad_mips64,   gcc_dwarf_bad_mips64,   LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_GPR_INFO(cause,    NULL,  gcc_dwarf_cause_mips64, gcc_dwarf_cause_mips64, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_GPR(pc,       "pc",  gcc_dwarf_pc_mips64,    gcc_dwarf_pc_mips64,    LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM),
+    DEFINE_GPR_INFO(config5,    NULL,  gcc_dwarf_config5_mips64, gcc_dwarf_config5_mips64, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM),
+    DEFINE_FPR (f0,    NULL,   gcc_dwarf_f0_mips64,   gcc_dwarf_f0_mips64,   LLDB_INVALID_REGNUM,    gdb_f0_mips64),
+    DEFINE_FPR (f1,    NULL,   gcc_dwarf_f1_mips64,   gcc_dwarf_f1_mips64,   LLDB_INVALID_REGNUM,    gdb_f1_mips64),
+    DEFINE_FPR (f2,    NULL,   gcc_dwarf_f2_mips64,   gcc_dwarf_f2_mips64,   LLDB_INVALID_REGNUM,    gdb_f2_mips64),
+    DEFINE_FPR (f3,    NULL,   gcc_dwarf_f3_mips64,   gcc_dwarf_f3_mips64,   LLDB_INVALID_REGNUM,    gdb_f3_mips64),
+    DEFINE_FPR (f4,    NULL,   gcc_dwarf_f4_mips64,   gcc_dwarf_f4_mips64,   LLDB_INVALID_REGNUM,    gdb_f4_mips64),
+    DEFINE_FPR (f5,    NULL,   gcc_dwarf_f5_mips64,   gcc_dwarf_f5_mips64,   LLDB_INVALID_REGNUM,    gdb_f5_mips64),
+    DEFINE_FPR (f6,    NULL,   gcc_dwarf_f6_mips64,   gcc_dwarf_f6_mips64,   LLDB_INVALID_REGNUM,    gdb_f6_mips64),
+    DEFINE_FPR (f7,    NULL,   gcc_dwarf_f7_mips64,   gcc_dwarf_f7_mips64,   LLDB_INVALID_REGNUM,    gdb_f7_mips64),
+    DEFINE_FPR (f8,    NULL,   gcc_dwarf_f8_mips64,   gcc_dwarf_f8_mips64,   LLDB_INVALID_REGNUM,    gdb_f8_mips64),
+    DEFINE_FPR (f9,    NULL,   gcc_dwarf_f9_mips64,   gcc_dwarf_f9_mips64,   LLDB_INVALID_REGNUM,    gdb_f9_mips64),
+    DEFINE_FPR (f10,   NULL,   gcc_dwarf_f10_mips64,  gcc_dwarf_f10_mips64,  LLDB_INVALID_REGNUM,    gdb_f10_mips64),
+    DEFINE_FPR (f11,   NULL,   gcc_dwarf_f11_mips64,  gcc_dwarf_f11_mips64,  LLDB_INVALID_REGNUM,    gdb_f11_mips64),
+    DEFINE_FPR (f12,   NULL,   gcc_dwarf_f12_mips64,  gcc_dwarf_f12_mips64,  LLDB_INVALID_REGNUM,    gdb_f12_mips64),
+    DEFINE_FPR (f13,   NULL,   gcc_dwarf_f13_mips64,  gcc_dwarf_f13_mips64,  LLDB_INVALID_REGNUM,    gdb_f13_mips64),
+    DEFINE_FPR (f14,   NULL,   gcc_dwarf_f14_mips64,  gcc_dwarf_f14_mips64,  LLDB_INVALID_REGNUM,    gdb_f14_mips64),
+    DEFINE_FPR (f15,   NULL,   gcc_dwarf_f15_mips64,  gcc_dwarf_f15_mips64,  LLDB_INVALID_REGNUM,    gdb_f15_mips64),
+    DEFINE_FPR (f16,   NULL,   gcc_dwarf_f16_mips64,  gcc_dwarf_f16_mips64,  LLDB_INVALID_REGNUM,    gdb_f16_mips64),
+    DEFINE_FPR (f17,   NULL,   gcc_dwarf_f17_mips64,  gcc_dwarf_f17_mips64,  LLDB_INVALID_REGNUM,    gdb_f17_mips64),
+    DEFINE_FPR (f18,   NULL,   gcc_dwarf_f18_mips64,  gcc_dwarf_f18_mips64,  LLDB_INVALID_REGNUM,    gdb_f18_mips64),
+    DEFINE_FPR (f19,   NULL,   gcc_dwarf_f19_mips64,  gcc_dwarf_f19_mips64,  LLDB_INVALID_REGNUM,    gdb_f19_mips64),
+    DEFINE_FPR (f20,   NULL,   gcc_dwarf_f20_mips64,  gcc_dwarf_f20_mips64,  LLDB_INVALID_REGNUM,    gdb_f20_mips64),
+    DEFINE_FPR (f21,   NULL,   gcc_dwarf_f21_mips64,  gcc_dwarf_f21_mips64,  LLDB_INVALID_REGNUM,    gdb_f21_mips64),
+    DEFINE_FPR (f22,   NULL,   gcc_dwarf_f22_mips64,  gcc_dwarf_f22_mips64,  LLDB_INVALID_REGNUM,    gdb_f22_mips64),
+    DEFINE_FPR (f23,   NULL,   gcc_dwarf_f23_mips64,  gcc_dwarf_f23_mips64,  LLDB_INVALID_REGNUM,    gdb_f23_mips64),
+    DEFINE_FPR (f24,   NULL,   gcc_dwarf_f24_mips64,  gcc_dwarf_f24_mips64,  LLDB_INVALID_REGNUM,    gdb_f24_mips64),
+    DEFINE_FPR (f25,   NULL,   gcc_dwarf_f25_mips64,  gcc_dwarf_f25_mips64,  LLDB_INVALID_REGNUM,    gdb_f25_mips64),
+    DEFINE_FPR (f26,   NULL,   gcc_dwarf_f26_mips64,  gcc_dwarf_f26_mips64,  LLDB_INVALID_REGNUM,    gdb_f26_mips64),
+    DEFINE_FPR (f27,   NULL,   gcc_dwarf_f27_mips64,  gcc_dwarf_f27_mips64,  LLDB_INVALID_REGNUM,    gdb_f27_mips64),
+    DEFINE_FPR (f28,   NULL,   gcc_dwarf_f28_mips64,  gcc_dwarf_f28_mips64,  LLDB_INVALID_REGNUM,    gdb_f28_mips64),
+    DEFINE_FPR (f29,   NULL,   gcc_dwarf_f29_mips64,  gcc_dwarf_f29_mips64,  LLDB_INVALID_REGNUM,    gdb_f29_mips64),
+    DEFINE_FPR (f30,   NULL,   gcc_dwarf_f30_mips64,  gcc_dwarf_f30_mips64,  LLDB_INVALID_REGNUM,    gdb_f30_mips64),
+    DEFINE_FPR (f31,   NULL,   gcc_dwarf_f31_mips64,  gcc_dwarf_f31_mips64,  LLDB_INVALID_REGNUM,    gdb_f31_mips64),
+    DEFINE_FPR (fcsr,  NULL,   gcc_dwarf_fcsr_mips64, gcc_dwarf_fcsr_mips64, LLDB_INVALID_REGNUM,    gdb_fcsr_mips64),
+    DEFINE_FPR (fir,   NULL,   gcc_dwarf_fir_mips64,  gcc_dwarf_fir_mips64,  LLDB_INVALID_REGNUM,    gdb_fir_mips64),
+    DEFINE_FPR (config5,   NULL,   gcc_dwarf_config5_mips64,  gcc_dwarf_config5_mips64,  LLDB_INVALID_REGNUM,    gdb_config5_mips64),
+    DEFINE_MSA (w0,    NULL,   gcc_dwarf_w0_mips64,   gcc_dwarf_w0_mips64,   LLDB_INVALID_REGNUM,    gdb_w0_mips64),
+    DEFINE_MSA (w1,    NULL,   gcc_dwarf_w1_mips64,   gcc_dwarf_w1_mips64,   LLDB_INVALID_REGNUM,    gdb_w1_mips64),
+    DEFINE_MSA (w2,    NULL,   gcc_dwarf_w2_mips64,   gcc_dwarf_w2_mips64,   LLDB_INVALID_REGNUM,    gdb_w2_mips64),
+    DEFINE_MSA (w3,    NULL,   gcc_dwarf_w3_mips64,   gcc_dwarf_w3_mips64,   LLDB_INVALID_REGNUM,    gdb_w3_mips64),
+    DEFINE_MSA (w4,    NULL,   gcc_dwarf_w4_mips64,   gcc_dwarf_w4_mips64,   LLDB_INVALID_REGNUM,    gdb_w4_mips64),
+    DEFINE_MSA (w5,    NULL,   gcc_dwarf_w5_mips64,   gcc_dwarf_w5_mips64,   LLDB_INVALID_REGNUM,    gdb_w5_mips64),
+    DEFINE_MSA (w6,    NULL,   gcc_dwarf_w6_mips64,   gcc_dwarf_w6_mips64,   LLDB_INVALID_REGNUM,    gdb_w6_mips64),
+    DEFINE_MSA (w7,    NULL,   gcc_dwarf_w7_mips64,   gcc_dwarf_w7_mips64,   LLDB_INVALID_REGNUM,    gdb_w7_mips64),
+    DEFINE_MSA (w8,    NULL,   gcc_dwarf_w8_mips64,   gcc_dwarf_w8_mips64,   LLDB_INVALID_REGNUM,    gdb_w8_mips64),
+    DEFINE_MSA (w9,    NULL,   gcc_dwarf_w9_mips64,   gcc_dwarf_w9_mips64,   LLDB_INVALID_REGNUM,    gdb_w9_mips64),
+    DEFINE_MSA (w10,   NULL,   gcc_dwarf_w10_mips64,  gcc_dwarf_w10_mips64,  LLDB_INVALID_REGNUM,    gdb_w10_mips64),
+    DEFINE_MSA (w11,   NULL,   gcc_dwarf_w11_mips64,  gcc_dwarf_w11_mips64,  LLDB_INVALID_REGNUM,    gdb_w11_mips64),
+    DEFINE_MSA (w12,   NULL,   gcc_dwarf_w12_mips64,  gcc_dwarf_w12_mips64,  LLDB_INVALID_REGNUM,    gdb_w12_mips64),
+    DEFINE_MSA (w13,   NULL,   gcc_dwarf_w13_mips64,  gcc_dwarf_w13_mips64,  LLDB_INVALID_REGNUM,    gdb_w13_mips64),
+    DEFINE_MSA (w14,   NULL,   gcc_dwarf_w14_mips64,  gcc_dwarf_w14_mips64,  LLDB_INVALID_REGNUM,    gdb_w14_mips64),
+    DEFINE_MSA (w15,   NULL,   gcc_dwarf_w15_mips64,  gcc_dwarf_w15_mips64,  LLDB_INVALID_REGNUM,    gdb_w15_mips64),
+    DEFINE_MSA (w16,   NULL,   gcc_dwarf_w16_mips64,  gcc_dwarf_w16_mips64,  LLDB_INVALID_REGNUM,    gdb_w16_mips64),
+    DEFINE_MSA (w17,   NULL,   gcc_dwarf_w17_mips64,  gcc_dwarf_w17_mips64,  LLDB_INVALID_REGNUM,    gdb_w17_mips64),
+    DEFINE_MSA (w18,   NULL,   gcc_dwarf_w18_mips64,  gcc_dwarf_w18_mips64,  LLDB_INVALID_REGNUM,    gdb_w18_mips64),
+    DEFINE_MSA (w19,   NULL,   gcc_dwarf_w19_mips64,  gcc_dwarf_w19_mips64,  LLDB_INVALID_REGNUM,    gdb_w19_mips64),
+    DEFINE_MSA (w20,   NULL,   gcc_dwarf_w10_mips64,  gcc_dwarf_w20_mips64,  LLDB_INVALID_REGNUM,    gdb_w20_mips64),
+    DEFINE_MSA (w21,   NULL,   gcc_dwarf_w21_mips64,  gcc_dwarf_w21_mips64,  LLDB_INVALID_REGNUM,    gdb_w21_mips64),
+    DEFINE_MSA (w22,   NULL,   gcc_dwarf_w22_mips64,  gcc_dwarf_w22_mips64,  LLDB_INVALID_REGNUM,    gdb_w22_mips64),
+    DEFINE_MSA (w23,   NULL,   gcc_dwarf_w23_mips64,  gcc_dwarf_w23_mips64,  LLDB_INVALID_REGNUM,    gdb_w23_mips64),
+    DEFINE_MSA (w24,   NULL,   gcc_dwarf_w24_mips64,  gcc_dwarf_w24_mips64,  LLDB_INVALID_REGNUM,    gdb_w24_mips64),
+    DEFINE_MSA (w25,   NULL,   gcc_dwarf_w25_mips64,  gcc_dwarf_w25_mips64,  LLDB_INVALID_REGNUM,    gdb_w25_mips64),
+    DEFINE_MSA (w26,   NULL,   gcc_dwarf_w26_mips64,  gcc_dwarf_w26_mips64,  LLDB_INVALID_REGNUM,    gdb_w26_mips64),
+    DEFINE_MSA (w27,   NULL,   gcc_dwarf_w27_mips64,  gcc_dwarf_w27_mips64,  LLDB_INVALID_REGNUM,    gdb_w27_mips64),
+    DEFINE_MSA (w28,   NULL,   gcc_dwarf_w28_mips64,  gcc_dwarf_w28_mips64,  LLDB_INVALID_REGNUM,    gdb_w28_mips64),
+    DEFINE_MSA (w29,   NULL,   gcc_dwarf_w29_mips64,  gcc_dwarf_w29_mips64,  LLDB_INVALID_REGNUM,    gdb_w29_mips64),
+    DEFINE_MSA (w30,   NULL,   gcc_dwarf_w30_mips64,  gcc_dwarf_w30_mips64,  LLDB_INVALID_REGNUM,    gdb_w30_mips64),
+    DEFINE_MSA (w31,   NULL,   gcc_dwarf_w31_mips64,  gcc_dwarf_w31_mips64,  LLDB_INVALID_REGNUM,    gdb_w31_mips64),
+    DEFINE_MSA_INFO (mcsr,  NULL,   gcc_dwarf_mcsr_mips64, gcc_dwarf_mcsr_mips64, LLDB_INVALID_REGNUM,    gdb_mcsr_mips64),
+    DEFINE_MSA_INFO (mir,   NULL,   gcc_dwarf_mir_mips64,  gcc_dwarf_mir_mips64,  LLDB_INVALID_REGNUM,    gdb_mir_mips64),
+    DEFINE_MSA_INFO (fcsr,  NULL,   gcc_dwarf_fcsr_mips64, gcc_dwarf_fcsr_mips64, LLDB_INVALID_REGNUM,    gdb_fcsr_mips64),
+    DEFINE_MSA_INFO (fir,   NULL,   gcc_dwarf_fir_mips64,  gcc_dwarf_fir_mips64,  LLDB_INVALID_REGNUM,    gdb_fir_mips64),
+    DEFINE_MSA_INFO (config5, NULL,   gcc_dwarf_config5_mips64,  gcc_dwarf_config5_mips64,  LLDB_INVALID_REGNUM,    gdb_config5_mips64)
+#endif
 };
+
 static_assert((sizeof(g_register_infos_mips64) / sizeof(g_register_infos_mips64[0])) == k_num_registers_mips64,
     "g_register_infos_mips64 has wrong number of register infos");
 
 #undef DEFINE_GPR
+#undef DEFINE_GPR_INFO
 #undef DEFINE_FPR
+#undef DEFINE_MSA
+#undef DEFINE_MSA_INFO
 #undef GPR_OFFSET
 #undef FPR_OFFSET
+#undef MSA_OFFSET
 
 #endif // DECLARE_REGISTER_INFOS_MIPS64_STRUCT

Added: lldb/trunk/source/Plugins/Process/Utility/lldb-mips-freebsd-register-enums.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/lldb-mips-freebsd-register-enums.h?rev=244308&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/lldb-mips-freebsd-register-enums.h (added)
+++ lldb/trunk/source/Plugins/Process/Utility/lldb-mips-freebsd-register-enums.h Fri Aug  7 01:39:38 2015
@@ -0,0 +1,70 @@
+//===-- lldb-mips-frebsd-register-enums.h -------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef lldb_mips_freebsd_register_enums_h
+#define lldb_mips_freebsd_register_enums_h
+
+namespace lldb_private
+{
+    // LLDB register codes (e.g. RegisterKind == eRegisterKindLLDB)
+
+    //---------------------------------------------------------------------------
+    // Internal codes for all mips registers.
+    //---------------------------------------------------------------------------
+    enum
+    {
+        k_first_gpr_mips64,
+        gpr_zero_mips64 = k_first_gpr_mips64,
+        gpr_r1_mips64,
+        gpr_r2_mips64,
+        gpr_r3_mips64,
+        gpr_r4_mips64,
+        gpr_r5_mips64,
+        gpr_r6_mips64,
+        gpr_r7_mips64,
+        gpr_r8_mips64,
+        gpr_r9_mips64,
+        gpr_r10_mips64,
+        gpr_r11_mips64,
+        gpr_r12_mips64,
+        gpr_r13_mips64,
+        gpr_r14_mips64,
+        gpr_r15_mips64,
+        gpr_r16_mips64,
+        gpr_r17_mips64,
+        gpr_r18_mips64,
+        gpr_r19_mips64,
+        gpr_r20_mips64,
+        gpr_r21_mips64,
+        gpr_r22_mips64,
+        gpr_r23_mips64,
+        gpr_r24_mips64,
+        gpr_r25_mips64,
+        gpr_r26_mips64,
+        gpr_r27_mips64,
+        gpr_gp_mips64,
+        gpr_sp_mips64,
+        gpr_r30_mips64,
+        gpr_ra_mips64,
+        gpr_sr_mips64,
+        gpr_mullo_mips64,
+        gpr_mulhi_mips64,
+        gpr_badvaddr_mips64,
+        gpr_cause_mips64,
+        gpr_pc_mips64,
+        gpr_ic_mips64,
+        gpr_dummy_mips64,
+        k_last_gpr_mips64 = gpr_dummy_mips64,
+
+        k_num_registers_mips64,
+
+        k_num_gpr_registers_mips64 = k_last_gpr_mips64 - k_first_gpr_mips64 + 1
+    };
+}
+#endif // #ifndef lldb_mips_freebsd_register_enums_h

Added: lldb/trunk/source/Plugins/Process/Utility/lldb-mips-linux-register-enums.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/lldb-mips-linux-register-enums.h?rev=244308&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/lldb-mips-linux-register-enums.h (added)
+++ lldb/trunk/source/Plugins/Process/Utility/lldb-mips-linux-register-enums.h Fri Aug  7 01:39:38 2015
@@ -0,0 +1,285 @@
+//===-- lldb-mips-linux-register-enums.h -------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef lldb_mips_linux_register_enums_h
+#define lldb_mips_linux_register_enums_h
+
+namespace lldb_private
+{
+    // LLDB register codes (e.g. RegisterKind == eRegisterKindLLDB)
+
+    //---------------------------------------------------------------------------
+    // Internal codes for all mips registers.
+    //---------------------------------------------------------------------------
+    enum
+    {
+        k_first_gpr_mips,
+        gpr_zero_mips = k_first_gpr_mips,
+        gpr_r1_mips,
+        gpr_r2_mips,
+        gpr_r3_mips,
+        gpr_r4_mips,
+        gpr_r5_mips,
+        gpr_r6_mips,
+        gpr_r7_mips,
+        gpr_r8_mips,
+        gpr_r9_mips,
+        gpr_r10_mips,
+        gpr_r11_mips,
+        gpr_r12_mips,
+        gpr_r13_mips,
+        gpr_r14_mips,
+        gpr_r15_mips,
+        gpr_r16_mips,
+        gpr_r17_mips,
+        gpr_r18_mips,
+        gpr_r19_mips,
+        gpr_r20_mips,
+        gpr_r21_mips,
+        gpr_r22_mips,
+        gpr_r23_mips,
+        gpr_r24_mips,
+        gpr_r25_mips,
+        gpr_r26_mips,
+        gpr_r27_mips,
+        gpr_gp_mips,
+        gpr_sp_mips,
+        gpr_r30_mips,
+        gpr_ra_mips,
+        gpr_sr_mips,
+        gpr_mullo_mips,
+        gpr_mulhi_mips,
+        gpr_badvaddr_mips,
+        gpr_cause_mips,
+        gpr_pc_mips,
+        gpr_config5_mips,
+
+        k_last_gpr_mips = gpr_config5_mips,
+
+        k_first_fpr_mips,
+        fpr_f0_mips = k_first_fpr_mips,
+        fpr_f1_mips,
+        fpr_f2_mips,
+        fpr_f3_mips,
+        fpr_f4_mips,
+        fpr_f5_mips,
+        fpr_f6_mips,
+        fpr_f7_mips,
+        fpr_f8_mips,
+        fpr_f9_mips,
+        fpr_f10_mips,
+        fpr_f11_mips,
+        fpr_f12_mips,
+        fpr_f13_mips,
+        fpr_f14_mips,
+        fpr_f15_mips,
+        fpr_f16_mips,
+        fpr_f17_mips,
+        fpr_f18_mips,
+        fpr_f19_mips,
+        fpr_f20_mips,
+        fpr_f21_mips,
+        fpr_f22_mips,
+        fpr_f23_mips,
+        fpr_f24_mips,
+        fpr_f25_mips,
+        fpr_f26_mips,
+        fpr_f27_mips,
+        fpr_f28_mips,
+        fpr_f29_mips,
+        fpr_f30_mips,
+        fpr_f31_mips,
+        fpr_fcsr_mips,
+        fpr_fir_mips,
+        fpr_config5_mips,
+        k_last_fpr_mips = fpr_config5_mips,
+
+        k_first_msa_mips,
+        msa_w0_mips = k_first_msa_mips,
+        msa_w1_mips,
+        msa_w2_mips,
+        msa_w3_mips,
+        msa_w4_mips,
+        msa_w5_mips,
+        msa_w6_mips,
+        msa_w7_mips,
+        msa_w8_mips,
+        msa_w9_mips,
+        msa_w10_mips,
+        msa_w11_mips,
+        msa_w12_mips,
+        msa_w13_mips,
+        msa_w14_mips,
+        msa_w15_mips,
+        msa_w16_mips,
+        msa_w17_mips,
+        msa_w18_mips,
+        msa_w19_mips,
+        msa_w20_mips,
+        msa_w21_mips,
+        msa_w22_mips,
+        msa_w23_mips,
+        msa_w24_mips,
+        msa_w25_mips,
+        msa_w26_mips,
+        msa_w27_mips,
+        msa_w28_mips,
+        msa_w29_mips,
+        msa_w30_mips,
+        msa_w31_mips,
+        msa_fcsr_mips,
+        msa_fir_mips,
+        msa_mcsr_mips,
+        msa_mir_mips,
+        msa_config5_mips,
+        k_last_msa_mips = msa_config5_mips,
+
+        k_num_registers_mips,
+
+        k_num_gpr_registers_mips = k_last_gpr_mips - k_first_gpr_mips + 1,
+        k_num_fpr_registers_mips = k_last_fpr_mips - k_first_fpr_mips + 1,
+        k_num_msa_registers_mips = k_last_msa_mips - k_first_msa_mips + 1,
+        k_num_user_registers_mips = k_num_gpr_registers_mips + k_num_fpr_registers_mips + k_num_msa_registers_mips
+    };
+
+    //---------------------------------------------------------------------------
+    // Internal codes for all mips64 registers.
+    //---------------------------------------------------------------------------
+    enum
+    {
+        k_first_gpr_mips64,
+        gpr_zero_mips64 = k_first_gpr_mips64,
+        gpr_r1_mips64,
+        gpr_r2_mips64,
+        gpr_r3_mips64,
+        gpr_r4_mips64,
+        gpr_r5_mips64,
+        gpr_r6_mips64,
+        gpr_r7_mips64,
+        gpr_r8_mips64,
+        gpr_r9_mips64,
+        gpr_r10_mips64,
+        gpr_r11_mips64,
+        gpr_r12_mips64,
+        gpr_r13_mips64,
+        gpr_r14_mips64,
+        gpr_r15_mips64,
+        gpr_r16_mips64,
+        gpr_r17_mips64,
+        gpr_r18_mips64,
+        gpr_r19_mips64,
+        gpr_r20_mips64,
+        gpr_r21_mips64,
+        gpr_r22_mips64,
+        gpr_r23_mips64,
+        gpr_r24_mips64,
+        gpr_r25_mips64,
+        gpr_r26_mips64,
+        gpr_r27_mips64,
+        gpr_gp_mips64,
+        gpr_sp_mips64,
+        gpr_r30_mips64,
+        gpr_ra_mips64,
+        gpr_sr_mips64,
+        gpr_mullo_mips64,
+        gpr_mulhi_mips64,
+        gpr_badvaddr_mips64,
+        gpr_cause_mips64,
+        gpr_pc_mips64,
+        gpr_config5_mips64,
+        k_last_gpr_mips64 = gpr_config5_mips64,
+
+        k_first_fpr_mips64,
+        fpr_f0_mips64 = k_first_fpr_mips64,
+        fpr_f1_mips64,
+        fpr_f2_mips64,
+        fpr_f3_mips64,
+        fpr_f4_mips64,
+        fpr_f5_mips64,
+        fpr_f6_mips64,
+        fpr_f7_mips64,
+        fpr_f8_mips64,
+        fpr_f9_mips64,
+        fpr_f10_mips64,
+        fpr_f11_mips64,
+        fpr_f12_mips64,
+        fpr_f13_mips64,
+        fpr_f14_mips64,
+        fpr_f15_mips64,
+        fpr_f16_mips64,
+        fpr_f17_mips64,
+        fpr_f18_mips64,
+        fpr_f19_mips64,
+        fpr_f20_mips64,
+        fpr_f21_mips64,
+        fpr_f22_mips64,
+        fpr_f23_mips64,
+        fpr_f24_mips64,
+        fpr_f25_mips64,
+        fpr_f26_mips64,
+        fpr_f27_mips64,
+        fpr_f28_mips64,
+        fpr_f29_mips64,
+        fpr_f30_mips64,
+        fpr_f31_mips64,
+        fpr_fcsr_mips64,
+        fpr_fir_mips64,
+        fpr_config5_mips64,
+        k_last_fpr_mips64 = fpr_config5_mips64,
+
+        k_first_msa_mips64,
+        msa_w0_mips64 = k_first_msa_mips64,
+        msa_w1_mips64,
+        msa_w2_mips64,
+        msa_w3_mips64,
+        msa_w4_mips64,
+        msa_w5_mips64,
+        msa_w6_mips64,
+        msa_w7_mips64,
+        msa_w8_mips64,
+        msa_w9_mips64,
+        msa_w10_mips64,
+        msa_w11_mips64,
+        msa_w12_mips64,
+        msa_w13_mips64,
+        msa_w14_mips64,
+        msa_w15_mips64,
+        msa_w16_mips64,
+        msa_w17_mips64,
+        msa_w18_mips64,
+        msa_w19_mips64,
+        msa_w20_mips64,
+        msa_w21_mips64,
+        msa_w22_mips64,
+        msa_w23_mips64,
+        msa_w24_mips64,
+        msa_w25_mips64,
+        msa_w26_mips64,
+        msa_w27_mips64,
+        msa_w28_mips64,
+        msa_w29_mips64,
+        msa_w30_mips64,
+        msa_w31_mips64,
+        msa_fcsr_mips64,
+        msa_fir_mips64,
+        msa_mcsr_mips64,
+        msa_mir_mips64,
+        msa_config5_mips64,
+        k_last_msa_mips64 = msa_config5_mips64,
+
+        k_num_registers_mips64,
+
+        k_num_gpr_registers_mips64 = k_last_gpr_mips64 - k_first_gpr_mips64 + 1,
+        k_num_fpr_registers_mips64 = k_last_fpr_mips64 - k_first_fpr_mips64 + 1,
+        k_num_msa_registers_mips64 = k_last_msa_mips64 - k_first_msa_mips64 + 1,
+        k_num_user_registers_mips64 = k_num_gpr_registers_mips64 + k_num_fpr_registers_mips64 + k_num_msa_registers_mips64
+    };
+}
+
+#endif // #ifndef lldb_mips_linux_register_enums_h

Removed: lldb/trunk/source/Plugins/Process/Utility/lldb-mips64-register-enums.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/lldb-mips64-register-enums.h?rev=244307&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/lldb-mips64-register-enums.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/lldb-mips64-register-enums.h (removed)
@@ -1,199 +0,0 @@
-//===-- lldb-mips64-register-enums.h -------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef lldb_mips64_register_enums_h
-#define lldb_mips64_register_enums_h
-
-namespace lldb_private
-{
-    // LLDB register codes (e.g. RegisterKind == eRegisterKindLLDB)
-
-    //---------------------------------------------------------------------------
-    // Internal codes for all mips registers.
-    //---------------------------------------------------------------------------
-    enum
-    {
-        k_first_gpr_mips,
-        gpr_zero_mips = k_first_gpr_mips,
-        gpr_r1_mips,
-        gpr_r2_mips,
-        gpr_r3_mips,
-        gpr_r4_mips,
-        gpr_r5_mips,
-        gpr_r6_mips,
-        gpr_r7_mips,
-        gpr_r8_mips,
-        gpr_r9_mips,
-        gpr_r10_mips,
-        gpr_r11_mips,
-        gpr_r12_mips,
-        gpr_r13_mips,
-        gpr_r14_mips,
-        gpr_r15_mips,
-        gpr_r16_mips,
-        gpr_r17_mips,
-        gpr_r18_mips,
-        gpr_r19_mips,
-        gpr_r20_mips,
-        gpr_r21_mips,
-        gpr_r22_mips,
-        gpr_r23_mips,
-        gpr_r24_mips,
-        gpr_r25_mips,
-        gpr_r26_mips,
-        gpr_r27_mips,
-        gpr_gp_mips,
-        gpr_sp_mips,
-        gpr_r30_mips,
-        gpr_ra_mips,
-        gpr_mullo_mips,
-        gpr_mulhi_mips,
-        gpr_pc_mips,
-        gpr_badvaddr_mips,
-        gpr_sr_mips,
-        gpr_cause_mips,
-
-        k_last_gpr_mips = gpr_cause_mips,
-
-        k_first_fpr_mips,
-        fpr_f0_mips = k_first_fpr_mips,
-        fpr_f1_mips,
-        fpr_f2_mips,
-        fpr_f3_mips,
-        fpr_f4_mips,
-        fpr_f5_mips,
-        fpr_f6_mips,
-        fpr_f7_mips,
-        fpr_f8_mips,
-        fpr_f9_mips,
-        fpr_f10_mips,
-        fpr_f11_mips,
-        fpr_f12_mips,
-        fpr_f13_mips,
-        fpr_f14_mips,
-        fpr_f15_mips,
-        fpr_f16_mips,
-        fpr_f17_mips,
-        fpr_f18_mips,
-        fpr_f19_mips,
-        fpr_f20_mips,
-        fpr_f21_mips,
-        fpr_f22_mips,
-        fpr_f23_mips,
-        fpr_f24_mips,
-        fpr_f25_mips,
-        fpr_f26_mips,
-        fpr_f27_mips,
-        fpr_f28_mips,
-        fpr_f29_mips,
-        fpr_f30_mips,
-        fpr_f31_mips,
-        fpr_fcsr_mips,
-        fpr_fir_mips,
-        k_last_fpr_mips = fpr_fir_mips,
-
-        k_num_registers_mips,
-        k_num_gpr_registers_mips = k_last_gpr_mips - k_first_gpr_mips + 1,
-        k_num_fpr_registers_mips = k_last_fpr_mips - k_first_fpr_mips + 1,
-        k_num_user_registers_mips = k_num_gpr_registers_mips + k_num_fpr_registers_mips,
-    };
-
-    //---------------------------------------------------------------------------
-    // Internal codes for all mips64 registers.
-    //---------------------------------------------------------------------------
-    enum
-    {
-        k_first_gpr_mips64,
-        gpr_zero_mips64 = k_first_gpr_mips64,
-        gpr_r1_mips64,
-        gpr_r2_mips64,
-        gpr_r3_mips64,
-        gpr_r4_mips64,
-        gpr_r5_mips64,
-        gpr_r6_mips64,
-        gpr_r7_mips64,
-        gpr_r8_mips64,
-        gpr_r9_mips64,
-        gpr_r10_mips64,
-        gpr_r11_mips64,
-        gpr_r12_mips64,
-        gpr_r13_mips64,
-        gpr_r14_mips64,
-        gpr_r15_mips64,
-        gpr_r16_mips64,
-        gpr_r17_mips64,
-        gpr_r18_mips64,
-        gpr_r19_mips64,
-        gpr_r20_mips64,
-        gpr_r21_mips64,
-        gpr_r22_mips64,
-        gpr_r23_mips64,
-        gpr_r24_mips64,
-        gpr_r25_mips64,
-        gpr_r26_mips64,
-        gpr_r27_mips64,
-        gpr_gp_mips64,
-        gpr_sp_mips64,
-        gpr_r30_mips64,
-        gpr_ra_mips64,
-        gpr_mullo_mips64,
-        gpr_mulhi_mips64,
-        gpr_pc_mips64,
-        gpr_badvaddr_mips64,
-        gpr_sr_mips64,
-        gpr_cause_mips64,
-        gpr_ic_mips64,
-        gpr_dummy_mips64,
-
-        k_last_gpr_mips64 = gpr_dummy_mips64,
-
-        k_first_fpr_mips64,
-        fpr_f0_mips64 = k_first_fpr_mips64,
-        fpr_f1_mips64,
-        fpr_f2_mips64,
-        fpr_f3_mips64,
-        fpr_f4_mips64,
-        fpr_f5_mips64,
-        fpr_f6_mips64,
-        fpr_f7_mips64,
-        fpr_f8_mips64,
-        fpr_f9_mips64,
-        fpr_f10_mips64,
-        fpr_f11_mips64,
-        fpr_f12_mips64,
-        fpr_f13_mips64,
-        fpr_f14_mips64,
-        fpr_f15_mips64,
-        fpr_f16_mips64,
-        fpr_f17_mips64,
-        fpr_f18_mips64,
-        fpr_f19_mips64,
-        fpr_f20_mips64,
-        fpr_f21_mips64,
-        fpr_f22_mips64,
-        fpr_f23_mips64,
-        fpr_f24_mips64,
-        fpr_f25_mips64,
-        fpr_f26_mips64,
-        fpr_f27_mips64,
-        fpr_f28_mips64,
-        fpr_f29_mips64,
-        fpr_f30_mips64,
-        fpr_f31_mips64,
-        fpr_fcsr_mips64,
-        fpr_fir_mips64,
-        k_last_fpr_mips64 = fpr_fir_mips64,
-
-        k_num_registers_mips64,
-        k_num_gpr_registers_mips64 = k_last_gpr_mips64 - k_first_gpr_mips64 + 1,
-        k_num_fpr_registers_mips64 = k_last_fpr_mips64 - k_first_fpr_mips64 + 1,
-    };
-}
-
-#endif // #ifndef fpr_mips64_register_enums_h




More information about the lldb-commits mailing list