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