[Lldb-commits] [lldb] r128111 - in /lldb/trunk/tools/debugserver: debugserver.xcodeproj/project.pbxproj source/DNBDefs.h source/MacOSX/i386/DNBArchImplI386.cpp source/MacOSX/i386/DNBArchImplI386.h source/MacOSX/i386/MachRegisterStatesI386.h source/MacOSX/x86_64/DNBArchImplX86_64.cpp source/MacOSX/x86_64/DNBArchImplX86_64.h source/MacOSX/x86_64/MachRegisterStatesX86_64.h

Sean Callanan scallanan at apple.com
Tue Mar 22 14:45:30 PDT 2011


Author: spyffe
Date: Tue Mar 22 16:45:30 2011
New Revision: 128111

URL: http://llvm.org/viewvc/llvm-project?rev=128111&view=rev
Log:
Added AVX support to the Intel portion of debugserver.  AVX
autodetection is not yet implemented, but the structures and
register reading/writing code are there.

Added:
    lldb/trunk/tools/debugserver/source/MacOSX/i386/MachRegisterStatesI386.h
    lldb/trunk/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h
Modified:
    lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.pbxproj
    lldb/trunk/tools/debugserver/source/DNBDefs.h
    lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp
    lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h
    lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp
    lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.h

Modified: lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.pbxproj?rev=128111&r1=128110&r2=128111&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/tools/debugserver/debugserver.xcodeproj/project.pbxproj Tue Mar 22 16:45:30 2011
@@ -125,6 +125,8 @@
 		26CF99A21142EB7400011AAB /* DNBArchImplX86_64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DNBArchImplX86_64.cpp; sourceTree = "<group>"; };
 		26CF99A31142EB7400011AAB /* DNBArchImplX86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNBArchImplX86_64.h; sourceTree = "<group>"; };
 		26E6B9DA0D1329010037ECDD /* RNBDefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNBDefs.h; sourceTree = "<group>"; };
+		49F530111331519C008956F6 /* MachRegisterStatesI386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MachRegisterStatesI386.h; sourceTree = "<group>"; };
+		49F5301213316D7F008956F6 /* MachRegisterStatesX86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MachRegisterStatesX86_64.h; sourceTree = "<group>"; };
 		AF67ABFF0D34604D0022D128 /* PseudoTerminal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PseudoTerminal.cpp; sourceTree = "<group>"; };
 		AF67AC000D34604D0022D128 /* PseudoTerminal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PseudoTerminal.h; sourceTree = "<group>"; };
 		EF88788B0D9C7558001831DA /* com.apple.debugserver.applist.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = com.apple.debugserver.applist.plist; sourceTree = "<group>"; };
@@ -302,6 +304,7 @@
 			children = (
 				26C637EA0C71334A0024798E /* DNBArchImplI386.cpp */,
 				26C637EB0C71334A0024798E /* DNBArchImplI386.h */,
+				49F530111331519C008956F6 /* MachRegisterStatesI386.h */,
 			);
 			path = i386;
 			sourceTree = "<group>";
@@ -320,6 +323,7 @@
 			children = (
 				26CF99A21142EB7400011AAB /* DNBArchImplX86_64.cpp */,
 				26CF99A31142EB7400011AAB /* DNBArchImplX86_64.h */,
+				49F5301213316D7F008956F6 /* MachRegisterStatesX86_64.h */,
 			);
 			path = x86_64;
 			sourceTree = "<group>";
@@ -523,7 +527,7 @@
 					"$(SDKROOT)$(DEVELOPER_LIBRARY_DIR)/PrivateFrameworks",
 				);
 				"FRAMEWORK_SEARCH_PATHS[sdk=macosx*][arch=*]" = "$(SDKROOT)/System/Library/PrivateFrameworks";
-				GCC_PREPROCESSOR_DEFINITIONS = LLDB_DEBUGSERVER;
+				GCC_PREPROCESSOR_DEFINITIONS = LLDB_DEBUGSERVER_BUILDANDINTEGRATION;
 				HEADER_SEARCH_PATHS = /System/Library/Frameworks/System.framework/PrivateHeaders;
 				INSTALL_PATH = /Developer/usr/bin;
 				LLDB_DEBUGSERVER = 1;
@@ -565,7 +569,7 @@
 				"FRAMEWORK_SEARCH_PATHS[sdk=macosx*][arch=*]" = "$(SDKROOT)/System/Library/PrivateFrameworks";
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = LLDB_DEBUGSERVER;
+				GCC_PREPROCESSOR_DEFINITIONS = LLDB_DEBUGSERVER_DEBUG;
 				INSTALL_PATH = /Developer/usr/bin;
 				LLDB_DEBUGSERVER = 1;
 				OTHER_CFLAGS = "-Wparentheses";
@@ -605,7 +609,7 @@
 					"$(SDKROOT)$(DEVELOPER_LIBRARY_DIR)/PrivateFrameworks",
 				);
 				"FRAMEWORK_SEARCH_PATHS[sdk=macosx*][arch=*]" = "$(SDKROOT)/System/Library/PrivateFrameworks";
-				GCC_PREPROCESSOR_DEFINITIONS = LLDB_DEBUGSERVER;
+				GCC_PREPROCESSOR_DEFINITIONS = LLDB_DEBUGSERVER_RELEASE;
 				HEADER_SEARCH_PATHS = /System/Library/Frameworks/System.framework/PrivateHeaders;
 				INSTALL_PATH = /Developer/usr/bin;
 				LLDB_DEBUGSERVER = 1;

Modified: lldb/trunk/tools/debugserver/source/DNBDefs.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/DNBDefs.h?rev=128111&r1=128110&r2=128111&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/DNBDefs.h (original)
+++ lldb/trunk/tools/debugserver/source/DNBDefs.h Tue Mar 22 16:45:30 2011
@@ -281,16 +281,16 @@
         uint64_t    uint64;
         float       float32;
         double      float64;
-        int8_t      v_sint8[16];
-        int16_t     v_sint16[8];
-        int32_t     v_sint32[4];
-        int64_t     v_sint64[2];
-        uint8_t     v_uint8[16];
-        uint16_t    v_uint16[8];
-        uint32_t    v_uint32[4];
-        uint64_t    v_uint64[2];
-        float       v_float32[4];
-        double      v_float64[2];
+        int8_t      v_sint8[32];
+        int16_t     v_sint16[16];
+        int32_t     v_sint32[8];
+        int64_t     v_sint64[4];
+        uint8_t     v_uint8[32];
+        uint16_t    v_uint16[16];
+        uint32_t    v_uint32[8];
+        uint64_t    v_uint64[4];
+        float       v_float32[8];
+        double      v_float64[4];
         void        *pointer;
         char        *c_str;
     } value;

Modified: lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp?rev=128111&r1=128110&r2=128111&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp (original)
+++ lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp Tue Mar 22 16:45:30 2011
@@ -20,6 +20,49 @@
 #include "MachThread.h"
 #include "MachProcess.h"
 
+#if defined (LLDB_DEBUGSERVER_RELEASE) || defined (LLDB_DEBUGSERVER_DEBUG)
+enum debugState {
+    debugStateUnknown,
+    debugStateOff,
+    debugStateOn
+};
+
+static debugState sFPUDebugState = debugStateUnknown;
+static debugState sAVXForceState = debugStateUnknown;
+
+static bool DebugFPURegs ()
+{
+    if (sFPUDebugState == debugStateUnknown)
+    {
+        if (getenv("DNB_DEBUG_FPU_REGS"))
+            sFPUDebugState = debugStateOn;
+        else
+            sFPUDebugState = debugStateOff;
+    }
+    
+    return (sFPUDebugState == debugStateOn);
+}
+
+static bool ForceAVXRegs ()
+{
+    if (sFPUDebugState == debugStateUnknown)
+    {
+        if (getenv("DNB_DEBUG_X86_FORCE_AVX_REGS"))
+            sAVXForceState = debugStateOn;
+        else
+            sAVXForceState = debugStateOff;
+    }
+    
+    return (sAVXForceState == debugStateOn);
+}
+
+#define DEBUG_FPU_REGS (DebugFPURegs())
+#define FORCE_AVX_REGS (ForceAVXRegs())
+#else
+#define DEBUG_FPU_REGS (0)
+#define FORCE_AVX_REGS (0)
+#endif
+
 enum
 {
     gpr_eax         = 0,
@@ -68,6 +111,14 @@
     fpu_xmm5,
     fpu_xmm6,
     fpu_xmm7,
+    fpu_ymm0,
+    fpu_ymm1,
+    fpu_ymm2,
+    fpu_ymm3,
+    fpu_ymm4,
+    fpu_ymm5,
+    fpu_ymm6,
+    fpu_ymm7,
     k_num_fpu_regs,
 
     // Aliases
@@ -129,7 +180,15 @@
     dwarf_xmm4,
     dwarf_xmm5,
     dwarf_xmm6,
-    dwarf_xmm7
+    dwarf_xmm7,
+    dwarf_ymm0 = dwarf_xmm0,
+    dwarf_ymm1 = dwarf_xmm1,
+    dwarf_ymm2 = dwarf_xmm2,
+    dwarf_ymm3 = dwarf_xmm3,
+    dwarf_ymm4 = dwarf_xmm4,
+    dwarf_ymm5 = dwarf_xmm5,
+    dwarf_ymm6 = dwarf_xmm6,
+    dwarf_ymm7 = dwarf_xmm7,
 };
 
 enum
@@ -182,9 +241,19 @@
     gdb_mm4        = 45,
     gdb_mm5        = 46,
     gdb_mm6        = 47,
-    gdb_mm7        = 48
+    gdb_mm7        = 48,
+    gdb_ymm0       = gdb_xmm0,
+    gdb_ymm1       = gdb_xmm1,
+    gdb_ymm2       = gdb_xmm2,
+    gdb_ymm3       = gdb_xmm3,
+    gdb_ymm4       = gdb_xmm4,
+    gdb_ymm5       = gdb_xmm5,
+    gdb_ymm6       = gdb_xmm6,
+    gdb_ymm7       = gdb_xmm7
 };
 
+enum DNBArchImplI386::AVXPresence DNBArchImplI386::s_has_avx = DNBArchImplI386::kAVXUnknown;
+
 uint64_t
 DNBArchImplI386::GetPC(uint64_t failValue)
 {
@@ -245,7 +314,7 @@
         m_state.SetError(e_regSetGPR, Read, 0);
 #else
         mach_msg_type_number_t count = e_regSetWordSizeGPR;
-        m_state.SetError(e_regSetGPR, Read, ::thread_get_state(m_thread->ThreadID(), x86_THREAD_STATE32, (thread_state_t)&m_state.context.gpr, &count));
+        m_state.SetError(e_regSetGPR, Read, ::thread_get_state(m_thread->ThreadID(), __i386_THREAD_STATE, (thread_state_t)&m_state.context.gpr, &count));
 #endif
     }
     return m_state.GetError(e_regSetGPR, Read);
@@ -259,65 +328,149 @@
 {
     if (force || m_state.GetError(e_regSetFPU, Read))
     {
-#if DEBUG_FPU_VALUES
-    m_state.context.fpu.__fpu_reserved[0] = -1;
-    m_state.context.fpu.__fpu_reserved[1] = -1;
-    *(uint16_t *)&(m_state.context.fpu.__fpu_fcw) = 0x1234;
-    *(uint16_t *)&(m_state.context.fpu.__fpu_fsw) = 0x5678;
-    m_state.context.fpu.__fpu_ftw = 1;
-    m_state.context.fpu.__fpu_rsrv1 = UINT8_MAX;
-    m_state.context.fpu.__fpu_fop = 2;
-    m_state.context.fpu.__fpu_ip = 3;
-    m_state.context.fpu.__fpu_cs = 4;
-    m_state.context.fpu.__fpu_rsrv2 = 5;
-    m_state.context.fpu.__fpu_dp = 6;
-    m_state.context.fpu.__fpu_ds = 7;
-    m_state.context.fpu.__fpu_rsrv3 = UINT16_MAX;
-    m_state.context.fpu.__fpu_mxcsr = 8;
-    m_state.context.fpu.__fpu_mxcsrmask = 9;
-    int i;
-    for (i=0; i<16; ++i)
-    {
-        if (i<10)
+        if (DEBUG_FPU_REGS)
         {
-            m_state.context.fpu.__fpu_stmm0.__mmst_reg[i] = 'a';
-            m_state.context.fpu.__fpu_stmm1.__mmst_reg[i] = 'b';
-            m_state.context.fpu.__fpu_stmm2.__mmst_reg[i] = 'c';
-            m_state.context.fpu.__fpu_stmm3.__mmst_reg[i] = 'd';
-            m_state.context.fpu.__fpu_stmm4.__mmst_reg[i] = 'e';
-            m_state.context.fpu.__fpu_stmm5.__mmst_reg[i] = 'f';
-            m_state.context.fpu.__fpu_stmm6.__mmst_reg[i] = 'g';
-            m_state.context.fpu.__fpu_stmm7.__mmst_reg[i] = 'h';
+            if (HasAVX() || FORCE_AVX_REGS)
+            {
+                m_state.context.fpu.avx.__fpu_reserved[0] = -1;
+                m_state.context.fpu.avx.__fpu_reserved[1] = -1;
+                *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fcw) = 0x1234;
+                *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fsw) = 0x5678;
+                m_state.context.fpu.avx.__fpu_ftw = 1;
+                m_state.context.fpu.avx.__fpu_rsrv1 = UINT8_MAX;
+                m_state.context.fpu.avx.__fpu_fop = 2;
+                m_state.context.fpu.avx.__fpu_ip = 3;
+                m_state.context.fpu.avx.__fpu_cs = 4;
+                m_state.context.fpu.avx.__fpu_rsrv2 = 5;
+                m_state.context.fpu.avx.__fpu_dp = 6;
+                m_state.context.fpu.avx.__fpu_ds = 7;
+                m_state.context.fpu.avx.__fpu_rsrv3 = UINT16_MAX;
+                m_state.context.fpu.avx.__fpu_mxcsr = 8;
+                m_state.context.fpu.avx.__fpu_mxcsrmask = 9;
+                int i;
+                for (i=0; i<16; ++i)
+                {
+                    if (i<10)
+                    {
+                        m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = 'a';
+                        m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = 'b';
+                        m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = 'c';
+                        m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = 'd';
+                        m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = 'e';
+                        m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = 'f';
+                        m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = 'g';
+                        m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = 'h';
+                    }
+                    else
+                    {
+                        m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN;
+                    }
+                    
+                    m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg[i] = '0';
+                    m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg[i] = '1';
+                    m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg[i] = '2';
+                    m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg[i] = '3';
+                    m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg[i] = '4';
+                    m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg[i] = '5';
+                    m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg[i] = '6';
+                    m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg[i] = '7';
+                }
+                for (i=0; i<sizeof(m_state.context.fpu.avx.__fpu_rsrv4); ++i)
+                    m_state.context.fpu.avx.__fpu_rsrv4[i] = INT8_MIN;
+                m_state.context.fpu.avx.__fpu_reserved1 = -1;
+                for (i=0; i<sizeof(m_state.context.fpu.avx.__avx_reserved1); ++i)
+                    m_state.context.fpu.avx.__avx_reserved1[i] = INT8_MIN;
+                
+                for (i = 0; i < 16; ++i)
+                {
+                    m_state.context.fpu.avx.__fpu_ymmh0.__xmm_reg[i] = '0';
+                    m_state.context.fpu.avx.__fpu_ymmh1.__xmm_reg[i] = '1';
+                    m_state.context.fpu.avx.__fpu_ymmh2.__xmm_reg[i] = '2';
+                    m_state.context.fpu.avx.__fpu_ymmh3.__xmm_reg[i] = '3';
+                    m_state.context.fpu.avx.__fpu_ymmh4.__xmm_reg[i] = '4';
+                    m_state.context.fpu.avx.__fpu_ymmh5.__xmm_reg[i] = '5';
+                    m_state.context.fpu.avx.__fpu_ymmh6.__xmm_reg[i] = '6';
+                    m_state.context.fpu.avx.__fpu_ymmh7.__xmm_reg[i] = '7';
+                }
+            }
+            else
+            {
+                m_state.context.fpu.no_avx.__fpu_reserved[0] = -1;
+                m_state.context.fpu.no_avx.__fpu_reserved[1] = -1;
+                *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fcw) = 0x1234;
+                *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fsw) = 0x5678;
+                m_state.context.fpu.no_avx.__fpu_ftw = 1;
+                m_state.context.fpu.no_avx.__fpu_rsrv1 = UINT8_MAX;
+                m_state.context.fpu.no_avx.__fpu_fop = 2;
+                m_state.context.fpu.no_avx.__fpu_ip = 3;
+                m_state.context.fpu.no_avx.__fpu_cs = 4;
+                m_state.context.fpu.no_avx.__fpu_rsrv2 = 5;
+                m_state.context.fpu.no_avx.__fpu_dp = 6;
+                m_state.context.fpu.no_avx.__fpu_ds = 7;
+                m_state.context.fpu.no_avx.__fpu_rsrv3 = UINT16_MAX;
+                m_state.context.fpu.no_avx.__fpu_mxcsr = 8;
+                m_state.context.fpu.no_avx.__fpu_mxcsrmask = 9;
+                int i;
+                for (i=0; i<16; ++i)
+                {
+                    if (i<10)
+                    {
+                        m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = 'a';
+                        m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = 'b';
+                        m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = 'c';
+                        m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = 'd';
+                        m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = 'e';
+                        m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = 'f';
+                        m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = 'g';
+                        m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = 'h';
+                    }
+                    else
+                    {
+                        m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN;
+                    }
+
+                    m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg[i] = '0';
+                    m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg[i] = '1';
+                    m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg[i] = '2';
+                    m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg[i] = '3';
+                    m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg[i] = '4';
+                    m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg[i] = '5';
+                    m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg[i] = '6';
+                    m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg[i] = '7';
+                }
+                for (i=0; i<sizeof(m_state.context.fpu.avx.__fpu_rsrv4); ++i)
+                    m_state.context.fpu.no_avx.__fpu_rsrv4[i] = INT8_MIN;
+                m_state.context.fpu.no_avx.__fpu_reserved1 = -1;
+            }
+            m_state.SetError(e_regSetFPU, Read, 0);
         }
         else
         {
-            m_state.context.fpu.__fpu_stmm0.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm1.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm2.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm3.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm4.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm5.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm6.__mmst_reg[i] = INT8_MIN;
-            m_state.context.fpu.__fpu_stmm7.__mmst_reg[i] = INT8_MIN;
+            if (HasAVX() || FORCE_AVX_REGS)
+            {
+                mach_msg_type_number_t count = e_regSetWordSizeAVX;
+                m_state.SetError(e_regSetFPU, Read, ::thread_get_state(m_thread->ThreadID(), __i386_AVX_STATE, (thread_state_t)&m_state.context.fpu.avx, &count));
+            }
+            else
+            {    
+                mach_msg_type_number_t count = e_regSetWordSizeFPR;
+                m_state.SetError(e_regSetFPU, Read, ::thread_get_state(m_thread->ThreadID(), __i386_FLOAT_STATE, (thread_state_t)&m_state.context.fpu.no_avx, &count));
+            }
         }
-
-        m_state.context.fpu.__fpu_xmm0.__xmm_reg[i] = '0';
-        m_state.context.fpu.__fpu_xmm1.__xmm_reg[i] = '1';
-        m_state.context.fpu.__fpu_xmm2.__xmm_reg[i] = '2';
-        m_state.context.fpu.__fpu_xmm3.__xmm_reg[i] = '3';
-        m_state.context.fpu.__fpu_xmm4.__xmm_reg[i] = '4';
-        m_state.context.fpu.__fpu_xmm5.__xmm_reg[i] = '5';
-        m_state.context.fpu.__fpu_xmm6.__xmm_reg[i] = '6';
-        m_state.context.fpu.__fpu_xmm7.__xmm_reg[i] = '7';
-    }
-    for (i=0; i<sizeof(m_state.context.fpu.__fpu_rsrv4); ++i)
-        m_state.context.fpu.__fpu_rsrv4[i] = INT8_MIN;
-    m_state.context.fpu.__fpu_reserved1 = -1;
-    m_state.SetError(e_regSetFPU, Read, 0);
-#else
-        mach_msg_type_number_t count = e_regSetWordSizeFPR;
-        m_state.SetError(e_regSetFPU, Read, ::thread_get_state(m_thread->ThreadID(), x86_FLOAT_STATE32, (thread_state_t)&m_state.context.fpu, &count));
-#endif
     }
     return m_state.GetError(e_regSetFPU, Read);
 }
@@ -328,7 +481,7 @@
     if (force || m_state.GetError(e_regSetEXC, Read))
     {
         mach_msg_type_number_t count = e_regSetWordSizeEXC;
-        m_state.SetError(e_regSetEXC, Read, ::thread_get_state(m_thread->ThreadID(), x86_EXCEPTION_STATE32, (thread_state_t)&m_state.context.exc, &count));
+        m_state.SetError(e_regSetEXC, Read, ::thread_get_state(m_thread->ThreadID(), __i386_EXCEPTION_STATE, (thread_state_t)&m_state.context.exc, &count));
     }
     return m_state.GetError(e_regSetEXC, Read);
 }
@@ -336,21 +489,32 @@
 kern_return_t
 DNBArchImplI386::SetGPRState()
 {
-    m_state.SetError(e_regSetGPR, Write, ::thread_set_state(m_thread->ThreadID(), x86_THREAD_STATE32, (thread_state_t)&m_state.context.gpr, e_regSetWordSizeGPR));
+    m_state.SetError(e_regSetGPR, Write, ::thread_set_state(m_thread->ThreadID(), __i386_THREAD_STATE, (thread_state_t)&m_state.context.gpr, e_regSetWordSizeGPR));
     return m_state.GetError(e_regSetGPR, Write);
 }
 
 kern_return_t
 DNBArchImplI386::SetFPUState()
 {
-    m_state.SetError(e_regSetFPU, Write, ::thread_set_state(m_thread->ThreadID(), x86_FLOAT_STATE32, (thread_state_t)&m_state.context.fpu, e_regSetWordSizeFPR));
-    return m_state.GetError(e_regSetFPU, Write);
+    if (DEBUG_FPU_REGS)
+    {
+        m_state.SetError(e_regSetFPU, Write, 0);
+        return m_state.GetError(e_regSetFPU, Write);   
+    }
+    else
+    {
+        if (HasAVX() || FORCE_AVX_REGS)
+            m_state.SetError(e_regSetFPU, Write, ::thread_set_state(m_thread->ThreadID(), __i386_AVX_STATE, (thread_state_t)&m_state.context.fpu.avx, e_regSetWordSizeAVX));
+        else
+            m_state.SetError(e_regSetFPU, Write, ::thread_set_state(m_thread->ThreadID(), __i386_FLOAT_STATE, (thread_state_t)&m_state.context.fpu.no_avx, e_regSetWordSizeFPR));
+        return m_state.GetError(e_regSetFPU, Write);
+    }
 }
 
 kern_return_t
 DNBArchImplI386::SetEXCState()
 {
-    m_state.SetError(e_regSetEXC, Write, ::thread_set_state(m_thread->ThreadID(), x86_EXCEPTION_STATE32, (thread_state_t)&m_state.context.exc, e_regSetWordSizeEXC));
+    m_state.SetError(e_regSetEXC, Write, ::thread_set_state(m_thread->ThreadID(), __i386_EXCEPTION_STATE, (thread_state_t)&m_state.context.exc, e_regSetWordSizeEXC));
     return m_state.GetError(e_regSetEXC, Write);
 }
 
@@ -467,15 +631,24 @@
 
 
 #define GPR_OFFSET(reg) (offsetof (DNBArchImplI386::GPR, __##reg))
-#define FPU_OFFSET(reg) (offsetof (DNBArchImplI386::FPU, __fpu_##reg) + offsetof (DNBArchImplI386::Context, fpu))
+#define FPU_OFFSET(reg) (offsetof (DNBArchImplI386::FPU, __fpu_##reg) + offsetof (DNBArchImplI386::Context, fpu.no_avx))
+#define AVX_OFFSET(reg) (offsetof (DNBArchImplI386::AVX, __fpu_##reg) + offsetof (DNBArchImplI386::Context, fpu.avx))
 #define EXC_OFFSET(reg) (offsetof (DNBArchImplI386::EXC, __##reg)     + offsetof (DNBArchImplI386::Context, exc))
 
 #define GPR_SIZE(reg)       (sizeof(((DNBArchImplI386::GPR *)NULL)->__##reg))
 #define FPU_SIZE_UINT(reg)  (sizeof(((DNBArchImplI386::FPU *)NULL)->__fpu_##reg))
 #define FPU_SIZE_MMST(reg)  (sizeof(((DNBArchImplI386::FPU *)NULL)->__fpu_##reg.__mmst_reg))
 #define FPU_SIZE_XMM(reg)   (sizeof(((DNBArchImplI386::FPU *)NULL)->__fpu_##reg.__xmm_reg))
+#define FPU_SIZE_YMM(reg)   (32)
 #define EXC_SIZE(reg)       (sizeof(((DNBArchImplI386::EXC *)NULL)->__##reg))
 
+// This does not accurately identify the location of ymm0...7 in 
+// Context.fpu.avx.  That is because there is a bunch of padding
+// in Context.fpu.avx that we don't need.  Offset macros lay out
+// the register state that Debugserver transmits to the debugger
+// -- not to interpret the thread_get_state info.
+#define AVX_OFFSET_YMM(n)   (AVX_OFFSET(xmm7) + FPU_SIZE_XMM(xmm7) + (32 * n))
+
 // These macros will auto define the register name, alt name, register size,
 // register offset, encoding, format and native register. This ensures that
 // the register state structures are defined correctly and have the correct
@@ -505,7 +678,7 @@
 
 
 const DNBRegisterInfo
-DNBArchImplI386::g_fpu_registers[] =
+DNBArchImplI386::g_fpu_registers_no_avx[] =
 {
 { e_regSetFPU, fpu_fcw      , "fctrl"       , NULL, Uint, Hex, FPU_SIZE_UINT(fcw)       , FPU_OFFSET(fcw)       , -1, -1, -1, -1 },
 { e_regSetFPU, fpu_fsw      , "fstat"       , NULL, Uint, Hex, FPU_SIZE_UINT(fsw)       , FPU_OFFSET(fsw)       , -1, -1, -1, -1 },
@@ -537,7 +710,47 @@
 { e_regSetFPU, fpu_xmm7, "xmm7", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm7), FPU_OFFSET(xmm7), -1, dwarf_xmm7, -1, gdb_xmm7 }
 };
 
-
+const DNBRegisterInfo
+DNBArchImplI386::g_fpu_registers_avx[] =
+{
+{ e_regSetFPU, fpu_fcw      , "fctrl"       , NULL, Uint, Hex, FPU_SIZE_UINT(fcw)       , AVX_OFFSET(fcw)       , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_fsw      , "fstat"       , NULL, Uint, Hex, FPU_SIZE_UINT(fsw)       , AVX_OFFSET(fsw)       , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_ftw      , "ftag"        , NULL, Uint, Hex, FPU_SIZE_UINT(ftw)       , AVX_OFFSET(ftw)       , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_fop      , "fop"         , NULL, Uint, Hex, FPU_SIZE_UINT(fop)       , AVX_OFFSET(fop)       , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_ip       , "fioff"       , NULL, Uint, Hex, FPU_SIZE_UINT(ip)        , AVX_OFFSET(ip)        , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_cs       , "fiseg"       , NULL, Uint, Hex, FPU_SIZE_UINT(cs)        , AVX_OFFSET(cs)        , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_dp       , "fooff"       , NULL, Uint, Hex, FPU_SIZE_UINT(dp)        , AVX_OFFSET(dp)        , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_ds       , "foseg"       , NULL, Uint, Hex, FPU_SIZE_UINT(ds)        , AVX_OFFSET(ds)        , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_mxcsr    , "mxcsr"       , NULL, Uint, Hex, FPU_SIZE_UINT(mxcsr)     , AVX_OFFSET(mxcsr)     , -1, -1, -1, -1 },
+{ e_regSetFPU, fpu_mxcsrmask, "mxcsrmask"   , NULL, Uint, Hex, FPU_SIZE_UINT(mxcsrmask) , AVX_OFFSET(mxcsrmask) , -1, -1, -1, -1 },
+
+{ e_regSetFPU, fpu_stmm0, "stmm0", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm0), AVX_OFFSET(stmm0), -1, dwarf_stmm0, -1, gdb_stmm0 },
+{ e_regSetFPU, fpu_stmm1, "stmm1", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm1), AVX_OFFSET(stmm1), -1, dwarf_stmm1, -1, gdb_stmm1 },
+{ e_regSetFPU, fpu_stmm2, "stmm2", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm2), AVX_OFFSET(stmm2), -1, dwarf_stmm2, -1, gdb_stmm2 },
+{ e_regSetFPU, fpu_stmm3, "stmm3", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm3), AVX_OFFSET(stmm3), -1, dwarf_stmm3, -1, gdb_stmm3 },
+{ e_regSetFPU, fpu_stmm4, "stmm4", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm4), AVX_OFFSET(stmm4), -1, dwarf_stmm4, -1, gdb_stmm4 },
+{ e_regSetFPU, fpu_stmm5, "stmm5", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm5), AVX_OFFSET(stmm5), -1, dwarf_stmm5, -1, gdb_stmm5 },
+{ e_regSetFPU, fpu_stmm6, "stmm6", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm6), AVX_OFFSET(stmm6), -1, dwarf_stmm6, -1, gdb_stmm6 },
+{ e_regSetFPU, fpu_stmm7, "stmm7", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm7), AVX_OFFSET(stmm7), -1, dwarf_stmm7, -1, gdb_stmm7 },
+
+{ e_regSetFPU, fpu_xmm0, "xmm0", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm0), AVX_OFFSET(xmm0), -1, dwarf_xmm0, -1, gdb_xmm0 },
+{ e_regSetFPU, fpu_xmm1, "xmm1", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm1), AVX_OFFSET(xmm1), -1, dwarf_xmm1, -1, gdb_xmm1 },
+{ e_regSetFPU, fpu_xmm2, "xmm2", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm2), AVX_OFFSET(xmm2), -1, dwarf_xmm2, -1, gdb_xmm2 },
+{ e_regSetFPU, fpu_xmm3, "xmm3", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm3), AVX_OFFSET(xmm3), -1, dwarf_xmm3, -1, gdb_xmm3 },
+{ e_regSetFPU, fpu_xmm4, "xmm4", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm4), AVX_OFFSET(xmm4), -1, dwarf_xmm4, -1, gdb_xmm4 },
+{ e_regSetFPU, fpu_xmm5, "xmm5", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm5), AVX_OFFSET(xmm5), -1, dwarf_xmm5, -1, gdb_xmm5 },
+{ e_regSetFPU, fpu_xmm6, "xmm6", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm6), AVX_OFFSET(xmm6), -1, dwarf_xmm6, -1, gdb_xmm6 },
+{ e_regSetFPU, fpu_xmm7, "xmm7", NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm7), AVX_OFFSET(xmm7), -1, dwarf_xmm7, -1, gdb_xmm7 },
+
+{ e_regSetFPU, fpu_ymm0, "ymm0", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm0), AVX_OFFSET_YMM(0), -1, dwarf_ymm0, -1, gdb_ymm0 },
+{ e_regSetFPU, fpu_ymm1, "ymm1", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm1), AVX_OFFSET_YMM(1), -1, dwarf_ymm1, -1, gdb_ymm1 },
+{ e_regSetFPU, fpu_ymm2, "ymm2", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm2), AVX_OFFSET_YMM(2), -1, dwarf_ymm2, -1, gdb_ymm2 },
+{ e_regSetFPU, fpu_ymm3, "ymm3", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm3), AVX_OFFSET_YMM(3), -1, dwarf_ymm3, -1, gdb_ymm3 },
+{ e_regSetFPU, fpu_ymm4, "ymm4", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm4), AVX_OFFSET_YMM(4), -1, dwarf_ymm4, -1, gdb_ymm4 },
+{ e_regSetFPU, fpu_ymm5, "ymm5", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm5), AVX_OFFSET_YMM(5), -1, dwarf_ymm5, -1, gdb_ymm5 },
+{ e_regSetFPU, fpu_ymm6, "ymm6", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm6), AVX_OFFSET_YMM(6), -1, dwarf_ymm6, -1, gdb_ymm6 },
+{ e_regSetFPU, fpu_ymm7, "ymm7", NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm7), AVX_OFFSET_YMM(7), -1, dwarf_ymm7, -1, gdb_ymm7 },
+};
 
 const DNBRegisterInfo
 DNBArchImplI386::g_exc_registers[] =
@@ -549,9 +762,11 @@
 
 // Number of registers in each register set
 const size_t DNBArchImplI386::k_num_gpr_registers = sizeof(g_gpr_registers)/sizeof(DNBRegisterInfo);
-const size_t DNBArchImplI386::k_num_fpu_registers = sizeof(g_fpu_registers)/sizeof(DNBRegisterInfo);
+const size_t DNBArchImplI386::k_num_fpu_registers_no_avx = sizeof(g_fpu_registers_no_avx)/sizeof(DNBRegisterInfo);
+const size_t DNBArchImplI386::k_num_fpu_registers_avx = sizeof(g_fpu_registers_avx)/sizeof(DNBRegisterInfo);
 const size_t DNBArchImplI386::k_num_exc_registers = sizeof(g_exc_registers)/sizeof(DNBRegisterInfo);
-const size_t DNBArchImplI386::k_num_all_registers = k_num_gpr_registers + k_num_fpu_registers + k_num_exc_registers;
+const size_t DNBArchImplI386::k_num_all_registers_no_avx = k_num_gpr_registers + k_num_fpu_registers_no_avx + k_num_exc_registers;
+const size_t DNBArchImplI386::k_num_all_registers_avx = k_num_gpr_registers + k_num_fpu_registers_avx + k_num_exc_registers;
 
 //----------------------------------------------------------------------
 // Register set definitions. The first definitions at register set index
@@ -559,16 +774,25 @@
 // register information for the all register set need not be filled in.
 //----------------------------------------------------------------------
 const DNBRegisterSetInfo
-DNBArchImplI386::g_reg_sets[] =
+DNBArchImplI386::g_reg_sets_no_avx[] =
 {
-    { "i386 Registers",             NULL,               k_num_all_registers },
-    { "General Purpose Registers",  g_gpr_registers,    k_num_gpr_registers },
-    { "Floating Point Registers",   g_fpu_registers,    k_num_fpu_registers },
-    { "Exception State Registers",  g_exc_registers,    k_num_exc_registers }
+    { "i386 Registers",             NULL,                   k_num_all_registers_no_avx },
+    { "General Purpose Registers",  g_gpr_registers,        k_num_gpr_registers        },
+    { "Floating Point Registers",   g_fpu_registers_no_avx, k_num_fpu_registers_no_avx },
+    { "Exception State Registers",  g_exc_registers,        k_num_exc_registers        }
 };
-// Total number of register sets for this architecture
-const size_t DNBArchImplI386::k_num_register_sets = sizeof(g_reg_sets)/sizeof(DNBRegisterSetInfo);
 
+const DNBRegisterSetInfo
+DNBArchImplI386::g_reg_sets_avx[] =
+{
+    { "i386 Registers",             NULL,                   k_num_all_registers_avx },
+    { "General Purpose Registers",  g_gpr_registers,        k_num_gpr_registers     },
+    { "Floating Point Registers",   g_fpu_registers_avx,    k_num_fpu_registers_avx },
+    { "Exception State Registers",  g_exc_registers,        k_num_exc_registers     }
+};
+
+// Total number of register sets for this architecture
+const size_t DNBArchImplI386::k_num_register_sets = sizeof(g_reg_sets_no_avx)/sizeof(DNBRegisterSetInfo);
 
 DNBArchProtocol *
 DNBArchImplI386::Create (MachThread *thread)
@@ -589,7 +813,10 @@
 DNBArchImplI386::GetRegisterSetInfo(nub_size_t *num_reg_sets)
 {
     *num_reg_sets = k_num_register_sets;
-    return g_reg_sets;
+    if (HasAVX() || FORCE_AVX_REGS)
+        return g_reg_sets_avx;
+    else
+        return g_reg_sets_no_avx;
 }
 
 
@@ -659,36 +886,86 @@
             break;
 
         case e_regSetFPU:
-            switch (reg)
+            if (HasAVX() || FORCE_AVX_REGS)
             {
-            case fpu_fcw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.__fpu_fcw));    return true;
-            case fpu_fsw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.__fpu_fsw));    return true;
-            case fpu_ftw:       value->value.uint8  = m_state.context.fpu.__fpu_ftw;                      return true;
-            case fpu_fop:       value->value.uint16 = m_state.context.fpu.__fpu_fop;                      return true;
-            case fpu_ip:        value->value.uint32 = m_state.context.fpu.__fpu_ip;                       return true;
-            case fpu_cs:        value->value.uint16 = m_state.context.fpu.__fpu_cs;                       return true;
-            case fpu_dp:        value->value.uint32 = m_state.context.fpu.__fpu_dp;                       return true;
-            case fpu_ds:        value->value.uint16 = m_state.context.fpu.__fpu_ds;                       return true;
-            case fpu_mxcsr:     value->value.uint32 = m_state.context.fpu.__fpu_mxcsr;                    return true;
-            case fpu_mxcsrmask: value->value.uint32 = m_state.context.fpu.__fpu_mxcsrmask;                return true;
-
-            case fpu_stmm0:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm0.__mmst_reg, 10);    return true;
-            case fpu_stmm1:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm1.__mmst_reg, 10);    return true;
-            case fpu_stmm2:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm2.__mmst_reg, 10);    return true;
-            case fpu_stmm3:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm3.__mmst_reg, 10);    return true;
-            case fpu_stmm4:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm4.__mmst_reg, 10);    return true;
-            case fpu_stmm5:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm5.__mmst_reg, 10);    return true;
-            case fpu_stmm6:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm6.__mmst_reg, 10);    return true;
-            case fpu_stmm7:     memcpy(&value->value.uint8, m_state.context.fpu.__fpu_stmm7.__mmst_reg, 10);    return true;
-
-            case fpu_xmm0:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm0.__xmm_reg, 16);    return true;
-            case fpu_xmm1:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm1.__xmm_reg, 16);    return true;
-            case fpu_xmm2:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm2.__xmm_reg, 16);    return true;
-            case fpu_xmm3:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm3.__xmm_reg, 16);    return true;
-            case fpu_xmm4:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm4.__xmm_reg, 16);    return true;
-            case fpu_xmm5:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm5.__xmm_reg, 16);    return true;
-            case fpu_xmm6:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm6.__xmm_reg, 16);    return true;
-            case fpu_xmm7:      memcpy(&value->value.uint8, m_state.context.fpu.__fpu_xmm7.__xmm_reg, 16);    return true;
+                switch (reg)
+                {
+                case fpu_fcw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw));    return true;
+                case fpu_fsw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw));    return true;
+                case fpu_ftw:       value->value.uint8  = m_state.context.fpu.avx.__fpu_ftw;                      return true;
+                case fpu_fop:       value->value.uint16 = m_state.context.fpu.avx.__fpu_fop;                      return true;
+                case fpu_ip:        value->value.uint32 = m_state.context.fpu.avx.__fpu_ip;                       return true;
+                case fpu_cs:        value->value.uint16 = m_state.context.fpu.avx.__fpu_cs;                       return true;
+                case fpu_dp:        value->value.uint32 = m_state.context.fpu.avx.__fpu_dp;                       return true;
+                case fpu_ds:        value->value.uint16 = m_state.context.fpu.avx.__fpu_ds;                       return true;
+                case fpu_mxcsr:     value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsr;                    return true;
+                case fpu_mxcsrmask: value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsrmask;                return true;
+                    
+                case fpu_stmm0:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg, 10);    return true;
+                case fpu_stmm1:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg, 10);    return true;
+                case fpu_stmm2:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg, 10);    return true;
+                case fpu_stmm3:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg, 10);    return true;
+                case fpu_stmm4:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg, 10);    return true;
+                case fpu_stmm5:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg, 10);    return true;
+                case fpu_stmm6:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg, 10);    return true;
+                case fpu_stmm7:     memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg, 10);    return true;
+                    
+                case fpu_xmm0:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg, 16);    return true;
+                case fpu_xmm1:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg, 16);    return true;
+                case fpu_xmm2:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg, 16);    return true;
+                case fpu_xmm3:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg, 16);    return true;
+                case fpu_xmm4:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg, 16);    return true;
+                case fpu_xmm5:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg, 16);    return true;
+                case fpu_xmm6:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg, 16);    return true;
+                case fpu_xmm7:      memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg, 16);    return true;
+                
+#define MEMCPY_YMM(n)                                                                           \
+    memcpy(&value->value.uint8, m_state.context.fpu.avx.__fpu_xmm##n.__xmm_reg, 16);            \
+    memcpy((&value->value.uint8) + 16, m_state.context.fpu.avx.__fpu_ymmh##n.__xmm_reg, 16);
+                case fpu_ymm0:      MEMCPY_YMM(0);  return true;
+                case fpu_ymm1:      MEMCPY_YMM(1);  return true;
+                case fpu_ymm2:      MEMCPY_YMM(2);  return true;
+                case fpu_ymm3:      MEMCPY_YMM(3);  return true;
+                case fpu_ymm4:      MEMCPY_YMM(4);  return true;
+                case fpu_ymm5:      MEMCPY_YMM(5);  return true;
+                case fpu_ymm6:      MEMCPY_YMM(6);  return true;
+                case fpu_ymm7:      MEMCPY_YMM(7);  return true;
+#undef MEMCPY_YMM
+                }
+            }
+            else
+            {
+                switch (reg)
+                {
+                case fpu_fcw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw));    return true;
+                case fpu_fsw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw));    return true;
+                case fpu_ftw:       value->value.uint8  = m_state.context.fpu.no_avx.__fpu_ftw;                      return true;
+                case fpu_fop:       value->value.uint16 = m_state.context.fpu.no_avx.__fpu_fop;                      return true;
+                case fpu_ip:        value->value.uint32 = m_state.context.fpu.no_avx.__fpu_ip;                       return true;
+                case fpu_cs:        value->value.uint16 = m_state.context.fpu.no_avx.__fpu_cs;                       return true;
+                case fpu_dp:        value->value.uint32 = m_state.context.fpu.no_avx.__fpu_dp;                       return true;
+                case fpu_ds:        value->value.uint16 = m_state.context.fpu.no_avx.__fpu_ds;                       return true;
+                case fpu_mxcsr:     value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsr;                    return true;
+                case fpu_mxcsrmask: value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsrmask;                return true;
+
+                case fpu_stmm0:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg, 10);    return true;
+                case fpu_stmm1:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg, 10);    return true;
+                case fpu_stmm2:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg, 10);    return true;
+                case fpu_stmm3:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg, 10);    return true;
+                case fpu_stmm4:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg, 10);    return true;
+                case fpu_stmm5:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg, 10);    return true;
+                case fpu_stmm6:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg, 10);    return true;
+                case fpu_stmm7:     memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg, 10);    return true;
+
+                case fpu_xmm0:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg, 16);    return true;
+                case fpu_xmm1:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg, 16);    return true;
+                case fpu_xmm2:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg, 16);    return true;
+                case fpu_xmm3:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg, 16);    return true;
+                case fpu_xmm4:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg, 16);    return true;
+                case fpu_xmm5:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg, 16);    return true;
+                case fpu_xmm6:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg, 16);    return true;
+                case fpu_xmm7:      memcpy(&value->value.uint8, m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg, 16);    return true;
+                }
             }
             break;
 
@@ -756,36 +1033,86 @@
             break;
 
         case e_regSetFPU:
-            switch (reg)
+            if (HasAVX() || FORCE_AVX_REGS)
             {
-            case fpu_fcw:           *((uint16_t *)(&m_state.context.fpu.__fpu_fcw)) = value->value.uint16;    success = true; break;
-            case fpu_fsw:           *((uint16_t *)(&m_state.context.fpu.__fpu_fsw)) = value->value.uint16;    success = true; break;
-            case fpu_ftw:           m_state.context.fpu.__fpu_ftw = value->value.uint8;                       success = true; break;
-            case fpu_fop:           m_state.context.fpu.__fpu_fop = value->value.uint16;                      success = true; break;
-            case fpu_ip:            m_state.context.fpu.__fpu_ip = value->value.uint32;                       success = true; break;
-            case fpu_cs:            m_state.context.fpu.__fpu_cs = value->value.uint16;                       success = true; break;
-            case fpu_dp:            m_state.context.fpu.__fpu_dp = value->value.uint32;                       success = true; break;
-            case fpu_ds:            m_state.context.fpu.__fpu_ds = value->value.uint16;                       success = true; break;
-            case fpu_mxcsr:         m_state.context.fpu.__fpu_mxcsr = value->value.uint32;                    success = true; break;
-            case fpu_mxcsrmask:     m_state.context.fpu.__fpu_mxcsrmask = value->value.uint32;                success = true; break;
-
-            case fpu_stmm0:     memcpy (m_state.context.fpu.__fpu_stmm0.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm1:     memcpy (m_state.context.fpu.__fpu_stmm1.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm2:     memcpy (m_state.context.fpu.__fpu_stmm2.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm3:     memcpy (m_state.context.fpu.__fpu_stmm3.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm4:     memcpy (m_state.context.fpu.__fpu_stmm4.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm5:     memcpy (m_state.context.fpu.__fpu_stmm5.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm6:     memcpy (m_state.context.fpu.__fpu_stmm6.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-            case fpu_stmm7:     memcpy (m_state.context.fpu.__fpu_stmm7.__mmst_reg, &value->value.uint8, 10);    success = true; break;
-
-            case fpu_xmm0:     memcpy(m_state.context.fpu.__fpu_xmm0.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm1:     memcpy(m_state.context.fpu.__fpu_xmm1.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm2:     memcpy(m_state.context.fpu.__fpu_xmm2.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm3:     memcpy(m_state.context.fpu.__fpu_xmm3.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm4:     memcpy(m_state.context.fpu.__fpu_xmm4.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm5:     memcpy(m_state.context.fpu.__fpu_xmm5.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm6:     memcpy(m_state.context.fpu.__fpu_xmm6.__xmm_reg, &value->value.uint8, 16);    success = true; break;
-            case fpu_xmm7:     memcpy(m_state.context.fpu.__fpu_xmm7.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                switch (reg)
+                {
+                case fpu_fcw:       *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw)) = value->value.uint16;    success = true; break;
+                case fpu_fsw:       *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw)) = value->value.uint16;    success = true; break;
+                case fpu_ftw:       m_state.context.fpu.avx.__fpu_ftw = value->value.uint8;                       success = true; break;
+                case fpu_fop:       m_state.context.fpu.avx.__fpu_fop = value->value.uint16;                      success = true; break;
+                case fpu_ip:        m_state.context.fpu.avx.__fpu_ip = value->value.uint32;                       success = true; break;
+                case fpu_cs:        m_state.context.fpu.avx.__fpu_cs = value->value.uint16;                       success = true; break;
+                case fpu_dp:        m_state.context.fpu.avx.__fpu_dp = value->value.uint32;                       success = true; break;
+                case fpu_ds:        m_state.context.fpu.avx.__fpu_ds = value->value.uint16;                       success = true; break;
+                case fpu_mxcsr:     m_state.context.fpu.avx.__fpu_mxcsr = value->value.uint32;                    success = true; break;
+                case fpu_mxcsrmask: m_state.context.fpu.avx.__fpu_mxcsrmask = value->value.uint32;                success = true; break;
+                    
+                case fpu_stmm0:     memcpy (m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm1:     memcpy (m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm2:     memcpy (m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm3:     memcpy (m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm4:     memcpy (m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm5:     memcpy (m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm6:     memcpy (m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm7:     memcpy (m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                    
+                case fpu_xmm0:      memcpy(m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm1:      memcpy(m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm2:      memcpy(m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm3:      memcpy(m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm4:      memcpy(m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm5:      memcpy(m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm6:      memcpy(m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm7:      memcpy(m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                        
+#define MEMCPY_YMM(n)                                                                           \
+    memcpy(m_state.context.fpu.avx.__fpu_xmm##n.__xmm_reg, &value->value.uint8, 16);            \
+    memcpy(m_state.context.fpu.avx.__fpu_ymmh##n.__xmm_reg, (&value->value.uint8) + 16, 16);
+                case fpu_ymm0:      MEMCPY_YMM(0);  return true;
+                case fpu_ymm1:      MEMCPY_YMM(1);  return true;
+                case fpu_ymm2:      MEMCPY_YMM(2);  return true;
+                case fpu_ymm3:      MEMCPY_YMM(3);  return true;
+                case fpu_ymm4:      MEMCPY_YMM(4);  return true;
+                case fpu_ymm5:      MEMCPY_YMM(5);  return true;
+                case fpu_ymm6:      MEMCPY_YMM(6);  return true;
+                case fpu_ymm7:      MEMCPY_YMM(7);  return true;
+#undef MEMCPY_YMM
+                }
+            }
+            else
+            {
+                switch (reg)
+                {
+                case fpu_fcw:       *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)) = value->value.uint16;    success = true; break;
+                case fpu_fsw:       *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)) = value->value.uint16;    success = true; break;
+                case fpu_ftw:       m_state.context.fpu.no_avx.__fpu_ftw = value->value.uint8;                       success = true; break;
+                case fpu_fop:       m_state.context.fpu.no_avx.__fpu_fop = value->value.uint16;                      success = true; break;
+                case fpu_ip:        m_state.context.fpu.no_avx.__fpu_ip = value->value.uint32;                       success = true; break;
+                case fpu_cs:        m_state.context.fpu.no_avx.__fpu_cs = value->value.uint16;                       success = true; break;
+                case fpu_dp:        m_state.context.fpu.no_avx.__fpu_dp = value->value.uint32;                       success = true; break;
+                case fpu_ds:        m_state.context.fpu.no_avx.__fpu_ds = value->value.uint16;                       success = true; break;
+                case fpu_mxcsr:     m_state.context.fpu.no_avx.__fpu_mxcsr = value->value.uint32;                    success = true; break;
+                case fpu_mxcsrmask: m_state.context.fpu.no_avx.__fpu_mxcsrmask = value->value.uint32;                success = true; break;
+
+                case fpu_stmm0:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm1:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm2:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm3:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm4:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm5:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm6:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+                case fpu_stmm7:     memcpy (m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg, &value->value.uint8, 10);    success = true; break;
+
+                case fpu_xmm0:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm1:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm2:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm3:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm4:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm5:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm6:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                case fpu_xmm7:      memcpy(m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg, &value->value.uint8, 16);    success = true; break;
+                }
             }
             break;
 
@@ -886,6 +1213,4 @@
     return m_state.RegsAreValid(set);
 }
 
-
-
 #endif    // #if defined (__i386__)

Modified: lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h?rev=128111&r1=128110&r2=128111&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h (original)
+++ lldb/trunk/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.h Tue Mar 22 16:45:30 2011
@@ -17,9 +17,7 @@
 #if defined (__i386__) || defined (__x86_64__)
 
 #include "DNBArch.h"
-#include <mach/mach_types.h>
-#include <mach/thread_status.h>
-
+#include "MachRegisterStatesI386.h"
 
 class MachThread;
 
@@ -55,18 +53,23 @@
 protected:
     kern_return_t           EnableHardwareSingleStep (bool enable);
 
-    typedef i386_thread_state_t GPR;
-    typedef i386_float_state_t FPU;
-    typedef i386_exception_state_t EXC;
+    typedef __i386_thread_state_t GPR;
+    typedef __i386_float_state_t FPU;
+    typedef __i386_exception_state_t EXC;
+    typedef __i386_avx_state_t AVX;
 
     static const DNBRegisterInfo g_gpr_registers[];
-    static const DNBRegisterInfo g_fpu_registers[];
+    static const DNBRegisterInfo g_fpu_registers_no_avx[];
+    static const DNBRegisterInfo g_fpu_registers_avx[];
     static const DNBRegisterInfo g_exc_registers[];
-    static const DNBRegisterSetInfo g_reg_sets[];
+    static const DNBRegisterSetInfo g_reg_sets_no_avx[];
+    static const DNBRegisterSetInfo g_reg_sets_avx[];
     static const size_t k_num_gpr_registers;
-    static const size_t k_num_fpu_registers;
+    static const size_t k_num_fpu_registers_no_avx;
+    static const size_t k_num_fpu_registers_avx;
     static const size_t k_num_exc_registers;
-    static const size_t k_num_all_registers;
+    static const size_t k_num_all_registers_no_avx;
+    static const size_t k_num_all_registers_avx;
     static const size_t k_num_register_sets;
 
     typedef enum RegisterSetTag
@@ -80,9 +83,10 @@
 
     typedef enum RegisterSetWordSizeTag
     {
-        e_regSetWordSizeGPR = i386_THREAD_STATE_COUNT,
-        e_regSetWordSizeFPR = i386_FLOAT_STATE_COUNT,
-        e_regSetWordSizeEXC = i386_EXCEPTION_STATE_COUNT
+        e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int),
+        e_regSetWordSizeFPR = sizeof(FPU) / sizeof(int),
+        e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
+        e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int)
     } RegisterSetWordSize;
 
     enum
@@ -94,9 +98,12 @@
 
     struct Context
     {
-        i386_thread_state_t     gpr;
-        i386_float_state_t      fpu;
-        i386_exception_state_t  exc;
+        __i386_thread_state_t       gpr;
+        union {
+            __i386_float_state_t    no_avx;
+            __i386_avx_state_t      avx;
+        } fpu;
+        __i386_exception_state_t    exc;
     };
 
     struct State
@@ -105,7 +112,7 @@
         kern_return_t gpr_errs[2];    // Read/Write errors
         kern_return_t fpu_errs[2];    // Read/Write errors
         kern_return_t exc_errs[2];    // Read/Write errors
-
+        
         State()
         {
             uint32_t i;
@@ -190,9 +197,24 @@
 
     static const DNBRegisterSetInfo *
     GetRegisterSetInfo(nub_size_t *num_reg_sets);
+    
+    static bool
+    HasAVX()
+    {
+        if (s_has_avx == kAVXUnknown)
+            s_has_avx = kAVXNotPresent;
+        
+        return (s_has_avx == kAVXPresent);
+    }
 
     MachThread *m_thread;
-    State        m_state;
+    State       m_state;
+            
+    static enum AVXPresence {
+        kAVXPresent,
+        kAVXNotPresent,
+        kAVXUnknown
+    } s_has_avx;
 };
 
 #endif    // #if defined (__i386__) || defined (__x86_64__)

Added: lldb/trunk/tools/debugserver/source/MacOSX/i386/MachRegisterStatesI386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/i386/MachRegisterStatesI386.h?rev=128111&view=auto
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/i386/MachRegisterStatesI386.h (added)
+++ lldb/trunk/tools/debugserver/source/MacOSX/i386/MachRegisterStatesI386.h Tue Mar 22 16:45:30 2011
@@ -0,0 +1,168 @@
+//===-- MachRegisterStatesI386.h --------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  Created by Sean Callanan on 3/16/11.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __MachRegisterStatesI386_h__
+#define __MachRegisterStatesI386_h__
+
+#include <inttypes.h>
+
+#define __i386_THREAD_STATE         1
+#define __i386_FLOAT_STATE          2
+#define __i386_EXCEPTION_STATE      3
+#define __i386_AVX_STATE            16
+
+typedef struct {
+    uint32_t    __eax;
+    uint32_t    __ebx;
+    uint32_t    __ecx;
+    uint32_t    __edx;
+    uint32_t    __edi;
+    uint32_t    __esi;
+    uint32_t    __ebp;
+    uint32_t    __esp;
+    uint32_t    __ss;
+    uint32_t    __eflags;
+    uint32_t    __eip;
+    uint32_t    __cs;
+    uint32_t    __ds;
+    uint32_t    __es;
+    uint32_t    __fs;
+    uint32_t    __gs;
+} __i386_thread_state_t;
+
+typedef struct {
+    uint16_t    __invalid   : 1;
+    uint16_t    __denorm    : 1;
+    uint16_t    __zdiv      : 1;
+    uint16_t    __ovrfl     : 1;
+    uint16_t    __undfl     : 1;
+    uint16_t    __precis    : 1;
+    uint16_t    __PAD1      : 2;
+    uint16_t    __pc        : 2;
+    uint16_t    __rc        : 2;
+    uint16_t    __PAD2      : 1;
+    uint16_t    __PAD3      : 3;
+} __i386_fp_control_t;
+
+typedef struct {
+    uint16_t    __invalid   : 1;
+    uint16_t    __denorm    : 1;
+    uint16_t    __zdiv      : 1;
+    uint16_t    __ovrfl     : 1;
+    uint16_t    __undfl     : 1;
+    uint16_t    __precis    : 1;
+    uint16_t    __stkflt    : 1;
+    uint16_t    __errsumm   : 1;
+    uint16_t    __c0        : 1;
+    uint16_t    __c1        : 1;
+    uint16_t    __c2        : 1;
+    uint16_t    __tos       : 3;
+    uint16_t    __c3        : 1;
+    uint16_t    __busy      : 1;
+} __i386_fp_status_t;
+
+typedef struct {
+    uint8_t     __mmst_reg[10];
+    uint8_t     __mmst_rsrv[6];
+} __i386_mmst_reg;
+
+typedef struct {
+    uint8_t     __xmm_reg[16];
+} __i386_xmm_reg;
+
+typedef struct {
+    uint32_t                __fpu_reserved[2];
+    __i386_fp_control_t     __fpu_fcw;
+    __i386_fp_status_t      __fpu_fsw;
+    uint8_t                 __fpu_ftw;
+    uint8_t                 __fpu_rsrv1;
+    uint16_t                __fpu_fop;
+    uint32_t                __fpu_ip;
+    uint16_t                __fpu_cs;
+    uint16_t                __fpu_rsrv2;
+    uint32_t                __fpu_dp;
+    uint16_t                __fpu_ds;
+    uint16_t                __fpu_rsrv3;
+    uint32_t                __fpu_mxcsr;
+    uint32_t                __fpu_mxcsrmask;
+    __i386_mmst_reg         __fpu_stmm0;
+    __i386_mmst_reg         __fpu_stmm1;
+    __i386_mmst_reg         __fpu_stmm2;
+    __i386_mmst_reg         __fpu_stmm3;
+    __i386_mmst_reg         __fpu_stmm4;
+    __i386_mmst_reg         __fpu_stmm5;
+    __i386_mmst_reg         __fpu_stmm6;
+    __i386_mmst_reg         __fpu_stmm7;
+    __i386_xmm_reg          __fpu_xmm0;
+    __i386_xmm_reg          __fpu_xmm1;
+    __i386_xmm_reg          __fpu_xmm2;
+    __i386_xmm_reg          __fpu_xmm3;
+    __i386_xmm_reg          __fpu_xmm4;
+    __i386_xmm_reg          __fpu_xmm5;
+    __i386_xmm_reg          __fpu_xmm6;
+    __i386_xmm_reg          __fpu_xmm7;
+    uint8_t                 __fpu_rsrv4[14*16];
+    uint32_t                __fpu_reserved1;
+} __i386_float_state_t;
+
+typedef struct {
+    uint32_t                __fpu_reserved[2];
+    __i386_fp_control_t     __fpu_fcw;
+    __i386_fp_status_t      __fpu_fsw;
+    uint8_t                 __fpu_ftw;
+    uint8_t                 __fpu_rsrv1;
+    uint16_t                __fpu_fop;
+    uint32_t                __fpu_ip;
+    uint16_t                __fpu_cs;
+    uint16_t                __fpu_rsrv2;
+    uint32_t                __fpu_dp;
+    uint16_t                __fpu_ds;
+    uint16_t                __fpu_rsrv3;
+    uint32_t                __fpu_mxcsr;
+    uint32_t                __fpu_mxcsrmask;
+    __i386_mmst_reg         __fpu_stmm0;
+    __i386_mmst_reg         __fpu_stmm1;
+    __i386_mmst_reg         __fpu_stmm2;
+    __i386_mmst_reg         __fpu_stmm3;
+    __i386_mmst_reg         __fpu_stmm4;
+    __i386_mmst_reg         __fpu_stmm5;
+    __i386_mmst_reg         __fpu_stmm6;
+    __i386_mmst_reg         __fpu_stmm7;
+    __i386_xmm_reg          __fpu_xmm0;
+    __i386_xmm_reg          __fpu_xmm1;
+    __i386_xmm_reg          __fpu_xmm2;
+    __i386_xmm_reg          __fpu_xmm3;
+    __i386_xmm_reg          __fpu_xmm4;
+    __i386_xmm_reg          __fpu_xmm5;
+    __i386_xmm_reg          __fpu_xmm6;
+    __i386_xmm_reg          __fpu_xmm7;
+    uint8_t                 __fpu_rsrv4[14*16];
+    uint32_t                __fpu_reserved1;
+    uint8_t                 __avx_reserved1[64];
+    __i386_xmm_reg          __fpu_ymmh0;
+    __i386_xmm_reg          __fpu_ymmh1;
+    __i386_xmm_reg          __fpu_ymmh2;
+    __i386_xmm_reg          __fpu_ymmh3;
+    __i386_xmm_reg          __fpu_ymmh4;
+    __i386_xmm_reg          __fpu_ymmh5;
+    __i386_xmm_reg          __fpu_ymmh6;
+    __i386_xmm_reg          __fpu_ymmh7;
+} __i386_avx_state_t;
+
+typedef struct {
+    uint32_t    __trapno;
+    uint32_t    __err;
+    uint32_t    __faultvaddr;
+} __i386_exception_state_t;
+
+#endif

Modified: lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp?rev=128111&r1=128110&r2=128111&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp (original)
+++ lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp Tue Mar 22 16:45:30 2011
@@ -20,6 +20,52 @@
 #include "MachThread.h"
 #include "MachProcess.h"
 #include <mach/mach.h>
+#include <stdlib.h>
+
+#if defined (LLDB_DEBUGSERVER_RELEASE) || defined (LLDB_DEBUGSERVER_DEBUG)
+enum debugState {
+    debugStateUnknown,
+    debugStateOff,
+    debugStateOn
+};
+
+static debugState sFPUDebugState = debugStateUnknown;
+static debugState sAVXForceState = debugStateUnknown;
+
+static bool DebugFPURegs ()
+{
+    if (sFPUDebugState == debugStateUnknown)
+    {
+        if (getenv("DNB_DEBUG_FPU_REGS"))
+            sFPUDebugState = debugStateOn;
+        else
+            sFPUDebugState = debugStateOff;
+    }
+    
+    return (sFPUDebugState == debugStateOn);
+}
+
+static bool ForceAVXRegs ()
+{
+    if (sFPUDebugState == debugStateUnknown)
+    {
+        if (getenv("DNB_DEBUG_X86_FORCE_AVX_REGS"))
+            sAVXForceState = debugStateOn;
+        else
+            sAVXForceState = debugStateOff;
+    }
+    
+    return (sAVXForceState == debugStateOn);
+}
+
+#define DEBUG_FPU_REGS (DebugFPURegs())
+#define FORCE_AVX_REGS (ForceAVXRegs())
+#else
+#define DEBUG_FPU_REGS (0)
+#define FORCE_AVX_REGS (0)
+#endif
+
+enum DNBArchImplX86_64::AVXPresence DNBArchImplX86_64::s_has_avx = DNBArchImplX86_64::kAVXUnknown;
 
 uint64_t
 DNBArchImplX86_64::GetPC(uint64_t failValue)
@@ -87,8 +133,8 @@
         m_state.context.gpr.__gs = ('g' << 8) + 's';
         m_state.SetError(e_regSetGPR, Read, 0);
 #else
-        mach_msg_type_number_t count = x86_THREAD_STATE64_COUNT;
-        m_state.SetError(e_regSetGPR, Read, ::thread_get_state(m_thread->ThreadID(), x86_THREAD_STATE64, (thread_state_t)&m_state.context.gpr, &count));
+        mach_msg_type_number_t count = e_regSetWordSizeGPR;
+        m_state.SetError(e_regSetGPR, Read, ::thread_get_state(m_thread->ThreadID(), __x86_64_THREAD_STATE, (thread_state_t)&m_state.context.gpr, &count));
         DNBLogThreadedIf (LOG_THREAD, "::thread_get_state (0x%4.4x, %u, &gpr, %u) => 0x%8.8x"
                           "\n\trax = %16.16llx rbx = %16.16llx rcx = %16.16llx rdx = %16.16llx"
                           "\n\trdi = %16.16llx rsi = %16.16llx rbp = %16.16llx rsp = %16.16llx"
@@ -159,80 +205,177 @@
 }
 
 // Uncomment the value below to verify the values in the debugger.
-//#define DEBUG_FPU_VALUES 1    // DO NOT CHECK IN WITH THIS DEFINE ENABLED
+//#define DEBUG_FPU_REGS 1    // DO NOT CHECK IN WITH THIS DEFINE ENABLED
 
 kern_return_t
 DNBArchImplX86_64::GetFPUState(bool force)
 {
     if (force || m_state.GetError(e_regSetFPU, Read))
     {
-#if DEBUG_FPU_VALUES
-        m_state.context.fpu.__fpu_reserved[0] = -1;
-        m_state.context.fpu.__fpu_reserved[1] = -1;
-        *(uint16_t *)&(m_state.context.fpu.__fpu_fcw) = 0x1234;
-        *(uint16_t *)&(m_state.context.fpu.__fpu_fsw) = 0x5678;
-        m_state.context.fpu.__fpu_ftw = 1;
-        m_state.context.fpu.__fpu_rsrv1 = UINT8_MAX;
-        m_state.context.fpu.__fpu_fop = 2;
-        m_state.context.fpu.__fpu_ip = 3;
-        m_state.context.fpu.__fpu_cs = 4;
-        m_state.context.fpu.__fpu_rsrv2 = 5;
-        m_state.context.fpu.__fpu_dp = 6;
-        m_state.context.fpu.__fpu_ds = 7;
-        m_state.context.fpu.__fpu_rsrv3 = UINT16_MAX;
-        m_state.context.fpu.__fpu_mxcsr = 8;
-        m_state.context.fpu.__fpu_mxcsrmask = 9;
-        int i;
-        for (i=0; i<16; ++i)
-        {
-            if (i<10)
+        if (DEBUG_FPU_REGS) {
+            if (HasAVX() || FORCE_AVX_REGS)
             {
-                m_state.context.fpu.__fpu_stmm0.__mmst_reg[i] = 'a';
-                m_state.context.fpu.__fpu_stmm1.__mmst_reg[i] = 'b';
-                m_state.context.fpu.__fpu_stmm2.__mmst_reg[i] = 'c';
-                m_state.context.fpu.__fpu_stmm3.__mmst_reg[i] = 'd';
-                m_state.context.fpu.__fpu_stmm4.__mmst_reg[i] = 'e';
-                m_state.context.fpu.__fpu_stmm5.__mmst_reg[i] = 'f';
-                m_state.context.fpu.__fpu_stmm6.__mmst_reg[i] = 'g';
-                m_state.context.fpu.__fpu_stmm7.__mmst_reg[i] = 'h';
+                m_state.context.fpu.avx.__fpu_reserved[0] = -1;
+                m_state.context.fpu.avx.__fpu_reserved[1] = -1;
+                *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fcw) = 0x1234;
+                *(uint16_t *)&(m_state.context.fpu.avx.__fpu_fsw) = 0x5678;
+                m_state.context.fpu.avx.__fpu_ftw = 1;
+                m_state.context.fpu.avx.__fpu_rsrv1 = UINT8_MAX;
+                m_state.context.fpu.avx.__fpu_fop = 2;
+                m_state.context.fpu.avx.__fpu_ip = 3;
+                m_state.context.fpu.avx.__fpu_cs = 4;
+                m_state.context.fpu.avx.__fpu_rsrv2 = 5;
+                m_state.context.fpu.avx.__fpu_dp = 6;
+                m_state.context.fpu.avx.__fpu_ds = 7;
+                m_state.context.fpu.avx.__fpu_rsrv3 = UINT16_MAX;
+                m_state.context.fpu.avx.__fpu_mxcsr = 8;
+                m_state.context.fpu.avx.__fpu_mxcsrmask = 9;
+                int i;
+                for (i=0; i<16; ++i)
+                {
+                    if (i<10)
+                    {
+                        m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = 'a';
+                        m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = 'b';
+                        m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = 'c';
+                        m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = 'd';
+                        m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = 'e';
+                        m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = 'f';
+                        m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = 'g';
+                        m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = 'h';
+                    }
+                    else
+                    {
+                        m_state.context.fpu.avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN;
+                    }
+                    
+                    m_state.context.fpu.avx.__fpu_xmm0.__xmm_reg[i] = '0';
+                    m_state.context.fpu.avx.__fpu_xmm1.__xmm_reg[i] = '1';
+                    m_state.context.fpu.avx.__fpu_xmm2.__xmm_reg[i] = '2';
+                    m_state.context.fpu.avx.__fpu_xmm3.__xmm_reg[i] = '3';
+                    m_state.context.fpu.avx.__fpu_xmm4.__xmm_reg[i] = '4';
+                    m_state.context.fpu.avx.__fpu_xmm5.__xmm_reg[i] = '5';
+                    m_state.context.fpu.avx.__fpu_xmm6.__xmm_reg[i] = '6';
+                    m_state.context.fpu.avx.__fpu_xmm7.__xmm_reg[i] = '7';
+                    m_state.context.fpu.avx.__fpu_xmm8.__xmm_reg[i] = '8';
+                    m_state.context.fpu.avx.__fpu_xmm9.__xmm_reg[i] = '9';
+                    m_state.context.fpu.avx.__fpu_xmm10.__xmm_reg[i] = 'A';
+                    m_state.context.fpu.avx.__fpu_xmm11.__xmm_reg[i] = 'B';
+                    m_state.context.fpu.avx.__fpu_xmm12.__xmm_reg[i] = 'C';
+                    m_state.context.fpu.avx.__fpu_xmm13.__xmm_reg[i] = 'D';
+                    m_state.context.fpu.avx.__fpu_xmm14.__xmm_reg[i] = 'E';
+                    m_state.context.fpu.avx.__fpu_xmm15.__xmm_reg[i] = 'F';
+                    
+                    m_state.context.fpu.avx.__fpu_ymmh0.__xmm_reg[i] = '0';
+                    m_state.context.fpu.avx.__fpu_ymmh1.__xmm_reg[i] = '1';
+                    m_state.context.fpu.avx.__fpu_ymmh2.__xmm_reg[i] = '2';
+                    m_state.context.fpu.avx.__fpu_ymmh3.__xmm_reg[i] = '3';
+                    m_state.context.fpu.avx.__fpu_ymmh4.__xmm_reg[i] = '4';
+                    m_state.context.fpu.avx.__fpu_ymmh5.__xmm_reg[i] = '5';
+                    m_state.context.fpu.avx.__fpu_ymmh6.__xmm_reg[i] = '6';
+                    m_state.context.fpu.avx.__fpu_ymmh7.__xmm_reg[i] = '7';
+                    m_state.context.fpu.avx.__fpu_ymmh8.__xmm_reg[i] = '8';
+                    m_state.context.fpu.avx.__fpu_ymmh9.__xmm_reg[i] = '9';
+                    m_state.context.fpu.avx.__fpu_ymmh10.__xmm_reg[i] = 'A';
+                    m_state.context.fpu.avx.__fpu_ymmh11.__xmm_reg[i] = 'B';
+                    m_state.context.fpu.avx.__fpu_ymmh12.__xmm_reg[i] = 'C';
+                    m_state.context.fpu.avx.__fpu_ymmh13.__xmm_reg[i] = 'D';
+                    m_state.context.fpu.avx.__fpu_ymmh14.__xmm_reg[i] = 'E';
+                    m_state.context.fpu.avx.__fpu_ymmh15.__xmm_reg[i] = 'F';
+                }
+                for (i=0; i<sizeof(m_state.context.fpu.avx.__fpu_rsrv4); ++i)
+                    m_state.context.fpu.avx.__fpu_rsrv4[i] = INT8_MIN;
+                m_state.context.fpu.avx.__fpu_reserved1 = -1;
+                for (i=0; i<sizeof(m_state.context.fpu.avx.__avx_reserved1); ++i)
+                    m_state.context.fpu.avx.__avx_reserved1[i] = INT8_MIN;
+                m_state.SetError(e_regSetFPU, Read, 0);
             }
             else
             {
-                m_state.context.fpu.__fpu_stmm0.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm1.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm2.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm3.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm4.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm5.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm6.__mmst_reg[i] = INT8_MIN;
-                m_state.context.fpu.__fpu_stmm7.__mmst_reg[i] = INT8_MIN;
+                m_state.context.fpu.no_avx.__fpu_reserved[0] = -1;
+                m_state.context.fpu.no_avx.__fpu_reserved[1] = -1;
+                *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fcw) = 0x1234;
+                *(uint16_t *)&(m_state.context.fpu.no_avx.__fpu_fsw) = 0x5678;
+                m_state.context.fpu.no_avx.__fpu_ftw = 1;
+                m_state.context.fpu.no_avx.__fpu_rsrv1 = UINT8_MAX;
+                m_state.context.fpu.no_avx.__fpu_fop = 2;
+                m_state.context.fpu.no_avx.__fpu_ip = 3;
+                m_state.context.fpu.no_avx.__fpu_cs = 4;
+                m_state.context.fpu.no_avx.__fpu_rsrv2 = 5;
+                m_state.context.fpu.no_avx.__fpu_dp = 6;
+                m_state.context.fpu.no_avx.__fpu_ds = 7;
+                m_state.context.fpu.no_avx.__fpu_rsrv3 = UINT16_MAX;
+                m_state.context.fpu.no_avx.__fpu_mxcsr = 8;
+                m_state.context.fpu.no_avx.__fpu_mxcsrmask = 9;
+                int i;
+                for (i=0; i<16; ++i)
+                {
+                    if (i<10)
+                    {
+                        m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = 'a';
+                        m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = 'b';
+                        m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = 'c';
+                        m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = 'd';
+                        m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = 'e';
+                        m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = 'f';
+                        m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = 'g';
+                        m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = 'h';
+                    }
+                    else
+                    {
+                        m_state.context.fpu.no_avx.__fpu_stmm0.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm1.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm2.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm3.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm4.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm5.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm6.__mmst_reg[i] = INT8_MIN;
+                        m_state.context.fpu.no_avx.__fpu_stmm7.__mmst_reg[i] = INT8_MIN;
+                    }
+                    
+                    m_state.context.fpu.no_avx.__fpu_xmm0.__xmm_reg[i] = '0';
+                    m_state.context.fpu.no_avx.__fpu_xmm1.__xmm_reg[i] = '1';
+                    m_state.context.fpu.no_avx.__fpu_xmm2.__xmm_reg[i] = '2';
+                    m_state.context.fpu.no_avx.__fpu_xmm3.__xmm_reg[i] = '3';
+                    m_state.context.fpu.no_avx.__fpu_xmm4.__xmm_reg[i] = '4';
+                    m_state.context.fpu.no_avx.__fpu_xmm5.__xmm_reg[i] = '5';
+                    m_state.context.fpu.no_avx.__fpu_xmm6.__xmm_reg[i] = '6';
+                    m_state.context.fpu.no_avx.__fpu_xmm7.__xmm_reg[i] = '7';
+                    m_state.context.fpu.no_avx.__fpu_xmm8.__xmm_reg[i] = '8';
+                    m_state.context.fpu.no_avx.__fpu_xmm9.__xmm_reg[i] = '9';
+                    m_state.context.fpu.no_avx.__fpu_xmm10.__xmm_reg[i] = 'A';
+                    m_state.context.fpu.no_avx.__fpu_xmm11.__xmm_reg[i] = 'B';
+                    m_state.context.fpu.no_avx.__fpu_xmm12.__xmm_reg[i] = 'C';
+                    m_state.context.fpu.no_avx.__fpu_xmm13.__xmm_reg[i] = 'D';
+                    m_state.context.fpu.no_avx.__fpu_xmm14.__xmm_reg[i] = 'E';
+                    m_state.context.fpu.no_avx.__fpu_xmm15.__xmm_reg[i] = 'F';
+                }
+                for (i=0; i<sizeof(m_state.context.fpu.no_avx.__fpu_rsrv4); ++i)
+                    m_state.context.fpu.no_avx.__fpu_rsrv4[i] = INT8_MIN;
+                m_state.context.fpu.no_avx.__fpu_reserved1 = -1;
+                m_state.SetError(e_regSetFPU, Read, 0);
             }
-            
-            m_state.context.fpu.__fpu_xmm0.__xmm_reg[i] = '0';
-            m_state.context.fpu.__fpu_xmm1.__xmm_reg[i] = '1';
-            m_state.context.fpu.__fpu_xmm2.__xmm_reg[i] = '2';
-            m_state.context.fpu.__fpu_xmm3.__xmm_reg[i] = '3';
-            m_state.context.fpu.__fpu_xmm4.__xmm_reg[i] = '4';
-            m_state.context.fpu.__fpu_xmm5.__xmm_reg[i] = '5';
-            m_state.context.fpu.__fpu_xmm6.__xmm_reg[i] = '6';
-            m_state.context.fpu.__fpu_xmm7.__xmm_reg[i] = '7';
-            m_state.context.fpu.__fpu_xmm8.__xmm_reg[i] = '8';
-            m_state.context.fpu.__fpu_xmm9.__xmm_reg[i] = '9';
-            m_state.context.fpu.__fpu_xmm10.__xmm_reg[i] = 'A';
-            m_state.context.fpu.__fpu_xmm11.__xmm_reg[i] = 'B';
-            m_state.context.fpu.__fpu_xmm12.__xmm_reg[i] = 'C';
-            m_state.context.fpu.__fpu_xmm13.__xmm_reg[i] = 'D';
-            m_state.context.fpu.__fpu_xmm14.__xmm_reg[i] = 'E';
-            m_state.context.fpu.__fpu_xmm15.__xmm_reg[i] = 'F';
         }
-        for (i=0; i<sizeof(m_state.context.fpu.__fpu_rsrv4); ++i)
-            m_state.context.fpu.__fpu_rsrv4[i] = INT8_MIN;
-        m_state.context.fpu.__fpu_reserved1 = -1;
-        m_state.SetError(e_regSetFPU, Read, 0);
-#else
-        mach_msg_type_number_t count = x86_FLOAT_STATE64_COUNT;
-        m_state.SetError(e_regSetFPU, Read, ::thread_get_state(m_thread->ThreadID(), x86_FLOAT_STATE64, (thread_state_t)&m_state.context.fpu, &count));
-#endif
+        else
+        {
+            if (HasAVX() || FORCE_AVX_REGS)
+            {
+                mach_msg_type_number_t count = e_regSetWordSizeAVX;
+                m_state.SetError(e_regSetFPU, Read, ::thread_get_state(m_thread->ThreadID(), __x86_64_AVX_STATE, (thread_state_t)&m_state.context.fpu.avx, &count));
+            }
+            else
+            {
+                mach_msg_type_number_t count = e_regSetWordSizeFPR;
+                m_state.SetError(e_regSetFPU, Read, ::thread_get_state(m_thread->ThreadID(), __x86_64_FLOAT_STATE, (thread_state_t)&m_state.context.fpu.no_avx, &count));
+            }
+        }        
     }
     return m_state.GetError(e_regSetFPU, Read);
 }
@@ -242,8 +385,8 @@
 {
     if (force || m_state.GetError(e_regSetEXC, Read))
     {
-        mach_msg_type_number_t count = X86_EXCEPTION_STATE64_COUNT;
-        m_state.SetError(e_regSetEXC, Read, ::thread_get_state(m_thread->ThreadID(), x86_EXCEPTION_STATE64, (thread_state_t)&m_state.context.exc, &count));
+        mach_msg_type_number_t count = e_regSetWordSizeEXC;
+        m_state.SetError(e_regSetEXC, Read, ::thread_get_state(m_thread->ThreadID(), __x86_64_EXCEPTION_STATE, (thread_state_t)&m_state.context.exc, &count));
     }
     return m_state.GetError(e_regSetEXC, Read);
 }
@@ -254,7 +397,7 @@
     kern_return_t kret = ::thread_abort_safely(m_thread->ThreadID());
     DNBLogThreaded("thread = 0x%4.4x calling thread_abort_safely (tid) => %u (SetGPRState() for stop_count = %u)", m_thread->ThreadID(), kret, m_thread->Process()->StopCount());    
 
-    m_state.SetError(e_regSetGPR, Write, ::thread_set_state(m_thread->ThreadID(), x86_THREAD_STATE64, (thread_state_t)&m_state.context.gpr, x86_THREAD_STATE64_COUNT));
+    m_state.SetError(e_regSetGPR, Write, ::thread_set_state(m_thread->ThreadID(), __x86_64_THREAD_STATE, (thread_state_t)&m_state.context.gpr, e_regSetWordSizeGPR));
     DNBLogThreadedIf (LOG_THREAD, "::thread_set_state (0x%4.4x, %u, &gpr, %u) => 0x%8.8x"
                       "\n\trax = %16.16llx rbx = %16.16llx rcx = %16.16llx rdx = %16.16llx"
                       "\n\trdi = %16.16llx rsi = %16.16llx rbp = %16.16llx rsp = %16.16llx"
@@ -262,7 +405,7 @@
                       "\n\tr12 = %16.16llx r13 = %16.16llx r14 = %16.16llx r15 = %16.16llx"
                       "\n\trip = %16.16llx"
                       "\n\tflg = %16.16llx  cs = %16.16llx  fs = %16.16llx  gs = %16.16llx",
-                      m_thread->ThreadID(), x86_THREAD_STATE64, x86_THREAD_STATE64_COUNT,
+                      m_thread->ThreadID(), __x86_64_THREAD_STATE, e_regSetWordSizeGPR,
                       m_state.GetError(e_regSetGPR, Write),
                       m_state.context.gpr.__rax,m_state.context.gpr.__rbx,m_state.context.gpr.__rcx,
                       m_state.context.gpr.__rdx,m_state.context.gpr.__rdi,m_state.context.gpr.__rsi,
@@ -277,14 +420,30 @@
 kern_return_t
 DNBArchImplX86_64::SetFPUState()
 {
-    m_state.SetError(e_regSetFPU, Write, ::thread_set_state(m_thread->ThreadID(), x86_FLOAT_STATE64, (thread_state_t)&m_state.context.fpu, x86_FLOAT_STATE64_COUNT));
-    return m_state.GetError(e_regSetFPU, Write);
+    if (DEBUG_FPU_REGS)
+    {
+        m_state.SetError(e_regSetFPU, Write, 0);
+        return m_state.GetError(e_regSetFPU, Write);   
+    }
+    else
+    {
+        if (HasAVX() || FORCE_AVX_REGS)
+        {
+            m_state.SetError(e_regSetFPU, Write, ::thread_set_state(m_thread->ThreadID(), __x86_64_AVX_STATE, (thread_state_t)&m_state.context.fpu.avx, e_regSetWordSizeAVX));
+            return m_state.GetError(e_regSetFPU, Write);
+        }
+        else
+        {
+            m_state.SetError(e_regSetFPU, Write, ::thread_set_state(m_thread->ThreadID(), __x86_64_FLOAT_STATE, (thread_state_t)&m_state.context.fpu.no_avx, e_regSetWordSizeFPR));
+            return m_state.GetError(e_regSetFPU, Write);
+        }
+    }
 }
 
 kern_return_t
 DNBArchImplX86_64::SetEXCState()
 {
-    m_state.SetError(e_regSetEXC, Write, ::thread_set_state(m_thread->ThreadID(), x86_EXCEPTION_STATE64, (thread_state_t)&m_state.context.exc, X86_EXCEPTION_STATE64_COUNT));
+    m_state.SetError(e_regSetEXC, Write, ::thread_set_state(m_thread->ThreadID(), __x86_64_EXCEPTION_STATE, (thread_state_t)&m_state.context.exc, e_regSetWordSizeEXC));
     return m_state.GetError(e_regSetEXC, Write);
 }
 
@@ -460,6 +619,22 @@
     fpu_xmm13,
     fpu_xmm14,
     fpu_xmm15,
+    fpu_ymm0,
+    fpu_ymm1,
+    fpu_ymm2,
+    fpu_ymm3,
+    fpu_ymm4,
+    fpu_ymm5,
+    fpu_ymm6,
+    fpu_ymm7,
+    fpu_ymm8,
+    fpu_ymm9,
+    fpu_ymm10,
+    fpu_ymm11,
+    fpu_ymm12,
+    fpu_ymm13,
+    fpu_ymm14,
+    fpu_ymm15,
     k_num_fpu_regs,
     
     // Aliases
@@ -523,7 +698,22 @@
     gcc_dwarf_stmm5,
     gcc_dwarf_stmm6,
     gcc_dwarf_stmm7,
-    
+    gcc_dwarf_ymm0 = gcc_dwarf_xmm0,
+    gcc_dwarf_ymm1 = gcc_dwarf_xmm1,
+    gcc_dwarf_ymm2 = gcc_dwarf_xmm2,
+    gcc_dwarf_ymm3 = gcc_dwarf_xmm3,
+    gcc_dwarf_ymm4 = gcc_dwarf_xmm4,
+    gcc_dwarf_ymm5 = gcc_dwarf_xmm5,
+    gcc_dwarf_ymm6 = gcc_dwarf_xmm6,
+    gcc_dwarf_ymm7 = gcc_dwarf_xmm7,
+    gcc_dwarf_ymm8 = gcc_dwarf_xmm8,
+    gcc_dwarf_ymm9 = gcc_dwarf_xmm9,
+    gcc_dwarf_ymm10 = gcc_dwarf_xmm10,
+    gcc_dwarf_ymm11 = gcc_dwarf_xmm11,
+    gcc_dwarf_ymm12 = gcc_dwarf_xmm12,
+    gcc_dwarf_ymm13 = gcc_dwarf_xmm13,
+    gcc_dwarf_ymm14 = gcc_dwarf_xmm14,
+    gcc_dwarf_ymm15 = gcc_dwarf_xmm15
 };
 
 enum gdb_regnums
@@ -585,16 +775,41 @@
     gdb_xmm14   =  54,
     gdb_xmm15   =  55,
     gdb_mxcsr   =  56,
+    gdb_ymm0    =  gdb_xmm0,
+    gdb_ymm1    =  gdb_xmm1,
+    gdb_ymm2    =  gdb_xmm2,
+    gdb_ymm3    =  gdb_xmm3,
+    gdb_ymm4    =  gdb_xmm4,
+    gdb_ymm5    =  gdb_xmm5,
+    gdb_ymm6    =  gdb_xmm6,
+    gdb_ymm7    =  gdb_xmm7,
+    gdb_ymm8    =  gdb_xmm8,
+    gdb_ymm9    =  gdb_xmm9,
+    gdb_ymm10   =  gdb_xmm10,
+    gdb_ymm11   =  gdb_xmm11,
+    gdb_ymm12   =  gdb_xmm12,
+    gdb_ymm13   =  gdb_xmm13,
+    gdb_ymm14   =  gdb_xmm14,
+    gdb_ymm15   =  gdb_xmm15
 };
 
 #define GPR_OFFSET(reg) (offsetof (DNBArchImplX86_64::GPR, __##reg))
-#define FPU_OFFSET(reg) (offsetof (DNBArchImplX86_64::FPU, __fpu_##reg) + offsetof (DNBArchImplX86_64::Context, fpu))
+#define FPU_OFFSET(reg) (offsetof (DNBArchImplX86_64::FPU, __fpu_##reg) + offsetof (DNBArchImplX86_64::Context, fpu.no_avx))
+#define AVX_OFFSET(reg) (offsetof (DNBArchImplX86_64::AVX, __fpu_##reg) + offsetof (DNBArchImplX86_64::Context, fpu.avx))
 #define EXC_OFFSET(reg) (offsetof (DNBArchImplX86_64::EXC, __##reg)     + offsetof (DNBArchImplX86_64::Context, exc))
 
+// This does not accurately identify the location of ymm0...7 in 
+// Context.fpu.avx.  That is because there is a bunch of padding
+// in Context.fpu.avx that we don't need.  Offset macros lay out
+// the register state that Debugserver transmits to the debugger
+// -- not to interpret the thread_get_state info.
+#define AVX_OFFSET_YMM(n)   (AVX_OFFSET(xmm7) + FPU_SIZE_XMM(xmm7) + (32 * n))
+
 #define GPR_SIZE(reg)       (sizeof(((DNBArchImplX86_64::GPR *)NULL)->__##reg))
 #define FPU_SIZE_UINT(reg)  (sizeof(((DNBArchImplX86_64::FPU *)NULL)->__fpu_##reg))
 #define FPU_SIZE_MMST(reg)  (sizeof(((DNBArchImplX86_64::FPU *)NULL)->__fpu_##reg.__mmst_reg))
 #define FPU_SIZE_XMM(reg)   (sizeof(((DNBArchImplX86_64::FPU *)NULL)->__fpu_##reg.__xmm_reg))
+#define FPU_SIZE_YMM(reg)   (32)
 #define EXC_SIZE(reg)       (sizeof(((DNBArchImplX86_64::EXC *)NULL)->__##reg))
 
 // These macros will auto define the register name, alt name, register size,
@@ -634,7 +849,7 @@
 
 // Floating point registers 64 bit
 const DNBRegisterInfo
-DNBArchImplX86_64::g_fpu_registers[] =
+DNBArchImplX86_64::g_fpu_registers_no_avx[] =
 {
     { e_regSetFPU, fpu_fcw      , "fctrl"       , NULL, Uint, Hex, FPU_SIZE_UINT(fcw)       , FPU_OFFSET(fcw)       , -1, -1, -1, -1 },
     { e_regSetFPU, fpu_fsw      , "fstat"       , NULL, Uint, Hex, FPU_SIZE_UINT(fsw)       , FPU_OFFSET(fsw)       , -1, -1, -1, -1 },
@@ -674,6 +889,64 @@
     { e_regSetFPU, fpu_xmm15, "xmm15"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm15)  , FPU_OFFSET(xmm15), gcc_dwarf_xmm15, gcc_dwarf_xmm15, -1, gdb_xmm15 },
 };
 
+const DNBRegisterInfo
+DNBArchImplX86_64::g_fpu_registers_avx[] =
+{
+    { e_regSetFPU, fpu_fcw      , "fctrl"       , NULL, Uint, Hex, FPU_SIZE_UINT(fcw)       , AVX_OFFSET(fcw)       , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_fsw      , "fstat"       , NULL, Uint, Hex, FPU_SIZE_UINT(fsw)       , AVX_OFFSET(fsw)       , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_ftw      , "ftag"        , NULL, Uint, Hex, FPU_SIZE_UINT(ftw)       , AVX_OFFSET(ftw)       , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_fop      , "fop"         , NULL, Uint, Hex, FPU_SIZE_UINT(fop)       , AVX_OFFSET(fop)       , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_ip       , "fioff"       , NULL, Uint, Hex, FPU_SIZE_UINT(ip)        , AVX_OFFSET(ip)        , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_cs       , "fiseg"       , NULL, Uint, Hex, FPU_SIZE_UINT(cs)        , AVX_OFFSET(cs)        , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_dp       , "fooff"       , NULL, Uint, Hex, FPU_SIZE_UINT(dp)        , AVX_OFFSET(dp)        , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_ds       , "foseg"       , NULL, Uint, Hex, FPU_SIZE_UINT(ds)        , AVX_OFFSET(ds)        , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_mxcsr    , "mxcsr"       , NULL, Uint, Hex, FPU_SIZE_UINT(mxcsr)     , AVX_OFFSET(mxcsr)     , -1, -1, -1, -1 },
+    { e_regSetFPU, fpu_mxcsrmask, "mxcsrmask"   , NULL, Uint, Hex, FPU_SIZE_UINT(mxcsrmask) , AVX_OFFSET(mxcsrmask) , -1, -1, -1, -1 },
+    
+    { e_regSetFPU, fpu_stmm0, "stmm0", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm0), AVX_OFFSET(stmm0), gcc_dwarf_stmm0, gcc_dwarf_stmm0, -1, gdb_stmm0 },
+    { e_regSetFPU, fpu_stmm1, "stmm1", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm1), AVX_OFFSET(stmm1), gcc_dwarf_stmm1, gcc_dwarf_stmm1, -1, gdb_stmm1 },
+    { e_regSetFPU, fpu_stmm2, "stmm2", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm2), AVX_OFFSET(stmm2), gcc_dwarf_stmm2, gcc_dwarf_stmm2, -1, gdb_stmm2 },
+    { e_regSetFPU, fpu_stmm3, "stmm3", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm3), AVX_OFFSET(stmm3), gcc_dwarf_stmm3, gcc_dwarf_stmm3, -1, gdb_stmm3 },
+    { e_regSetFPU, fpu_stmm4, "stmm4", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm4), AVX_OFFSET(stmm4), gcc_dwarf_stmm4, gcc_dwarf_stmm4, -1, gdb_stmm4 },
+    { e_regSetFPU, fpu_stmm5, "stmm5", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm5), AVX_OFFSET(stmm5), gcc_dwarf_stmm5, gcc_dwarf_stmm5, -1, gdb_stmm5 },
+    { e_regSetFPU, fpu_stmm6, "stmm6", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm6), AVX_OFFSET(stmm6), gcc_dwarf_stmm6, gcc_dwarf_stmm6, -1, gdb_stmm6 },
+    { e_regSetFPU, fpu_stmm7, "stmm7", NULL, Vector, VectorOfUInt8, FPU_SIZE_MMST(stmm7), AVX_OFFSET(stmm7), gcc_dwarf_stmm7, gcc_dwarf_stmm7, -1, gdb_stmm7 },
+    
+    { e_regSetFPU, fpu_xmm0 , "xmm0"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm0)   , AVX_OFFSET(xmm0) , gcc_dwarf_xmm0 , gcc_dwarf_xmm0 , -1, gdb_xmm0 },
+    { e_regSetFPU, fpu_xmm1 , "xmm1"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm1)   , AVX_OFFSET(xmm1) , gcc_dwarf_xmm1 , gcc_dwarf_xmm1 , -1, gdb_xmm1 },
+    { e_regSetFPU, fpu_xmm2 , "xmm2"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm2)   , AVX_OFFSET(xmm2) , gcc_dwarf_xmm2 , gcc_dwarf_xmm2 , -1, gdb_xmm2 },
+    { e_regSetFPU, fpu_xmm3 , "xmm3"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm3)   , AVX_OFFSET(xmm3) , gcc_dwarf_xmm3 , gcc_dwarf_xmm3 , -1, gdb_xmm3 },
+    { e_regSetFPU, fpu_xmm4 , "xmm4"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm4)   , AVX_OFFSET(xmm4) , gcc_dwarf_xmm4 , gcc_dwarf_xmm4 , -1, gdb_xmm4 },
+    { e_regSetFPU, fpu_xmm5 , "xmm5"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm5)   , AVX_OFFSET(xmm5) , gcc_dwarf_xmm5 , gcc_dwarf_xmm5 , -1, gdb_xmm5 },
+    { e_regSetFPU, fpu_xmm6 , "xmm6"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm6)   , AVX_OFFSET(xmm6) , gcc_dwarf_xmm6 , gcc_dwarf_xmm6 , -1, gdb_xmm6 },
+    { e_regSetFPU, fpu_xmm7 , "xmm7"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm7)   , AVX_OFFSET(xmm7) , gcc_dwarf_xmm7 , gcc_dwarf_xmm7 , -1, gdb_xmm7 },
+    { e_regSetFPU, fpu_xmm8 , "xmm8"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm8)   , AVX_OFFSET(xmm8) , gcc_dwarf_xmm8 , gcc_dwarf_xmm8 , -1, gdb_xmm8  },
+    { e_regSetFPU, fpu_xmm9 , "xmm9"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm9)   , AVX_OFFSET(xmm9) , gcc_dwarf_xmm9 , gcc_dwarf_xmm9 , -1, gdb_xmm9  },
+    { e_regSetFPU, fpu_xmm10, "xmm10"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm10)  , AVX_OFFSET(xmm10), gcc_dwarf_xmm10, gcc_dwarf_xmm10, -1, gdb_xmm10 },
+    { e_regSetFPU, fpu_xmm11, "xmm11"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm11)  , AVX_OFFSET(xmm11), gcc_dwarf_xmm11, gcc_dwarf_xmm11, -1, gdb_xmm11 },
+    { e_regSetFPU, fpu_xmm12, "xmm12"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm12)  , AVX_OFFSET(xmm12), gcc_dwarf_xmm12, gcc_dwarf_xmm12, -1, gdb_xmm12 },
+    { e_regSetFPU, fpu_xmm13, "xmm13"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm13)  , AVX_OFFSET(xmm13), gcc_dwarf_xmm13, gcc_dwarf_xmm13, -1, gdb_xmm13 },
+    { e_regSetFPU, fpu_xmm14, "xmm14"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm14)  , AVX_OFFSET(xmm14), gcc_dwarf_xmm14, gcc_dwarf_xmm14, -1, gdb_xmm14 },
+    { e_regSetFPU, fpu_xmm15, "xmm15"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_XMM(xmm15)  , AVX_OFFSET(xmm15), gcc_dwarf_xmm15, gcc_dwarf_xmm15, -1, gdb_xmm15 },
+
+    { e_regSetFPU, fpu_ymm0 , "ymm0"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm0)   , AVX_OFFSET_YMM(0) , gcc_dwarf_ymm0 , gcc_dwarf_ymm0 , -1, gdb_ymm0 },
+    { e_regSetFPU, fpu_ymm1 , "ymm1"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm1)   , AVX_OFFSET_YMM(1) , gcc_dwarf_ymm1 , gcc_dwarf_ymm1 , -1, gdb_ymm1 },
+    { e_regSetFPU, fpu_ymm2 , "ymm2"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm2)   , AVX_OFFSET_YMM(2) , gcc_dwarf_ymm2 , gcc_dwarf_ymm2 , -1, gdb_ymm2 },
+    { e_regSetFPU, fpu_ymm3 , "ymm3"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm3)   , AVX_OFFSET_YMM(3) , gcc_dwarf_ymm3 , gcc_dwarf_ymm3 , -1, gdb_ymm3 },
+    { e_regSetFPU, fpu_ymm4 , "ymm4"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm4)   , AVX_OFFSET_YMM(4) , gcc_dwarf_ymm4 , gcc_dwarf_ymm4 , -1, gdb_ymm4 },
+    { e_regSetFPU, fpu_ymm5 , "ymm5"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm5)   , AVX_OFFSET_YMM(5) , gcc_dwarf_ymm5 , gcc_dwarf_ymm5 , -1, gdb_ymm5 },
+    { e_regSetFPU, fpu_ymm6 , "ymm6"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm6)   , AVX_OFFSET_YMM(6) , gcc_dwarf_ymm6 , gcc_dwarf_ymm6 , -1, gdb_ymm6 },
+    { e_regSetFPU, fpu_ymm7 , "ymm7"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm7)   , AVX_OFFSET_YMM(7) , gcc_dwarf_ymm7 , gcc_dwarf_ymm7 , -1, gdb_ymm7 },
+    { e_regSetFPU, fpu_ymm8 , "ymm8"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm8)   , AVX_OFFSET_YMM(8) , gcc_dwarf_ymm8 , gcc_dwarf_ymm8 , -1, gdb_ymm8  },
+    { e_regSetFPU, fpu_ymm9 , "ymm9"    , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm9)   , AVX_OFFSET_YMM(9) , gcc_dwarf_ymm9 , gcc_dwarf_ymm9 , -1, gdb_ymm9  },
+    { e_regSetFPU, fpu_ymm10, "ymm10"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm10)  , AVX_OFFSET_YMM(10), gcc_dwarf_ymm10, gcc_dwarf_ymm10, -1, gdb_ymm10 },
+    { e_regSetFPU, fpu_ymm11, "ymm11"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm11)  , AVX_OFFSET_YMM(11), gcc_dwarf_ymm11, gcc_dwarf_ymm11, -1, gdb_ymm11 },
+    { e_regSetFPU, fpu_ymm12, "ymm12"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm12)  , AVX_OFFSET_YMM(12), gcc_dwarf_ymm12, gcc_dwarf_ymm12, -1, gdb_ymm12 },
+    { e_regSetFPU, fpu_ymm13, "ymm13"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm13)  , AVX_OFFSET_YMM(13), gcc_dwarf_ymm13, gcc_dwarf_ymm13, -1, gdb_ymm13 },
+    { e_regSetFPU, fpu_ymm14, "ymm14"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm14)  , AVX_OFFSET_YMM(14), gcc_dwarf_ymm14, gcc_dwarf_ymm14, -1, gdb_ymm14 },
+    { e_regSetFPU, fpu_ymm15, "ymm15"   , NULL, Vector, VectorOfUInt8, FPU_SIZE_YMM(ymm15)  , AVX_OFFSET_YMM(15), gcc_dwarf_ymm15, gcc_dwarf_ymm15, -1, gdb_ymm15 }
+};
+
 // Exception registers
 
 const DNBRegisterInfo
@@ -686,9 +959,11 @@
 
 // Number of registers in each register set
 const size_t DNBArchImplX86_64::k_num_gpr_registers = sizeof(g_gpr_registers)/sizeof(DNBRegisterInfo);
-const size_t DNBArchImplX86_64::k_num_fpu_registers = sizeof(g_fpu_registers)/sizeof(DNBRegisterInfo);
+const size_t DNBArchImplX86_64::k_num_fpu_registers_no_avx = sizeof(g_fpu_registers_no_avx)/sizeof(DNBRegisterInfo);
+const size_t DNBArchImplX86_64::k_num_fpu_registers_avx = sizeof(g_fpu_registers_avx)/sizeof(DNBRegisterInfo);
 const size_t DNBArchImplX86_64::k_num_exc_registers = sizeof(g_exc_registers)/sizeof(DNBRegisterInfo);
-const size_t DNBArchImplX86_64::k_num_all_registers = k_num_gpr_registers + k_num_fpu_registers + k_num_exc_registers;
+const size_t DNBArchImplX86_64::k_num_all_registers_no_avx = k_num_gpr_registers + k_num_fpu_registers_no_avx + k_num_exc_registers;
+const size_t DNBArchImplX86_64::k_num_all_registers_avx = k_num_gpr_registers + k_num_fpu_registers_avx + k_num_exc_registers;
 
 //----------------------------------------------------------------------
 // Register set definitions. The first definitions at register set index
@@ -696,15 +971,25 @@
 // register information for the all register set need not be filled in.
 //----------------------------------------------------------------------
 const DNBRegisterSetInfo
-DNBArchImplX86_64::g_reg_sets[] =
+DNBArchImplX86_64::g_reg_sets_no_avx[] =
+{
+    { "x86_64 Registers",           NULL,               k_num_all_registers_no_avx },
+    { "General Purpose Registers",  g_gpr_registers,    k_num_gpr_registers },
+    { "Floating Point Registers",   g_fpu_registers_no_avx, k_num_fpu_registers_no_avx },
+    { "Exception State Registers",  g_exc_registers,    k_num_exc_registers }
+};
+
+const DNBRegisterSetInfo
+DNBArchImplX86_64::g_reg_sets_avx[] =
 {
-    { "x86_64 Registers",           NULL,               k_num_all_registers },
+    { "x86_64 Registers",           NULL,               k_num_all_registers_avx },
     { "General Purpose Registers",  g_gpr_registers,    k_num_gpr_registers },
-    { "Floating Point Registers",   g_fpu_registers,    k_num_fpu_registers },
+    { "Floating Point Registers",   g_fpu_registers_avx, k_num_fpu_registers_avx },
     { "Exception State Registers",  g_exc_registers,    k_num_exc_registers }
 };
+
 // Total number of register sets for this architecture
-const size_t DNBArchImplX86_64::k_num_register_sets = sizeof(g_reg_sets)/sizeof(DNBRegisterSetInfo);
+const size_t DNBArchImplX86_64::k_num_register_sets = sizeof(g_reg_sets_avx)/sizeof(DNBRegisterSetInfo);
 
 
 DNBArchProtocol *
@@ -726,7 +1011,11 @@
 DNBArchImplX86_64::GetRegisterSetInfo(nub_size_t *num_reg_sets)
 {
     *num_reg_sets = k_num_register_sets;
-    return g_reg_sets;
+    
+    if (HasAVX() || FORCE_AVX_REGS)
+        return g_reg_sets_avx;
+    else
+        return g_reg_sets_no_avx;
 }
 
 void
@@ -795,58 +1084,127 @@
                 break;
                 
             case e_regSetFPU:
-                switch (reg)
-            {
-                case fpu_fcw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.__fpu_fcw));    return true;
-                case fpu_fsw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.__fpu_fsw));    return true;
-                case fpu_ftw:       value->value.uint8  = m_state.context.fpu.__fpu_ftw;                      return true;
-                case fpu_fop:       value->value.uint16 = m_state.context.fpu.__fpu_fop;                      return true;
-                case fpu_ip:        value->value.uint32 = m_state.context.fpu.__fpu_ip;                       return true;
-                case fpu_cs:        value->value.uint16 = m_state.context.fpu.__fpu_cs;                       return true;
-                case fpu_dp:        value->value.uint32 = m_state.context.fpu.__fpu_dp;                       return true;
-                case fpu_ds:        value->value.uint16 = m_state.context.fpu.__fpu_ds;                       return true;
-                case fpu_mxcsr:     value->value.uint32 = m_state.context.fpu.__fpu_mxcsr;                    return true;
-                case fpu_mxcsrmask: value->value.uint32 = m_state.context.fpu.__fpu_mxcsrmask;                return true;
-                    
-                case fpu_stmm0:
-                case fpu_stmm1:
-                case fpu_stmm2:
-                case fpu_stmm3:
-                case fpu_stmm4:
-                case fpu_stmm5:
-                case fpu_stmm6:
-                case fpu_stmm7:
-                    memcpy(&value->value.uint8, &m_state.context.fpu.__fpu_stmm0 + (reg - fpu_stmm0), 10);
-                    return true;
-                    
-                case fpu_xmm0:
-                case fpu_xmm1:
-                case fpu_xmm2:
-                case fpu_xmm3:
-                case fpu_xmm4:
-                case fpu_xmm5:
-                case fpu_xmm6:
-                case fpu_xmm7:
-                case fpu_xmm8:
-                case fpu_xmm9:
-                case fpu_xmm10:
-                case fpu_xmm11:
-                case fpu_xmm12:
-                case fpu_xmm13:
-                case fpu_xmm14:
-                case fpu_xmm15:
-                    memcpy(&value->value.uint8, &m_state.context.fpu.__fpu_xmm0 + (reg - fpu_xmm0), 16);
-                    return true;
-            }
+                if (HasAVX() || FORCE_AVX_REGS)
+                {
+                    switch (reg)
+                    {
+                    case fpu_fcw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw));    return true;
+                    case fpu_fsw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw));    return true;
+                    case fpu_ftw:       value->value.uint8  = m_state.context.fpu.avx.__fpu_ftw;                      return true;
+                    case fpu_fop:       value->value.uint16 = m_state.context.fpu.avx.__fpu_fop;                      return true;
+                    case fpu_ip:        value->value.uint32 = m_state.context.fpu.avx.__fpu_ip;                       return true;
+                    case fpu_cs:        value->value.uint16 = m_state.context.fpu.avx.__fpu_cs;                       return true;
+                    case fpu_dp:        value->value.uint32 = m_state.context.fpu.avx.__fpu_dp;                       return true;
+                    case fpu_ds:        value->value.uint16 = m_state.context.fpu.avx.__fpu_ds;                       return true;
+                    case fpu_mxcsr:     value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsr;                    return true;
+                    case fpu_mxcsrmask: value->value.uint32 = m_state.context.fpu.avx.__fpu_mxcsrmask;                return true;
+                        
+                    case fpu_stmm0:
+                    case fpu_stmm1:
+                    case fpu_stmm2:
+                    case fpu_stmm3:
+                    case fpu_stmm4:
+                    case fpu_stmm5:
+                    case fpu_stmm6:
+                    case fpu_stmm7:
+                        memcpy(&value->value.uint8, &m_state.context.fpu.avx.__fpu_stmm0 + (reg - fpu_stmm0), 10);
+                        return true;
+                        
+                    case fpu_xmm0:
+                    case fpu_xmm1:
+                    case fpu_xmm2:
+                    case fpu_xmm3:
+                    case fpu_xmm4:
+                    case fpu_xmm5:
+                    case fpu_xmm6:
+                    case fpu_xmm7:
+                    case fpu_xmm8:
+                    case fpu_xmm9:
+                    case fpu_xmm10:
+                    case fpu_xmm11:
+                    case fpu_xmm12:
+                    case fpu_xmm13:
+                    case fpu_xmm14:
+                    case fpu_xmm15:
+                        memcpy(&value->value.uint8, &m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_xmm0), 16);
+                        return true;
+                            
+                    case fpu_ymm0:
+                    case fpu_ymm1:
+                    case fpu_ymm2:
+                    case fpu_ymm3:
+                    case fpu_ymm4:
+                    case fpu_ymm5:
+                    case fpu_ymm6:
+                    case fpu_ymm7:
+                    case fpu_ymm8:
+                    case fpu_ymm9:
+                    case fpu_ymm10:
+                    case fpu_ymm11:
+                    case fpu_ymm12:
+                    case fpu_ymm13:
+                    case fpu_ymm14:
+                    case fpu_ymm15:
+                        memcpy(&value->value.uint8, &m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_ymm0), 16);
+                        memcpy((&value->value.uint8) + 16, &m_state.context.fpu.avx.__fpu_ymmh0 + (reg - fpu_ymm0), 16);
+                        return true;
+                    }
+                }
+                else
+                {
+                    switch (reg)
+                    {
+                        case fpu_fcw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw));    return true;
+                        case fpu_fsw:       value->value.uint16 = *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw));    return true;
+                        case fpu_ftw:       value->value.uint8  = m_state.context.fpu.no_avx.__fpu_ftw;                      return true;
+                        case fpu_fop:       value->value.uint16 = m_state.context.fpu.no_avx.__fpu_fop;                      return true;
+                        case fpu_ip:        value->value.uint32 = m_state.context.fpu.no_avx.__fpu_ip;                       return true;
+                        case fpu_cs:        value->value.uint16 = m_state.context.fpu.no_avx.__fpu_cs;                       return true;
+                        case fpu_dp:        value->value.uint32 = m_state.context.fpu.no_avx.__fpu_dp;                       return true;
+                        case fpu_ds:        value->value.uint16 = m_state.context.fpu.no_avx.__fpu_ds;                       return true;
+                        case fpu_mxcsr:     value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsr;                    return true;
+                        case fpu_mxcsrmask: value->value.uint32 = m_state.context.fpu.no_avx.__fpu_mxcsrmask;                return true;
+                            
+                        case fpu_stmm0:
+                        case fpu_stmm1:
+                        case fpu_stmm2:
+                        case fpu_stmm3:
+                        case fpu_stmm4:
+                        case fpu_stmm5:
+                        case fpu_stmm6:
+                        case fpu_stmm7:
+                            memcpy(&value->value.uint8, &m_state.context.fpu.no_avx.__fpu_stmm0 + (reg - fpu_stmm0), 10);
+                            return true;
+                            
+                        case fpu_xmm0:
+                        case fpu_xmm1:
+                        case fpu_xmm2:
+                        case fpu_xmm3:
+                        case fpu_xmm4:
+                        case fpu_xmm5:
+                        case fpu_xmm6:
+                        case fpu_xmm7:
+                        case fpu_xmm8:
+                        case fpu_xmm9:
+                        case fpu_xmm10:
+                        case fpu_xmm11:
+                        case fpu_xmm12:
+                        case fpu_xmm13:
+                        case fpu_xmm14:
+                        case fpu_xmm15:
+                            memcpy(&value->value.uint8, &m_state.context.fpu.no_avx.__fpu_xmm0 + (reg - fpu_xmm0), 16);
+                            return true;
+                    }
+                }
                 break;
                 
             case e_regSetEXC:
                 switch (reg)
-            {
+                {
                 case exc_trapno:    value->value.uint32 = m_state.context.exc.__trapno; return true;
                 case exc_err:       value->value.uint32 = m_state.context.exc.__err; return true;
                 case exc_faultvaddr:value->value.uint64 = m_state.context.exc.__faultvaddr; return true;
-            }
+                }
                 break;
         }
     }
@@ -905,51 +1263,122 @@
                 break;
                 
             case e_regSetFPU:
-                switch (reg)
-            {
-                case fpu_fcw:       *((uint16_t *)(&m_state.context.fpu.__fpu_fcw)) = value->value.uint16;    success = true; break;
-                case fpu_fsw:       *((uint16_t *)(&m_state.context.fpu.__fpu_fsw)) = value->value.uint16;    success = true; break;
-                case fpu_ftw:       m_state.context.fpu.__fpu_ftw = value->value.uint8;                       success = true; break;
-                case fpu_fop:       m_state.context.fpu.__fpu_fop = value->value.uint16;                      success = true; break;
-                case fpu_ip:        m_state.context.fpu.__fpu_ip = value->value.uint32;                       success = true; break;
-                case fpu_cs:        m_state.context.fpu.__fpu_cs = value->value.uint16;                       success = true; break;
-                case fpu_dp:        m_state.context.fpu.__fpu_dp = value->value.uint32;                       success = true; break;
-                case fpu_ds:        m_state.context.fpu.__fpu_ds = value->value.uint16;                       success = true; break;
-                case fpu_mxcsr:     m_state.context.fpu.__fpu_mxcsr = value->value.uint32;                    success = true; break;
-                case fpu_mxcsrmask: m_state.context.fpu.__fpu_mxcsrmask = value->value.uint32;                success = true; break;
-                    
-                case fpu_stmm0:
-                case fpu_stmm1:
-                case fpu_stmm2:
-                case fpu_stmm3:
-                case fpu_stmm4:
-                case fpu_stmm5:
-                case fpu_stmm6:
-                case fpu_stmm7:
-                    memcpy (&m_state.context.fpu.__fpu_stmm0 + (reg - fpu_stmm0), &value->value.uint8, 10);
-                    success = true;
-                    break;
+                if (HasAVX() || FORCE_AVX_REGS)
+                {
+                    switch (reg)
+                    {
+                    case fpu_fcw:       *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fcw)) = value->value.uint16;    success = true; break;
+                    case fpu_fsw:       *((uint16_t *)(&m_state.context.fpu.avx.__fpu_fsw)) = value->value.uint16;    success = true; break;
+                    case fpu_ftw:       m_state.context.fpu.avx.__fpu_ftw = value->value.uint8;                       success = true; break;
+                    case fpu_fop:       m_state.context.fpu.avx.__fpu_fop = value->value.uint16;                      success = true; break;
+                    case fpu_ip:        m_state.context.fpu.avx.__fpu_ip = value->value.uint32;                       success = true; break;
+                    case fpu_cs:        m_state.context.fpu.avx.__fpu_cs = value->value.uint16;                       success = true; break;
+                    case fpu_dp:        m_state.context.fpu.avx.__fpu_dp = value->value.uint32;                       success = true; break;
+                    case fpu_ds:        m_state.context.fpu.avx.__fpu_ds = value->value.uint16;                       success = true; break;
+                    case fpu_mxcsr:     m_state.context.fpu.avx.__fpu_mxcsr = value->value.uint32;                    success = true; break;
+                    case fpu_mxcsrmask: m_state.context.fpu.avx.__fpu_mxcsrmask = value->value.uint32;                success = true; break;
+                        
+                    case fpu_stmm0:
+                    case fpu_stmm1:
+                    case fpu_stmm2:
+                    case fpu_stmm3:
+                    case fpu_stmm4:
+                    case fpu_stmm5:
+                    case fpu_stmm6:
+                    case fpu_stmm7:
+                        memcpy (&m_state.context.fpu.avx.__fpu_stmm0 + (reg - fpu_stmm0), &value->value.uint8, 10);
+                        success = true;
+                        break;
+                        
+                    case fpu_xmm0:
+                    case fpu_xmm1:
+                    case fpu_xmm2:
+                    case fpu_xmm3:
+                    case fpu_xmm4:
+                    case fpu_xmm5:
+                    case fpu_xmm6:
+                    case fpu_xmm7:
+                    case fpu_xmm8:
+                    case fpu_xmm9:
+                    case fpu_xmm10:
+                    case fpu_xmm11:
+                    case fpu_xmm12:
+                    case fpu_xmm13:
+                    case fpu_xmm14:
+                    case fpu_xmm15:
+                        memcpy (&m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_xmm0), &value->value.uint8, 16);
+                        success = true;
+                        break;
                     
-                case fpu_xmm0:
-                case fpu_xmm1:
-                case fpu_xmm2:
-                case fpu_xmm3:
-                case fpu_xmm4:
-                case fpu_xmm5:
-                case fpu_xmm6:
-                case fpu_xmm7:
-                case fpu_xmm8:
-                case fpu_xmm9:
-                case fpu_xmm10:
-                case fpu_xmm11:
-                case fpu_xmm12:
-                case fpu_xmm13:
-                case fpu_xmm14:
-                case fpu_xmm15:
-                    memcpy (&m_state.context.fpu.__fpu_xmm0 + (reg - fpu_xmm0), &value->value.uint8, 16);
-                    success = true;
-                    break;
-            }
+                    case fpu_ymm0:
+                    case fpu_ymm1:
+                    case fpu_ymm2:
+                    case fpu_ymm3:
+                    case fpu_ymm4:
+                    case fpu_ymm5:
+                    case fpu_ymm6:
+                    case fpu_ymm7:
+                    case fpu_ymm8:
+                    case fpu_ymm9:
+                    case fpu_ymm10:
+                    case fpu_ymm11:
+                    case fpu_ymm12:
+                    case fpu_ymm13:
+                    case fpu_ymm14:
+                    case fpu_ymm15:
+                        memcpy(&m_state.context.fpu.avx.__fpu_xmm0 + (reg - fpu_ymm0), &value->value.uint8, 16);
+                        memcpy(&m_state.context.fpu.avx.__fpu_ymmh0 + (reg - fpu_ymm0), (&value->value.uint8) + 16, 16);
+                        return true;
+                    }
+                }
+                else
+                {
+                    switch (reg)
+                    {
+                    case fpu_fcw:       *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fcw)) = value->value.uint16;    success = true; break;
+                    case fpu_fsw:       *((uint16_t *)(&m_state.context.fpu.no_avx.__fpu_fsw)) = value->value.uint16;    success = true; break;
+                    case fpu_ftw:       m_state.context.fpu.no_avx.__fpu_ftw = value->value.uint8;                       success = true; break;
+                    case fpu_fop:       m_state.context.fpu.no_avx.__fpu_fop = value->value.uint16;                      success = true; break;
+                    case fpu_ip:        m_state.context.fpu.no_avx.__fpu_ip = value->value.uint32;                       success = true; break;
+                    case fpu_cs:        m_state.context.fpu.no_avx.__fpu_cs = value->value.uint16;                       success = true; break;
+                    case fpu_dp:        m_state.context.fpu.no_avx.__fpu_dp = value->value.uint32;                       success = true; break;
+                    case fpu_ds:        m_state.context.fpu.no_avx.__fpu_ds = value->value.uint16;                       success = true; break;
+                    case fpu_mxcsr:     m_state.context.fpu.no_avx.__fpu_mxcsr = value->value.uint32;                    success = true; break;
+                    case fpu_mxcsrmask: m_state.context.fpu.no_avx.__fpu_mxcsrmask = value->value.uint32;                success = true; break;
+                        
+                    case fpu_stmm0:
+                    case fpu_stmm1:
+                    case fpu_stmm2:
+                    case fpu_stmm3:
+                    case fpu_stmm4:
+                    case fpu_stmm5:
+                    case fpu_stmm6:
+                    case fpu_stmm7:
+                        memcpy (&m_state.context.fpu.no_avx.__fpu_stmm0 + (reg - fpu_stmm0), &value->value.uint8, 10);
+                        success = true;
+                        break;
+                        
+                    case fpu_xmm0:
+                    case fpu_xmm1:
+                    case fpu_xmm2:
+                    case fpu_xmm3:
+                    case fpu_xmm4:
+                    case fpu_xmm5:
+                    case fpu_xmm6:
+                    case fpu_xmm7:
+                    case fpu_xmm8:
+                    case fpu_xmm9:
+                    case fpu_xmm10:
+                    case fpu_xmm11:
+                    case fpu_xmm12:
+                    case fpu_xmm13:
+                    case fpu_xmm14:
+                    case fpu_xmm15:
+                        memcpy (&m_state.context.fpu.no_avx.__fpu_xmm0 + (reg - fpu_xmm0), &value->value.uint8, 16);
+                        success = true;
+                        break;
+                    }
+                }
                 break;
                 
             case e_regSetEXC:

Modified: lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.h?rev=128111&r1=128110&r2=128111&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.h (original)
+++ lldb/trunk/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.h Tue Mar 22 16:45:30 2011
@@ -16,9 +16,7 @@
 
 #if defined (__i386__) || defined (__x86_64__)
 #include "DNBArch.h"
-#include <mach/mach_types.h>
-#include <mach/thread_status.h>
-
+#include "MachRegisterStatesX86_64.h"
 
 class MachThread;
 
@@ -54,18 +52,23 @@
 protected:
     kern_return_t           EnableHardwareSingleStep (bool enable);
 
-    typedef x86_thread_state64_t GPR;
-    typedef x86_float_state64_t FPU;
-    typedef x86_exception_state64_t EXC;
+    typedef __x86_64_thread_state_t GPR;
+    typedef __x86_64_float_state_t FPU;
+    typedef __x86_64_exception_state_t EXC;
+    typedef __x86_64_avx_state_t AVX;
 
     static const DNBRegisterInfo g_gpr_registers[];
-    static const DNBRegisterInfo g_fpu_registers[];
+    static const DNBRegisterInfo g_fpu_registers_no_avx[];
+    static const DNBRegisterInfo g_fpu_registers_avx[];
     static const DNBRegisterInfo g_exc_registers[];
-    static const DNBRegisterSetInfo g_reg_sets[];
+    static const DNBRegisterSetInfo g_reg_sets_no_avx[];
+    static const DNBRegisterSetInfo g_reg_sets_avx[];
     static const size_t k_num_gpr_registers;
-    static const size_t k_num_fpu_registers;
+    static const size_t k_num_fpu_registers_no_avx;
+    static const size_t k_num_fpu_registers_avx;
     static const size_t k_num_exc_registers;
-    static const size_t k_num_all_registers;
+    static const size_t k_num_all_registers_no_avx;
+    static const size_t k_num_all_registers_avx;
     static const size_t k_num_register_sets;
 
     typedef enum RegisterSetTag
@@ -77,6 +80,13 @@
         kNumRegisterSets
     } RegisterSet;
 
+    typedef enum RegisterSetWordSizeTag
+    {
+        e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int),
+        e_regSetWordSizeFPR = sizeof(FPU) / sizeof(int),
+        e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int),
+        e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int)
+    } RegisterSetWordSize;
 
     enum
     {
@@ -87,9 +97,12 @@
 
     struct Context
     {
-        GPR gpr;
-        FPU fpu;
-        EXC exc;
+        __x86_64_thread_state_t     gpr;
+        union {
+            __x86_64_float_state_t  no_avx;
+            __x86_64_avx_state_t    avx;
+        } fpu;
+        __x86_64_exception_state_t  exc;
     };
 
     struct State
@@ -191,9 +204,24 @@
 
     static const DNBRegisterSetInfo *
     GetRegisterSetInfo(nub_size_t *num_reg_sets);
+    
+    static bool
+    HasAVX()
+    {
+        if (s_has_avx == kAVXUnknown)
+            s_has_avx = kAVXNotPresent;
+        
+        return (s_has_avx == kAVXPresent);
+    }
 
     MachThread *m_thread;
     State        m_state;
+    
+    static enum AVXPresence {
+        kAVXPresent,
+        kAVXNotPresent,
+        kAVXUnknown
+    } s_has_avx;
 };
 
 #endif    // #if defined (__i386__) || defined (__x86_64__)

Added: lldb/trunk/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h?rev=128111&view=auto
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h (added)
+++ lldb/trunk/tools/debugserver/source/MacOSX/x86_64/MachRegisterStatesX86_64.h Tue Mar 22 16:45:30 2011
@@ -0,0 +1,197 @@
+//===-- MachRegisterStatesX86_64.h --------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  Created by Sean Callanan on 3/16/11.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __MachRegisterStatesX86_64_h__
+#define __MachRegisterStatesX86_64_h__
+
+#include <inttypes.h>
+
+#define __x86_64_THREAD_STATE       4
+#define __x86_64_FLOAT_STATE        5
+#define __x86_64_EXCEPTION_STATE    6
+#define __x86_64_AVX_STATE          17
+
+typedef struct {
+    uint64_t    __rax;
+    uint64_t    __rbx;
+    uint64_t    __rcx;
+    uint64_t    __rdx;
+    uint64_t    __rdi;
+    uint64_t    __rsi;
+    uint64_t    __rbp;
+    uint64_t    __rsp;
+    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    __rip;
+    uint64_t    __rflags;
+    uint64_t    __cs;
+    uint64_t    __fs;
+    uint64_t    __gs;
+} __x86_64_thread_state_t;
+
+typedef struct {
+    uint16_t    __invalid   : 1;
+    uint16_t    __denorm    : 1;
+    uint16_t    __zdiv      : 1;
+    uint16_t    __ovrfl     : 1;
+    uint16_t    __undfl     : 1;
+    uint16_t    __precis    : 1;
+    uint16_t    __PAD1      : 2;
+    uint16_t    __pc        : 2;
+    uint16_t    __rc        : 2;
+    uint16_t    __PAD2      : 1;
+    uint16_t    __PAD3      : 3;
+} __x86_64_fp_control_t;
+
+typedef struct {
+    uint16_t    __invalid   : 1;
+    uint16_t    __denorm    : 1;
+    uint16_t    __zdiv      : 1;
+    uint16_t    __ovrfl     : 1;
+    uint16_t    __undfl     : 1;
+    uint16_t    __precis    : 1;
+    uint16_t    __stkflt    : 1;
+    uint16_t    __errsumm   : 1;
+    uint16_t    __c0        : 1;
+    uint16_t    __c1        : 1;
+    uint16_t    __c2        : 1;
+    uint16_t    __tos       : 3;
+    uint16_t    __c3        : 1;
+    uint16_t    __busy      : 1;
+} __x86_64_fp_status_t;
+
+typedef struct {
+    uint8_t     __mmst_reg[10];
+    uint8_t     __mmst_rsrv[6];
+} __x86_64_mmst_reg;
+
+typedef struct {
+    uint8_t     __xmm_reg[16];
+} __x86_64_xmm_reg;
+
+typedef struct {
+    int32_t                 __fpu_reserved[2];
+    __x86_64_fp_control_t   __fpu_fcw;
+    __x86_64_fp_status_t    __fpu_fsw;
+    uint8_t                 __fpu_ftw;
+    uint8_t                 __fpu_rsrv1;
+    uint16_t                __fpu_fop;
+    uint32_t                __fpu_ip;
+    uint16_t                __fpu_cs;
+    uint16_t                __fpu_rsrv2;
+    uint32_t                __fpu_dp;
+    uint16_t                __fpu_ds;
+    uint16_t                __fpu_rsrv3;
+    uint32_t                __fpu_mxcsr;
+    uint32_t                __fpu_mxcsrmask;
+    __x86_64_mmst_reg       __fpu_stmm0;
+    __x86_64_mmst_reg       __fpu_stmm1;
+    __x86_64_mmst_reg       __fpu_stmm2;
+    __x86_64_mmst_reg       __fpu_stmm3;
+    __x86_64_mmst_reg       __fpu_stmm4;
+    __x86_64_mmst_reg       __fpu_stmm5;
+    __x86_64_mmst_reg       __fpu_stmm6;
+    __x86_64_mmst_reg       __fpu_stmm7;
+    __x86_64_xmm_reg        __fpu_xmm0;
+    __x86_64_xmm_reg        __fpu_xmm1;
+    __x86_64_xmm_reg        __fpu_xmm2;
+    __x86_64_xmm_reg        __fpu_xmm3;
+    __x86_64_xmm_reg        __fpu_xmm4;
+    __x86_64_xmm_reg        __fpu_xmm5;
+    __x86_64_xmm_reg        __fpu_xmm6;
+    __x86_64_xmm_reg        __fpu_xmm7;
+    __x86_64_xmm_reg        __fpu_xmm8;
+    __x86_64_xmm_reg        __fpu_xmm9;
+    __x86_64_xmm_reg        __fpu_xmm10;
+    __x86_64_xmm_reg        __fpu_xmm11;
+    __x86_64_xmm_reg        __fpu_xmm12;
+    __x86_64_xmm_reg        __fpu_xmm13;
+    __x86_64_xmm_reg        __fpu_xmm14;
+    __x86_64_xmm_reg        __fpu_xmm15;
+    uint8_t                 __fpu_rsrv4[6*16];
+    int32_t                 __fpu_reserved1;
+} __x86_64_float_state_t;
+
+typedef struct {
+    uint32_t                __fpu_reserved[2];
+    __x86_64_fp_control_t   __fpu_fcw;
+    __x86_64_fp_status_t    __fpu_fsw;
+    uint8_t                 __fpu_ftw;
+    uint8_t                 __fpu_rsrv1;
+    uint16_t                __fpu_fop;
+    uint32_t                __fpu_ip;
+    uint16_t                __fpu_cs;
+    uint16_t                __fpu_rsrv2;
+    uint32_t                __fpu_dp;
+    uint16_t                __fpu_ds;
+    uint16_t                __fpu_rsrv3;
+    uint32_t                __fpu_mxcsr;
+    uint32_t                __fpu_mxcsrmask;
+    __x86_64_mmst_reg       __fpu_stmm0;
+    __x86_64_mmst_reg       __fpu_stmm1;
+    __x86_64_mmst_reg       __fpu_stmm2;
+    __x86_64_mmst_reg       __fpu_stmm3;
+    __x86_64_mmst_reg       __fpu_stmm4;
+    __x86_64_mmst_reg       __fpu_stmm5;
+    __x86_64_mmst_reg       __fpu_stmm6;
+    __x86_64_mmst_reg       __fpu_stmm7;
+    __x86_64_xmm_reg        __fpu_xmm0;
+    __x86_64_xmm_reg        __fpu_xmm1;
+    __x86_64_xmm_reg        __fpu_xmm2;
+    __x86_64_xmm_reg        __fpu_xmm3;
+    __x86_64_xmm_reg        __fpu_xmm4;
+    __x86_64_xmm_reg        __fpu_xmm5;
+    __x86_64_xmm_reg        __fpu_xmm6;
+    __x86_64_xmm_reg        __fpu_xmm7;
+    __x86_64_xmm_reg        __fpu_xmm8;
+    __x86_64_xmm_reg        __fpu_xmm9;
+    __x86_64_xmm_reg        __fpu_xmm10;
+    __x86_64_xmm_reg        __fpu_xmm11;
+    __x86_64_xmm_reg        __fpu_xmm12;
+    __x86_64_xmm_reg        __fpu_xmm13;
+    __x86_64_xmm_reg        __fpu_xmm14;
+    __x86_64_xmm_reg        __fpu_xmm15;
+    uint8_t                 __fpu_rsrv4[6*16];
+    uint32_t                __fpu_reserved1;
+    uint8_t                 __avx_reserved1[64];
+    __x86_64_xmm_reg        __fpu_ymmh0;
+    __x86_64_xmm_reg        __fpu_ymmh1;
+    __x86_64_xmm_reg        __fpu_ymmh2;
+    __x86_64_xmm_reg        __fpu_ymmh3;
+    __x86_64_xmm_reg        __fpu_ymmh4;
+    __x86_64_xmm_reg        __fpu_ymmh5;
+    __x86_64_xmm_reg        __fpu_ymmh6;
+    __x86_64_xmm_reg        __fpu_ymmh7;
+    __x86_64_xmm_reg        __fpu_ymmh8;
+    __x86_64_xmm_reg        __fpu_ymmh9;
+    __x86_64_xmm_reg        __fpu_ymmh10;
+    __x86_64_xmm_reg        __fpu_ymmh11;
+    __x86_64_xmm_reg        __fpu_ymmh12;
+    __x86_64_xmm_reg        __fpu_ymmh13;
+    __x86_64_xmm_reg        __fpu_ymmh14;
+    __x86_64_xmm_reg        __fpu_ymmh15;
+} __x86_64_avx_state_t;
+
+typedef struct {
+    uint32_t    __trapno;
+    uint32_t    __err;
+    uint64_t    __faultvaddr;
+} __x86_64_exception_state_t;
+
+#endif





More information about the lldb-commits mailing list