1061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton//===-- RegisterValue.cpp ----------------------------------------*- C++ -*-===//
2061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton//
3061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton//                     The LLVM Compiler Infrastructure
4061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton//
5061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton// This file is distributed under the University of Illinois Open Source
6061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton// License. See LICENSE.TXT for details.
7061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton//
8061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton//===----------------------------------------------------------------------===//
9061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
10061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
11061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
12061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton// C Includes
13061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton// C++ Includes
14061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton// Other libraries and framework includes
15061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton// Project includes
16061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/DataExtractor.h"
17061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/Error.h"
18061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/Scalar.h"
19061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/Stream.h"
209d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen#include "lldb/Core/StreamString.h"
21061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Interpreter/Args.h"
22061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonusing namespace lldb;
24061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonusing namespace lldb_private;
25061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
26061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
27061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
28997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg ClaytonRegisterValue::Dump (Stream *s,
29997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                     const RegisterInfo *reg_info,
30997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                     bool prefix_with_name,
31997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                     bool prefix_with_alt_name,
329d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen                     Format format,
339d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen                     uint32_t reg_name_right_align_at) const
34061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
35061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    DataExtractor data;
36061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (GetData (data))
37061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
38997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        bool name_printed = false;
399d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        // For simplicity, alignment of the register name printing applies only
409d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        // in the most common case where:
419d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        //
429d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        //     prefix_with_name^prefix_with_alt_name is true
439d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        //
449d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        StreamString format_string;
459d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        if (reg_name_right_align_at && (prefix_with_name^prefix_with_alt_name))
469d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen            format_string.Printf("%%%us", reg_name_right_align_at);
479d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        else
489d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen            format_string.Printf("%%s");
499d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen        const char *fmt = format_string.GetData();
50997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        if (prefix_with_name)
51997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        {
52997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            if (reg_info->name)
53997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            {
549d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen                s->Printf (fmt, reg_info->name);
55997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                name_printed = true;
56997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            }
57997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            else if (reg_info->alt_name)
58997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            {
599d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen                s->Printf (fmt, reg_info->alt_name);
60997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                prefix_with_alt_name = false;
61997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                name_printed = true;
62997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            }
63997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        }
64997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        if (prefix_with_alt_name)
65997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        {
66997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            if (name_printed)
67997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                s->PutChar ('/');
68997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            if (reg_info->alt_name)
69997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            {
709d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen                s->Printf (fmt, reg_info->alt_name);
71997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                name_printed = true;
72997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            }
73997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            else if (!name_printed)
74997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            {
75997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                // No alternate name but we were asked to display a name, so show the main name
769d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen                s->Printf (fmt, reg_info->name);
77997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton                name_printed = true;
78997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            }
79997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        }
80997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton        if (name_printed)
81997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton            s->PutCString (" = ");
82997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton
83061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (format == eFormatDefault)
84061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            format = reg_info->format;
85061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
86061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        data.Dump (s,
87061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   0,                       // Offset in "data"
88061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   format,                  // Format to use when dumping
89b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                   reg_info->byte_size,     // item_byte_size
90061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   1,                       // item_count
91061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   UINT32_MAX,              // num_per_line
92061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   LLDB_INVALID_ADDRESS,    // base_addr
93061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   0,                       // item_bit_size
94061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   0);                      // item_bit_offset
95061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return true;
96061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
97061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return false;
98061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
99061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
100061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
101061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
102061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetData (DataExtractor &data) const
103061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
104061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return data.SetData(GetBytes(), GetByteSize(), GetByteOrder()) > 0;
105061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
106061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
107061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
108061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonuint32_t
109061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsMemoryData (const RegisterInfo *reg_info,
110061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                void *dst,
111061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                uint32_t dst_len,
112061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                lldb::ByteOrder dst_byte_order,
113061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                Error &error) const
114061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
115061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (reg_info == NULL)
116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
117061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("invalid register info argument.");
118061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
119061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
120061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
121061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // ReadRegister should have already been called on tgus object prior to
122061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // calling this.
123061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (GetType() == eTypeInvalid)
124061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
125061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        // No value has been read into this object...
126061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorStringWithFormat("invalid register value type for register %s", reg_info->name);
127061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
128061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
129061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
130061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (dst_len > kMaxRegisterByteSize)
131061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
132061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("destination is too big");
133061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
134061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
135061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
136061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const uint32_t src_len = reg_info->byte_size;
137061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
138061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Extract the register data into a data extractor
139061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    DataExtractor reg_data;
140061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (!GetData(reg_data))
141061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
142061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("invalid register value to copy into");
143061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
144061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
145061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
146061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Prepare a memory buffer that contains some or all of the register value
147061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const uint32_t bytes_copied = reg_data.CopyByteOrderedData (0,                  // src offset
148061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                src_len,            // src length
149061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                dst,                // dst buffer
150061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                dst_len,            // dst length
151061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                dst_byte_order);    // dst byte order
152061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (bytes_copied == 0)
153061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorStringWithFormat("failed to copy data for register write of %s", reg_info->name);
154061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
155061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return bytes_copied;
156061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
157061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
158061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonuint32_t
159061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::SetFromMemoryData (const RegisterInfo *reg_info,
160061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                  const void *src,
161061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                  uint32_t src_len,
162061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                  lldb::ByteOrder src_byte_order,
163061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                  Error &error)
164061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
165061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (reg_info == NULL)
166061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
167061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("invalid register info argument.");
168061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
169061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
170061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
171061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Moving from addr into a register
172061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //
173061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Case 1: src_len == dst_len
174061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //
175061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //   |AABBCCDD| Address contents
176061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //   |AABBCCDD| Register contents
177061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //
178061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Case 2: src_len > dst_len
179061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //
180061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //   Error!  (The register should always be big enough to hold the data)
181061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //
182061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Case 3: src_len < dst_len
183061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //
184061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //   |AABB| Address contents
185061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //   |AABB0000| Register contents [on little-endian hardware]
186061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //   |0000AABB| Register contents [on big-endian hardware]
187061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (src_len > kMaxRegisterByteSize)
188061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
189061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorStringWithFormat ("register buffer is too small to receive %u bytes of data.", src_len);
190061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
191061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
192061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
193061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const uint32_t dst_len = reg_info->byte_size;
194061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
195061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (src_len > dst_len)
196061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
197061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorStringWithFormat("%u bytes is too big to store in register %s (%u bytes)", src_len, reg_info->name, dst_len);
198061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
199061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
200061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
201061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Use a data extractor to correctly copy and pad the bytes read into the
202061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // register value
203061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    DataExtractor src_data (src, src_len, src_byte_order, 4);
204061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
205061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Given the register info, set the value type of this RegisterValue object
206061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SetType (reg_info);
207061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // And make sure we were able to figure out what that register value was
208061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue::Type value_type = GetType();
209061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (value_type == eTypeInvalid)
210061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
211061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        // No value has been read into this object...
212061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorStringWithFormat("invalid register value type for register %s", reg_info->name);
213061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return 0;
214061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
215061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else if (value_type == eTypeBytes)
216061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
217061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_data.buffer.byte_order = src_byte_order;
2181bc1caddf53e812ba87411f76fc15b7971930c22Johnny Chen        // Make sure to set the buffer length of the destination buffer to avoid
2191bc1caddf53e812ba87411f76fc15b7971930c22Johnny Chen        // problems due to uninitalized variables.
2201bc1caddf53e812ba87411f76fc15b7971930c22Johnny Chen        m_data.buffer.length = src_len;
221061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
222061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
223061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const uint32_t bytes_copied = src_data.CopyByteOrderedData (0,               // src offset
224061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                src_len,         // src length
225061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                GetBytes(),      // dst buffer
226061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                GetByteSize(),   // dst length
227061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                GetByteOrder()); // dst byte order
228061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (bytes_copied == 0)
229061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorStringWithFormat("failed to copy data for register write of %s", reg_info->name);
230061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
231061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return bytes_copied;
232061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
233061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
234061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
235061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetScalarValue (Scalar &scalar) const
236061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
237061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
238061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
239061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid:      break;
240d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        case eTypeBytes:
241d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        {
242d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            switch (m_data.buffer.length)
243d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            {
244d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            default:    break;
245d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 1:     scalar = m_data.uint8; return true;
246d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 2:     scalar = m_data.uint16; return true;
247d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 4:     scalar = m_data.uint32; return true;
248d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 8:     scalar = m_data.uint64; return true;
249d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            }
250d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        }
251061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:        scalar = m_data.uint8; return true;
252061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:       scalar = m_data.uint16; return true;
253061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:       scalar = m_data.uint32; return true;
254061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:       scalar = m_data.uint64; return true;
255061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
256061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:      break;
257061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
258061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        scalar = m_data.ieee_float; return true;
259061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       scalar = m_data.ieee_double; return true;
260061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   scalar = m_data.ieee_long_double; return true;
261061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
262061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return false;
263061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
264061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
265061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonvoid
266061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::Clear()
267061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
268061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_type = eTypeInvalid;
269061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
270061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
271061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::Type
272061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::SetType (const RegisterInfo *reg_info)
273061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
274061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_type = eTypeInvalid;
275061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const uint32_t byte_size = reg_info->byte_size;
276061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (reg_info->encoding)
277061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
278061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingInvalid:
279061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
280061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
281061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingUint:
282061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingSint:
283061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (byte_size == 1)
284061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeUInt8;
285061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (byte_size <= 2)
286061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeUInt16;
287061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (byte_size <= 4)
288061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeUInt32;
289061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (byte_size <= 8)
290061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeUInt64;
291061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
292061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (byte_size <= 16)
293061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeUInt128;
294061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
295061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
296061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
297061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingIEEE754:
298061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (byte_size == sizeof(float))
299061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeFloat;
30069fdfc9bbee47092c9626db10fb14e1272e31c73Jason Molenda            else if (byte_size == sizeof(double))
301061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeDouble;
30269fdfc9bbee47092c9626db10fb14e1272e31c73Jason Molenda            else if (byte_size == sizeof(long double))
303061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_type = eTypeLongDouble;
304061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
305061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
306061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingVector:
307061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_type = eTypeBytes;
308061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
309061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
310061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return m_type;
311061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
312061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
313061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonError
31436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonRegisterValue::SetValueFromData (const RegisterInfo *reg_info, DataExtractor &src, lldb::offset_t src_offset, bool partial_data_ok)
315061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
316061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    Error error;
317061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
318061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (src.GetByteSize() == 0)
319061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
320061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("empty data.");
321061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return error;
322061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
323061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
324061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (reg_info->byte_size == 0)
325061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
326061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("invalid register info.");
327061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return error;
328061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
329061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
330061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    uint32_t src_len = src.GetByteSize() - src_offset;
331061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
332061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (!partial_data_ok && (src_len < reg_info->byte_size))
333061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
334061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("not enough data.");
335061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return error;
336061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
337061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
338061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Cap the data length if there is more than enough bytes for this register
339061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // value
340061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (src_len > reg_info->byte_size)
341061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        src_len = reg_info->byte_size;
342061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
343061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Zero out the value in case we get partial data...
344061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    memset (m_data.buffer.bytes, 0, sizeof (m_data.buffer.bytes));
345061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
346061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (SetType (reg_info))
347061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
348061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid:
349061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            error.SetErrorString("");
350061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
351061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:    SetUInt8  (src.GetMaxU32 (&src_offset, src_len)); break;
352061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:   SetUInt16 (src.GetMaxU32 (&src_offset, src_len)); break;
353061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:   SetUInt32 (src.GetMaxU32 (&src_offset, src_len)); break;
354061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:   SetUInt64 (src.GetMaxU64 (&src_offset, src_len)); break;
355061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
356061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:
357061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
358061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                __uint128_t data1 = src.GetU64 (&src_offset);
359061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                __uint128_t data2 = src.GetU64 (&src_offset);
360061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (src.GetByteSize() == eByteOrderBig)
361061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    SetUInt128 (data1 << 64 + data2);
362061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else
363061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    SetUInt128 (data2 << 64 + data1);
364061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
365061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        SetFloat (src.GetFloat (&src_offset));      break;
368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       SetDouble(src.GetDouble (&src_offset));     break;
369061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   SetFloat (src.GetLongDouble (&src_offset)); break;
370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeBytes:
371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        {
372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_data.buffer.length = reg_info->byte_size;
373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_data.buffer.byte_order = src.GetByteOrder();
374061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            assert (m_data.buffer.length <= kMaxRegisterByteSize);
375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (m_data.buffer.length > kMaxRegisterByteSize)
376061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_data.buffer.length = kMaxRegisterByteSize;
377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (src.CopyByteOrderedData (src_offset,                    // offset within "src" to start extracting data
378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                         src_len,                       // src length
379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                         m_data.buffer.bytes,           // dst buffer
380061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                         m_data.buffer.length,          // dst length
381061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                         m_data.buffer.byte_order) == 0)// dst byte order
382061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
383061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                error.SetErrorString ("data copy failed data.");
384061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return error;
385061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
386061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        }
387061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
388061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
389061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return error;
390061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
391061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
39274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen#include "llvm/ADT/StringRef.h"
39374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen#include <vector>
39474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenstatic inline void StripSpaces(llvm::StringRef &Str)
39574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{
39674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    while (!Str.empty() && isspace(Str[0]))
39774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        Str = Str.substr(1);
39874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    while (!Str.empty() && isspace(Str.back()))
39974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        Str = Str.substr(0, Str.size()-1);
40074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen}
40174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenstatic inline void LStrip(llvm::StringRef &Str, char c)
40274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{
40374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    if (!Str.empty() && Str.front() == c)
40474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        Str = Str.substr(1);
40574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen}
40674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenstatic inline void RStrip(llvm::StringRef &Str, char c)
40774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{
40874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    if (!Str.empty() && Str.back() == c)
40974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        Str = Str.substr(0, Str.size()-1);
41074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen}
41174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen// Helper function for RegisterValue::SetValueFromCString()
41274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenstatic bool
41374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny ChenParseVectorEncoding(const RegisterInfo *reg_info, const char *vector_str, const uint32_t byte_size, RegisterValue *reg_value)
41474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{
41574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // Example: vector_str = "{0x2c 0x4b 0x2a 0x3e 0xd0 0x4f 0x2a 0x3e 0xac 0x4a 0x2a 0x3e 0x84 0x4f 0x2a 0x3e}".
41674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    llvm::StringRef Str(vector_str);
41774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    StripSpaces(Str);
41874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    LStrip(Str, '{');
41974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    RStrip(Str, '}');
42074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    StripSpaces(Str);
42174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen
42274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    char Sep = ' ';
42374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen
42474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // The first split should give us:
42574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // ('0x2c', '0x4b 0x2a 0x3e 0xd0 0x4f 0x2a 0x3e 0xac 0x4a 0x2a 0x3e 0x84 0x4f 0x2a 0x3e').
42674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    std::pair<llvm::StringRef, llvm::StringRef> Pair = Str.split(Sep);
42774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    std::vector<uint8_t> bytes;
42874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    unsigned byte = 0;
42974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen
43074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // Using radix auto-sensing by passing 0 as the radix.
43174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // Keep on processing the vector elements as long as the parsing succeeds and the vector size is < byte_size.
43274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    while (!Pair.first.getAsInteger(0, byte) && bytes.size() < byte_size) {
43374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        bytes.push_back(byte);
43474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        Pair = Pair.second.split(Sep);
43574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    }
43674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen
43774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // Check for vector of exact byte_size elements.
43874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    if (bytes.size() != byte_size)
43974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen        return false;
44074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen
44174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    reg_value->SetBytes(&(bytes.front()), byte_size, eByteOrderLittle);
44274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    return true;
44374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen}
444061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonError
445061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::SetValueFromCString (const RegisterInfo *reg_info, const char *value_str)
446061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
447061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    Error error;
448061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (reg_info == NULL)
449061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
450061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("Invalid register info argument.");
451061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return error;
452061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
453061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
454b6f99aa06c1ac8f6e753a5e5b11dd9bff98be28aJohnny Chen    if (value_str == NULL || value_str[0] == '\0')
455061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
456061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        error.SetErrorString ("Invalid c-string value string.");
457061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return error;
458061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
459061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool success = false;
460061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const uint32_t byte_size = reg_info->byte_size;
461061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (reg_info->encoding)
462061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
463061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingInvalid:
464061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            error.SetErrorString ("Invalid encoding.");
465061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
466061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
467061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingUint:
468061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (byte_size <= sizeof (uint64_t))
469061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
470061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                uint64_t uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 0, &success);
471061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!success)
4729c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string value", value_str);
473061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else if (!Args::UInt64ValueIsValidForByteSize (uval64, byte_size))
4745f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %u byte unsigned integer value", uval64, byte_size);
475061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else
476061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
477061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    if (!SetUInt (uval64, reg_info->byte_size))
4789c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                        error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %u", byte_size);
479061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
480061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
481061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else
482061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
4839c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %u", byte_size);
484061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return error;
485061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
486061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
487061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
488061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingSint:
489061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (byte_size <= sizeof (long long))
490061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
491061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                uint64_t sval64 = Args::StringToSInt64(value_str, INT64_MAX, 0, &success);
492061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!success)
4939c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat ("'%s' is not a valid signed integer string value", value_str);
494061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else if (!Args::SInt64ValueIsValidForByteSize (sval64, byte_size))
4955f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %u byte signed integer value", sval64, byte_size);
496061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else
497061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
498061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    if (!SetUInt (sval64, reg_info->byte_size))
4999c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                        error.SetErrorStringWithFormat ("unsupported signed integer byte size: %u", byte_size);
500061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
501061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
502061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else
503061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
5049c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("unsupported signed integer byte size: %u", byte_size);
505061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return error;
506061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
507061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
508061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
509061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingIEEE754:
510061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (byte_size == sizeof (float))
511061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
512061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (::sscanf (value_str, "%f", &m_data.ieee_float) == 1)
513061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_type = eTypeFloat;
514061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else
5159c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
516061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
517061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (byte_size == sizeof (double))
518061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
519061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (::sscanf (value_str, "%lf", &m_data.ieee_double) == 1)
520061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_type = eTypeDouble;
521061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else
5229c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
523061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
524061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (byte_size == sizeof (long double))
525061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
526061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (::sscanf (value_str, "%Lf", &m_data.ieee_long_double) == 1)
527061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_type = eTypeLongDouble;
528061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                else
5299c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
530061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
531061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else
532061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
5339c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("unsupported float byte size: %u", byte_size);
534061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return error;
535061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
536061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
537061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
538061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eEncodingVector:
53974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen            if (!ParseVectorEncoding(reg_info, value_str, byte_size, this))
54074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen                error.SetErrorString ("unrecognized vector encoding string value.");
541061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
542061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
543061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (error.Fail())
544061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_type = eTypeInvalid;
545061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
546061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return error;
547061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
548061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
549061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
550061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
551061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::SignExtend (uint32_t sign_bitpos)
552061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
553061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
554061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
555061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid:
556061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
557061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
558061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:
559061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sign_bitpos == (8-1))
560061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
561061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (sign_bitpos < (8-1))
562061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
563061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                uint8_t sign_bit = 1u << sign_bitpos;
564061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (m_data.uint8 & sign_bit)
565061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
566061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    const uint8_t mask = ~(sign_bit) + 1u;
567061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_data.uint8 |= mask;
568061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
569061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
570061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
571061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
572061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
573061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:
574061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sign_bitpos == (16-1))
575061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
576061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (sign_bitpos < (16-1))
577061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
578061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                uint16_t sign_bit = 1u << sign_bitpos;
579061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (m_data.uint16 & sign_bit)
580061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
581061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    const uint16_t mask = ~(sign_bit) + 1u;
582061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_data.uint16 |= mask;
583061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
584061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
585061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
586061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
587061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
588061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:
589061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sign_bitpos == (32-1))
590061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
591061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (sign_bitpos < (32-1))
592061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
593061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                uint32_t sign_bit = 1u << sign_bitpos;
594061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (m_data.uint32 & sign_bit)
595061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
596061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    const uint32_t mask = ~(sign_bit) + 1u;
597061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_data.uint32 |= mask;
598061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
599061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
600061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
601061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
602061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
603061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:
604061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sign_bitpos == (64-1))
605061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
606061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (sign_bitpos < (64-1))
607061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
608061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                uint64_t sign_bit = 1ull << sign_bitpos;
609061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (m_data.uint64 & sign_bit)
610061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
611061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    const uint64_t mask = ~(sign_bit) + 1ull;
612061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_data.uint64 |= mask;
613061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
614061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
615061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
616061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
617061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
618061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
619061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:
620061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sign_bitpos == (128-1))
621061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
622061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            else if (sign_bitpos < (128-1))
623061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
624061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                __uint128_t sign_bit = (__uint128_t)1u << sign_bitpos;
625061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (m_data.uint128 & sign_bit)
626061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                {
627061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    const uint128_t mask = ~(sign_bit) + 1u;
628061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    m_data.uint128 |= mask;
629061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                }
630061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
631061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
632061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
633061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
634061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:
635061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:
636061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:
637061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeBytes:
638061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
639061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
640061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return false;
641061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
642061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
643061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
644061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::CopyValue (const RegisterValue &rhs)
645061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
646061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_type = rhs.m_type;
647061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
648061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
649061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid:
650061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            return false;
651061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:        m_data.uint8 = rhs.m_data.uint8; break;
652061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:       m_data.uint16 = rhs.m_data.uint16; break;
653061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:       m_data.uint32 = rhs.m_data.uint32; break;
654061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:       m_data.uint64 = rhs.m_data.uint64; break;
655061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
656061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:      m_data.uint128 = rhs.m_data.uint128; break;
657061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
658061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        m_data.ieee_float = rhs.m_data.ieee_float; break;
659061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       m_data.ieee_double = rhs.m_data.ieee_double; break;
660061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   m_data.ieee_long_double = rhs.m_data.ieee_long_double; break;
661061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeBytes:
662061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            assert (rhs.m_data.buffer.length <= kMaxRegisterByteSize);
663061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            ::memcpy (m_data.buffer.bytes, rhs.m_data.buffer.bytes, kMaxRegisterByteSize);
664061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_data.buffer.length = rhs.m_data.buffer.length;
665061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_data.buffer.byte_order = rhs.m_data.buffer.byte_order;
666061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
667061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
668061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return true;
669061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
670061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
671061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonuint16_t
672061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsUInt16 (uint16_t fail_value, bool *success_ptr) const
673061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
674061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
675061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
676061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
677061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
678061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
679061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:            break;
680061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:    return m_data.uint8;
681061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:   return m_data.uint16;
682d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        case eTypeBytes:
683d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        {
684d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            switch (m_data.buffer.length)
685d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            {
686d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            default:    break;
687d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 1:     return m_data.uint8;
688d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 2:     return m_data.uint16;
689d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            }
690d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        }
691d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        break;
692061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
693061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
694061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
695061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
696061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
697061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
698061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonuint32_t
699061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsUInt32 (uint32_t fail_value, bool *success_ptr) const
700061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
701061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
702061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
703061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
704061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
705061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:            break;
706061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:    return m_data.uint8;
707061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:   return m_data.uint16;
708061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:   return m_data.uint32;
709061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:
710061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(uint32_t))
711061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint32;
712061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
713061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:
714061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(uint32_t))
715061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint32;
716061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
717061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:
718061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(long double) == sizeof(uint32_t))
719061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint32;
720061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
721d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        case eTypeBytes:
722d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        {
723d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            switch (m_data.buffer.length)
724d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            {
725d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            default:    break;
726d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 1:     return m_data.uint8;
727d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 2:     return m_data.uint16;
728d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 4:     return m_data.uint32;
729d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            }
730d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        }
731d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        break;
732061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
733061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
734061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
735061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
736061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
737061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
738061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonuint64_t
739061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsUInt64 (uint64_t fail_value, bool *success_ptr) const
740061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
741061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
742061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
743061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
744061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
745061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:            break;
746061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:    return m_data.uint8;
747061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:   return m_data.uint16;
748061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:   return m_data.uint32;
749061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:   return m_data.uint64;
750061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:
751061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(uint64_t))
752061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint64;
753061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
754061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:
755061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(uint64_t))
756061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint64;
757061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
758061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:
759061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(long double) == sizeof(uint64_t))
760061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint64;
761061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
762d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        case eTypeBytes:
763d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        {
764d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            switch (m_data.buffer.length)
765d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            {
766d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            default:    break;
767d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 1:     return m_data.uint8;
768d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 2:     return m_data.uint16;
769d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 4:     return m_data.uint32;
770d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 8:     return m_data.uint64;
771d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            }
772d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        }
773d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        break;
774061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
775061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
776061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
777061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
778061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
779061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
780061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
781061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton__uint128_t
782061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsUInt128 (__uint128_t fail_value, bool *success_ptr) const
783061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
784061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
785061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
786061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
787061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
788061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:            break;
789061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:    return m_data.uint8;
790061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:   return m_data.uint16;
791061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:   return m_data.uint32;
792061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:   return m_data.uint64;
793061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:  return m_data.uint128;
794061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:
795061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(__uint128_t))
796061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint128;
797061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
798061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:
799061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(__uint128_t))
800061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint128;
801061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
802061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:
803061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(long double) == sizeof(__uint128_t))
804061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.uint128;
805061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
806d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        case eTypeBytes:
807d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        {
808d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            switch (m_data.buffer.length)
809d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            {
810d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            default:
811d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan                break;
812d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 1:     return m_data.uint8;
813d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 2:     return m_data.uint16;
814d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 4:     return m_data.uint32;
815d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 8:     return m_data.uint64;
816d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            case 16:    return m_data.uint128;
817d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan            }
818d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        }
819d4d2d42f9003d8241b939412bf70fee2629e4a80Sean Callanan        break;
820061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
821061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
822061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
823061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
824061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
825061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
826061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonfloat
827061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsFloat (float fail_value, bool *success_ptr) const
828061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
829061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
830061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
831061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
832061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
833061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:            break;
834061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:
835061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(m_data.uint32))
836061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_float;
837061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
838061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:
839061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(m_data.uint64))
840061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_float;
841061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
842061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
843061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:
844061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(m_data.uint128))
845061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_float;
846061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
847061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
848061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:    return m_data.ieee_float;
849061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:
850061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(double))
851061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_float;
852061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
853061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:
854061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(float) == sizeof(long double))
855061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_float;
856061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
857061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
858061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
859061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
860061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
861061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
862061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
863061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytondouble
864061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsDouble (double fail_value, bool *success_ptr) const
865061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
866061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
867061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
868061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
869061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
870061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:
871061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
872061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
873061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:
874061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(m_data.uint32))
875061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_double;
876061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
877061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
878061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:
879061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(m_data.uint64))
880061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_double;
881061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
882061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
883061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
884061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:
885061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(m_data.uint128))
886061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_double;
887061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
888061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:    return m_data.ieee_float;
889061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:   return m_data.ieee_double;
890061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
891061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:
892061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(double) == sizeof(long double))
893061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_double;
894061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
895061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
896061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
897061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
898061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
899061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
900061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
901061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonlong double
902061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetAsLongDouble (long double fail_value, bool *success_ptr) const
903061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
904061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
905061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = true;
906061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
907061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
908061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        default:
909061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
910061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
911061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:
912061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(long double) == sizeof(m_data.uint32))
913061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_long_double;
914061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
915061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
916061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:
917061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(long double) == sizeof(m_data.uint64))
918061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_long_double;
919061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
920061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
921061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
922061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:
923061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (sizeof(long double) == sizeof(m_data.uint128))
924061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return m_data.ieee_long_double;
925061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
926061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        return m_data.ieee_float;
927061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       return m_data.ieee_double;
928061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   return m_data.ieee_long_double;
929061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            break;
930061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
931061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (success_ptr)
932061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        *success_ptr = false;
933061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return fail_value;
934061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
935061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
936061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonconst void *
937061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetBytes () const
938061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
939061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
940061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
941061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid:      break;
942061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:        return &m_data.uint8;
943061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:       return &m_data.uint16;
944061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:       return &m_data.uint32;
945061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:       return &m_data.uint64;
946061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
947061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:      return &m_data.uint128;
948061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
949061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        return &m_data.ieee_float;
950061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       return &m_data.ieee_double;
951061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   return &m_data.ieee_long_double;
952061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeBytes:        return m_data.buffer.bytes;
953061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
954061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return NULL;
955061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
956061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
957061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonvoid *
958061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetBytes ()
959061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
960061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
961061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
962061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid:      break;
963061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:        return &m_data.uint8;
964061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:       return &m_data.uint16;
965061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:       return &m_data.uint32;
966061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:       return &m_data.uint64;
967061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
968061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:      return &m_data.uint128;
969061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
970061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        return &m_data.ieee_float;
971061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       return &m_data.ieee_double;
972061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   return &m_data.ieee_long_double;
973061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeBytes:        return m_data.buffer.bytes;
974061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
975061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return NULL;
976061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
977061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
978061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonuint32_t
979061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::GetByteSize () const
980061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
981061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    switch (m_type)
982061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
983061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeInvalid: break;
984061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt8:        return sizeof(m_data.uint8);
985061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt16:       return sizeof(m_data.uint16);
986061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt32:       return sizeof(m_data.uint32);
987061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt64:       return sizeof(m_data.uint64);
988061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
989061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeUInt128:      return sizeof(m_data.uint128);
990061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
991061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeFloat:        return sizeof(m_data.ieee_float);
992061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeDouble:       return sizeof(m_data.ieee_double);
993061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeLongDouble:   return sizeof(m_data.ieee_long_double);
994061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        case eTypeBytes: return m_data.buffer.length;
995061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
996061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return 0;
997061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
998061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
999061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1000061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonbool
1001061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::SetUInt (uint64_t uint, uint32_t byte_size)
1002061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
1003061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (byte_size == 0)
1004061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1005061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        SetUInt64 (uint);
1006061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1007061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else if (byte_size == 1)
1008061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1009061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        SetUInt8 (uint);
1010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1011061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else if (byte_size <= 2)
1012061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1013061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        SetUInt16 (uint);
1014061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1015061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else if (byte_size <= 4)
1016061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1017061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        SetUInt32 (uint);
1018061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1019061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else if (byte_size <= 8)
1020061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1021061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        SetUInt64 (uint);
1022061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1023061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
1024061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else if (byte_size <= 16)
1025061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1026061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        SetUInt128 (uint);
1027061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1028061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#endif
1029061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else
1030061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return false;
1031061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return true;
1032061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
1033061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1034061b79dbf1fefaf157d414747e98a463a0f32edaGreg Claytonvoid
1035061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonRegisterValue::SetBytes (const void *bytes, size_t length, lldb::ByteOrder byte_order)
1036061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton{
1037061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // If this assertion fires off we need to increase the size of
1038061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // m_data.buffer.bytes, or make it something that is allocated on
1039061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // the heap. Since the data buffer is in a union, we can't make it
1040061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // a collection class like SmallVector...
1041061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (bytes && length > 0)
1042061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
10430852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi        assert (length <= sizeof (m_data.buffer.bytes) && "Storing too many bytes in a RegisterValue.");
1044061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_type = eTypeBytes;
1045061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_data.buffer.length = length;
1046061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        memcpy (m_data.buffer.bytes, bytes, length);
1047061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_data.buffer.byte_order = byte_order;
1048061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1049061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    else
1050061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
1051061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_type = eTypeInvalid;
1052061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_data.buffer.length = 0;
1053061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
1054061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton}
1055061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1056b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton
1057b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Claytonbool
1058b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg ClaytonRegisterValue::operator == (const RegisterValue &rhs) const
1059b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton{
1060b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    if (m_type == rhs.m_type)
1061b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    {
1062b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        switch (m_type)
1063b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        {
1064b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeInvalid:      return true;
1065b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeUInt8:        return m_data.uint8 == rhs.m_data.uint8;
1066b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeUInt16:       return m_data.uint16 == rhs.m_data.uint16;
1067b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeUInt32:       return m_data.uint32 == rhs.m_data.uint32;
1068b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeUInt64:       return m_data.uint64 == rhs.m_data.uint64;
1069b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
1070b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeUInt128:      return m_data.uint128 == rhs.m_data.uint128;
1071b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton#endif
1072b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeFloat:        return m_data.ieee_float == rhs.m_data.ieee_float;
1073b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeDouble:       return m_data.ieee_double == rhs.m_data.ieee_double;
1074b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeLongDouble:   return m_data.ieee_long_double == rhs.m_data.ieee_long_double;
1075b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            case eTypeBytes:
1076b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                if (m_data.buffer.length != rhs.m_data.buffer.length)
1077b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    return false;
1078b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                else
1079b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                {
1080b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    uint8_t length = m_data.buffer.length;
1081b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    if (length > kMaxRegisterByteSize)
1082b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                        length = kMaxRegisterByteSize;
1083b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    return memcmp (m_data.buffer.bytes, rhs.m_data.buffer.bytes, length) == 0;
1084b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                }
1085b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                break;
1086b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        }
1087b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    }
1088b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    return false;
1089b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton}
1090b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton
1091b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Claytonbool
1092b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg ClaytonRegisterValue::operator != (const RegisterValue &rhs) const
1093b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton{
1094b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    if (m_type != rhs.m_type)
1095b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        return true;
1096b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    switch (m_type)
1097b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    {
1098b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeInvalid:      return false;
1099b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeUInt8:        return m_data.uint8 != rhs.m_data.uint8;
1100b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeUInt16:       return m_data.uint16 != rhs.m_data.uint16;
1101b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeUInt32:       return m_data.uint32 != rhs.m_data.uint32;
1102b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeUInt64:       return m_data.uint64 != rhs.m_data.uint64;
1103b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
1104b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeUInt128:      return m_data.uint128 != rhs.m_data.uint128;
1105b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton#endif
1106b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeFloat:        return m_data.ieee_float != rhs.m_data.ieee_float;
1107b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeDouble:       return m_data.ieee_double != rhs.m_data.ieee_double;
1108b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeLongDouble:   return m_data.ieee_long_double != rhs.m_data.ieee_long_double;
1109b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        case eTypeBytes:
1110b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            if (m_data.buffer.length != rhs.m_data.buffer.length)
1111b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            {
1112b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                return true;
1113b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            }
1114b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            else
1115b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            {
1116b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                uint8_t length = m_data.buffer.length;
1117b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                if (length > kMaxRegisterByteSize)
1118b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    length = kMaxRegisterByteSize;
1119b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                return memcmp (m_data.buffer.bytes, rhs.m_data.buffer.bytes, length) != 0;
1120b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            }
1121b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            break;
1122b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    }
1123b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    return true;
1124b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton}
1125b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton
1126107e53da8bdca540db8b734ed237688eaeee85c5Greg Claytonbool
1127107e53da8bdca540db8b734ed237688eaeee85c5Greg ClaytonRegisterValue::ClearBit (uint32_t bit)
1128107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton{
1129107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    switch (m_type)
1130107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    {
1131107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeInvalid:
1132107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1133107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1134107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt8:
1135107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 8)
1136107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1137107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint8 &= ~(1u << bit);
1138107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1139107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1140107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1141107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1142107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt16:
1143107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 16)
1144107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1145107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint16 &= ~(1u << bit);
1146107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1147107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1148107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1149107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1150107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt32:
1151107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 32)
1152107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1153107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint32 &= ~(1u << bit);
1154107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1155107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1156107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1157107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1158107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt64:
1159107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 64)
1160107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1161107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint64 &= ~(1ull << (uint64_t)bit);
1162107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1163107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1164107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1165107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
1166107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt128:
1167107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 64)
1168107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1169107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint128 &= ~((__uint128_t)1ull << (__uint128_t)bit);
1170107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1171107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1172107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton#endif
1173107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeFloat:
1174107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeDouble:
1175107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeLongDouble:
1176107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1177107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1178107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeBytes:
1179107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (m_data.buffer.byte_order == eByteOrderBig || m_data.buffer.byte_order == eByteOrderLittle)
1180107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1181107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                uint32_t byte_idx;
1182107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                if (m_data.buffer.byte_order == eByteOrderBig)
1183107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    byte_idx = m_data.buffer.length - (bit / 8) - 1;
1184107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                else
1185107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    byte_idx = bit / 8;
1186107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1187107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                const uint32_t byte_bit = bit % 8;
1188107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                if (byte_idx < m_data.buffer.length)
1189107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                {
1190107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    m_data.buffer.bytes[byte_idx] &= ~(1u << byte_bit);
1191107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    return true;
1192107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                }
1193107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1194107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1195107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    }
1196107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    return false;
1197107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton}
1198107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1199107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1200107e53da8bdca540db8b734ed237688eaeee85c5Greg Claytonbool
1201107e53da8bdca540db8b734ed237688eaeee85c5Greg ClaytonRegisterValue::SetBit (uint32_t bit)
1202107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton{
1203107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    switch (m_type)
1204107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    {
1205107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeInvalid:
1206107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1207107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1208107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt8:
1209107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 8)
1210107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1211107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint8 |= (1u << bit);
1212107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1213107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1214107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1215107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1216107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt16:
1217107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 16)
1218107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1219107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint16 |= (1u << bit);
1220107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1221107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1222107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1223107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1224107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt32:
1225107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 32)
1226107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1227107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint32 |= (1u << bit);
1228107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1229107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1230107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1231107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1232107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt64:
1233107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 64)
1234107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1235107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint64 |= (1ull << (uint64_t)bit);
1236107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1237107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1238107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1239107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
1240107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeUInt128:
1241107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (bit < 64)
1242107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1243107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                m_data.uint128 |= ((__uint128_t)1ull << (__uint128_t)bit);
1244107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                return true;
1245107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1246107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton#endif
1247107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeFloat:
1248107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeDouble:
1249107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeLongDouble:
1250107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1251107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1252107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton        case eTypeBytes:
1253107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            if (m_data.buffer.byte_order == eByteOrderBig || m_data.buffer.byte_order == eByteOrderLittle)
1254107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            {
1255107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                uint32_t byte_idx;
1256107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                if (m_data.buffer.byte_order == eByteOrderBig)
1257107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    byte_idx = m_data.buffer.length - (bit / 8) - 1;
1258107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                else
1259107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    byte_idx = bit / 8;
1260107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1261107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                const uint32_t byte_bit = bit % 8;
1262107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                if (byte_idx < m_data.buffer.length)
1263107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                {
1264107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    m_data.buffer.bytes[byte_idx] |= (1u << byte_bit);
1265107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                    return true;
1266107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton                }
1267107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            }
1268107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton            break;
1269107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    }
1270107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton    return false;
1271107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton}
1272107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton
1273