124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Scalar.cpp ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <math.h>
135f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea#include <inttypes.h>
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1584cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
19cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton#include "Plugins/Process/Utility/InstructionUtils.h"
221716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Promote to max type currently follows the ANSI C rule for type
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// promotion in expressions.
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic Scalar::Type
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPromoteToMaxType
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar& lhs,                  // The const left hand side object
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar& rhs,                  // The const right hand side object
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar& temp_value,             // A modifiable temp value than can be used to hold either the promoted lhs or rhs object
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* &promoted_lhs_ptr,    // Pointer to the resulting possibly promoted value of lhs (at most one of lhs/rhs will get promoted)
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* &promoted_rhs_ptr // Pointer to the resulting possibly promoted value of rhs (at most one of lhs/rhs will get promoted)
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Initialize the promoted values for both the right and left hand side values
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to be the objects themselves. If no promotion is needed (both right and left
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // have the same type), then the temp_value will not get used.
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    promoted_lhs_ptr = &lhs;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    promoted_rhs_ptr = &rhs;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Extract the types of both the right and left hand side values
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar::Type lhs_type = lhs.GetType();
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar::Type rhs_type = rhs.GetType();
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs_type > rhs_type)
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Right hand side need to be promoted
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        temp_value = rhs;                   // Copy right hand side into the temp value
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (temp_value.Promote(lhs_type))   // Promote it
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            promoted_rhs_ptr = &temp_value; // Update the pointer for the promoted right hand side
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (lhs_type < rhs_type)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Left hand side need to be promoted
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        temp_value = lhs;                   // Copy left hand side value into the temp value
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (temp_value.Promote(rhs_type))   // Promote it
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            promoted_lhs_ptr = &temp_value; // Update the pointer for the promoted left hand side
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our type promotion worked as exptected
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (promoted_lhs_ptr->GetType() == promoted_rhs_ptr->GetType())
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return promoted_lhs_ptr->GetType(); // Return the resulting max type
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return the void type (zero) if we fail to promote either of the values.
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Scalar::e_void;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Scalar constructor
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Scalar() :
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type(e_void),
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data()
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Scalar copy constructor
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Scalar(const Scalar& rhs) :
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type(rhs.m_type),
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data(rhs.m_data)  // TODO: verify that for C++ this will correctly copy the union??
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Scalar::Scalar(const RegisterValue& reg) :
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  m_type(e_void),
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  m_data()
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  switch (reg.info.encoding)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case eEncodingUint:     // unsigned integer
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      switch (reg.info.byte_size)
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 1: m_type = e_uint; m_data.uint = reg.value.uint8; break;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 2: m_type = e_uint; m_data.uint = reg.value.uint16; break;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 4: m_type = e_uint; m_data.uint = reg.value.uint32; break;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 8: m_type = e_ulonglong; m_data.ulonglong = reg.value.uint64; break;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case eEncodingSint:     // signed integer
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      switch (reg.info.byte_size)
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 1: m_type = e_sint; m_data.sint = reg.value.sint8; break;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 2: m_type = e_sint; m_data.sint = reg.value.sint16; break;
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 4: m_type = e_sint; m_data.sint = reg.value.sint32; break;
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 8: m_type = e_slonglong; m_data.slonglong = reg.value.sint64; break;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  case eEncodingIEEE754:  // float
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      switch (reg.info.byte_size)
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 4: m_type = e_float; m_data.flt = reg.value.float32; break;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      case 8: m_type = e_double; m_data.dbl = reg.value.float64; break;
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    case eEncodingVector: // vector registers
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      break;
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetData (DataExtractor &data, size_t limit_byte_size) const
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t byte_size = GetByteSize();
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (byte_size > 0)
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (limit_byte_size < byte_size)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
141cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton            if (lldb::endian::InlHostByteOrder() == eByteOrderLittle)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // On little endian systems if we want fewer bytes from the
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // current type we just specify fewer bytes since the LSByte
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // is first...
146cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                data.SetData((uint8_t*)&m_data, limit_byte_size, lldb::endian::InlHostByteOrder());
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
148cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton            else if (lldb::endian::InlHostByteOrder() == eByteOrderBig)
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // On big endian systems if we want fewer bytes from the
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // current type have to advance our initial byte pointer and
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // trim down the number of bytes since the MSByte is first
153cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                data.SetData(((uint8_t*)&m_data) + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We want all of the data
159cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton            data.SetData((uint8_t*)&m_data, byte_size, lldb::endian::InlHostByteOrder());
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    data.Clear();
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetByteSize() const
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return sizeof(m_data.sint);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return sizeof(m_data.uint);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return sizeof(m_data.slong);
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return sizeof(m_data.ulong);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return sizeof(m_data.slonglong);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return sizeof(m_data.ulonglong);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return sizeof(m_data.flt);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return sizeof(m_data.dbl);
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return sizeof(m_data.ldbl);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::IsZero() const
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return m_data.sint == 0;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return m_data.uint == 0;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return m_data.slong == 0;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return m_data.ulong == 0;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return m_data.slonglong == 0;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return m_data.ulonglong == 0;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return m_data.flt == 0.0f;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return m_data.dbl == 0.0;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return m_data.ldbl == 0.0;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetValue (Stream *s, bool show_type) const
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (show_type)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf("(%s) ", GetTypeAsCString());
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        s->Printf("%i", m_data.sint);               break;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        s->Printf("0x%8.8x", m_data.uint);          break;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       s->Printf("%li", m_data.slong);             break;
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       s->Printf("0x%8.8lx", m_data.ulong);        break;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   s->Printf("%lli", m_data.slonglong);        break;
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   s->Printf("0x%16.16llx", m_data.ulonglong); break;
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       s->Printf("%f", m_data.flt);                break;
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      s->Printf("%g", m_data.dbl);                break;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: s->Printf("%Lg", m_data.ldbl);              break;
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetTypeAsCString() const
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        return "void";
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return "int";
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return "unsigned int";
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return "long";
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return "unsigned long";
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return "long long";
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return "unsigned long long";
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return "float";
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return "double";
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return "long double";
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "<invalid Scalar type>";
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Scalar copy constructor
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator=(const Scalar& rhs)
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = rhs.m_type;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ::memcpy (&m_data, &rhs.m_data, sizeof(m_data));
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (const int v)
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_sint;
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.sint = v;
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (unsigned int v)
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_uint;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.uint = v;
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (long v)
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_slong;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.slong = v;
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (unsigned long v)
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_ulong;
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.ulong = v;
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (long long v)
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_slonglong;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.slonglong = v;
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (unsigned long long v)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_ulonglong;
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.ulonglong = v;
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (float v)
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_float;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.flt = v;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (double v)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_double;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.dbl = v;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator= (long double v)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_type = e_long_double;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data.ldbl = v;
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::~Scalar()
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Promote(Scalar::Type type)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool success = false;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:        break;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:        success = true; break;
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:        m_data.uint         = m_data.sint;      success = true; break;
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.sint;      success = true; break;
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.sint;      success = true; break;
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.sint;      success = true; break;
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.sint;      success = true; break;
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.sint;      success = true; break;
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.sint;      success = true; break;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.sint;      success = true; break;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:        break;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:        success = true; break;
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.uint;      success = true; break;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.uint;      success = true; break;
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.uint;      success = true; break;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.uint;      success = true; break;
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.uint;      success = true; break;
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.uint;      success = true; break;
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.uint;      success = true; break;
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:        break;
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       success = true; break;
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.slong;     success = true; break;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.slong;     success = true; break;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.slong;     success = true; break;
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.slong;     success = true; break;
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.slong;     success = true; break;
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.slong;     success = true; break;
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       break;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       success = true; break;
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.ulong;     success = true; break;
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.ulong;     success = true; break;
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.ulong;     success = true; break;
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.ulong;     success = true; break;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.ulong;     success = true; break;
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       break;
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   success = true; break;
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.slonglong;     success = true; break;
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.slonglong;     success = true; break;
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.slonglong;     success = true; break;
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.slonglong;     success = true; break;
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   break;
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   success = true; break;
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.ulonglong;     success = true; break;
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.ulonglong;     success = true; break;
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   break;
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       success = true; break;
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.flt;           success = true; break;
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       break;
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      success = true; break;
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.dbl;       success = true; break;
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      break;
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: success = true; break;
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (success)
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = type;
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return success;
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetValueTypeAsCString (Scalar::Type type)
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (type)
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        return "void";
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return "int";
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return "unsigned int";
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return "long";
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return "unsigned long";
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return "long long";
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return "unsigned long long";
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return "float";
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return "double";
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return "long double";
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "???";
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Type
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetValueTypeForSignedIntegerWithByteSize (size_t byte_size)
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size <= sizeof(sint_t))
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_sint;
52836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size <= sizeof(slong_t))
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_slong;
53036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size <= sizeof(slonglong_t))
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_slonglong;
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return e_void;
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Type
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetValueTypeForUnsignedIntegerWithByteSize (size_t byte_size)
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size <= sizeof(uint_t))
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_uint;
54036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size <= sizeof(ulong_t))
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_ulong;
54236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size <= sizeof(ulonglong_t))
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_ulonglong;
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return e_void;
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Type
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetValueTypeForFloatWithByteSize (size_t byte_size)
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size == sizeof(float_t))
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_float;
55236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size == sizeof(double_t))
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_double;
55436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (byte_size == sizeof(long_double_t))
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return e_long_double;
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return e_void;
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Cast(Scalar::Type type)
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool success = false;
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:        break;
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:        success = true; break;
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:        m_data.uint         = m_data.sint;      success = true; break;
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.sint;      success = true; break;
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.sint;      success = true; break;
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.sint;      success = true; break;
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.sint;      success = true; break;
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.sint;      success = true; break;
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.sint;      success = true; break;
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.sint;      success = true; break;
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:        m_data.sint         = m_data.uint;      success = true; break;
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:        success = true; break;
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.uint;      success = true; break;
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.uint;      success = true; break;
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.uint;      success = true; break;
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.uint;      success = true; break;
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.uint;      success = true; break;
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.uint;      success = true; break;
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.uint;      success = true; break;
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
60436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.slong;     success = true; break;
60536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.slong;     success = true; break;
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       success = true; break;
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.slong;     success = true; break;
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.slong;     success = true; break;
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.slong;     success = true; break;
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.slong;     success = true; break;
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.slong;     success = true; break;
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.slong;     success = true; break;
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
62036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.ulong;     success = true; break;
62136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.ulong;     success = true; break;
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.ulong;     success = true; break;
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       success = true; break;
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.ulong;     success = true; break;
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.ulong;     success = true; break;
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.ulong;     success = true; break;
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.ulong;     success = true; break;
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.ulong;     success = true; break;
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
63636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.slonglong;     success = true; break;
63736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.slonglong;     success = true; break;
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.slonglong;     success = true; break;
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.slonglong;     success = true; break;
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   success = true; break;
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = m_data.slonglong;     success = true; break;
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.slonglong;     success = true; break;
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.slonglong;     success = true; break;
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.slonglong;     success = true; break;
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
65236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.ulonglong;     success = true; break;
65336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.ulonglong;     success = true; break;
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = m_data.ulonglong;     success = true; break;
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = m_data.ulonglong;     success = true; break;
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = m_data.ulonglong;     success = true; break;
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   success = true; break;
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = m_data.ulonglong;     success = true; break;
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = m_data.ulonglong;     success = true; break;
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
66836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.flt;       success = true; break;
66936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.flt;       success = true; break;
67036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_slong:       m_data.slong        = (slong_t)m_data.flt;      success = true; break;
67136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_ulong:       m_data.ulong        = (ulong_t)m_data.flt;      success = true; break;
67236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.flt;  success = true; break;
67336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.flt;  success = true; break;
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       success = true; break;
67536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_double:      m_data.dbl          = m_data.flt;               success = true; break;
67636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_long_double: m_data.ldbl         = m_data.flt;               success = true; break;
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
68436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.dbl;       success = true; break;
68536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.dbl;       success = true; break;
68636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_slong:       m_data.slong        = (slong_t)m_data.dbl;      success = true; break;
68736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_ulong:       m_data.ulong        = (ulong_t)m_data.dbl;      success = true; break;
68836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.dbl;  success = true; break;
68936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.dbl;  success = true; break;
69036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_float:       m_data.flt          = (float_t)m_data.dbl;      success = true; break;
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      success = true; break;
69236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_long_double: m_data.ldbl         = m_data.dbl;               success = true; break;
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (type)
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
70036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_sint:        m_data.sint         = (sint_t)m_data.ldbl;      success = true; break;
70136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_uint:        m_data.uint         = (uint_t)m_data.ldbl;      success = true; break;
70236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_slong:       m_data.slong        = (slong_t)m_data.ldbl;     success = true; break;
70336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_ulong:       m_data.ulong        = (ulong_t)m_data.ldbl;     success = true; break;
70436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.ldbl; success = true; break;
70536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.ldbl; success = true; break;
70636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_float:       m_data.flt          = (float_t)m_data.ldbl;     success = true; break;
70736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        case e_double:      m_data.dbl          = (double_t)m_data.ldbl;    success = true; break;
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: success = true; break;
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (success)
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = type;
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return success;
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
718b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callananbool
719b50a2f360d56729c9b1082a45ec91faf7448a725Sean CallananScalar::MakeSigned ()
720b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan{
721b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    bool success = false;
722b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan
723b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    switch (m_type)
724b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    {
725b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_void:                                break;
726b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_sint:                                success = true; break;
727b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_uint:        m_type = e_sint;        success = true; break;
728b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_slong:                               success = true; break;
729b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_ulong:       m_type = e_slong;       success = true; break;
730b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_slonglong:                           success = true; break;
731b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_ulonglong:   m_type = e_slonglong;   success = true; break;
732b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_float:                               success = true; break;
733b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_double:                              success = true; break;
734b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    case e_long_double:                         success = true; break;
735b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    }
736b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan
737b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan    return success;
738b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan}
739b50a2f360d56729c9b1082a45ec91faf7448a725Sean Callanan
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::SInt(int fail_value) const
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return m_data.sint;
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (int)m_data.uint;
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return (int)m_data.slong;
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (int)m_data.ulong;
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return (int)m_data.slonglong;
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (int)m_data.ulonglong;
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (int)m_data.flt;
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (int)m_data.dbl;
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (int)m_data.ldbl;
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerunsigned int
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::UInt(unsigned int fail_value) const
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
765671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_sint:        return (unsigned int)m_data.sint;
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (unsigned int)m_data.uint;
767671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_slong:       return (unsigned int)m_data.slong;
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (unsigned int)m_data.ulong;
769671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_slonglong:   return (unsigned int)m_data.slonglong;
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (unsigned int)m_data.ulonglong;
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (unsigned int)m_data.flt;
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (unsigned int)m_data.dbl;
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (unsigned int)m_data.ldbl;
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlong
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::SLong(long fail_value) const
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return (long)m_data.sint;
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (long)m_data.uint;
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return (long)m_data.slong;
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (long)m_data.ulong;
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return (long)m_data.slonglong;
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (long)m_data.ulonglong;
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (long)m_data.flt;
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (long)m_data.dbl;
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (long)m_data.ldbl;
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerunsigned long
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::ULong(unsigned long fail_value) const
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
806671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_sint:        return (unsigned long)m_data.sint;
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (unsigned long)m_data.uint;
808671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_slong:       return (unsigned long)m_data.slong;
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (unsigned long)m_data.ulong;
810671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_slonglong:   return (unsigned long)m_data.slonglong;
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (unsigned long)m_data.ulonglong;
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (unsigned long)m_data.flt;
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (unsigned long)m_data.dbl;
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (unsigned long)m_data.ldbl;
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::GetRawBits64(uint64_t fail_value) const
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_data.uint;
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_data.ulong;
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_data.ulonglong;
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
84036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        if (sizeof(m_data.flt) == sizeof(m_data.uint))
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.uint;
84236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        else if (sizeof(m_data.flt) == sizeof(m_data.ulong))
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.ulong;
84436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        else if (sizeof(m_data.flt) == sizeof(m_data.ulonglong))
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.ulonglong;
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
84936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        if (sizeof(m_data.dbl) == sizeof(m_data.uint))
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.uint;
85136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        else if (sizeof(m_data.dbl) == sizeof(m_data.ulong))
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.ulong;
85336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        else if (sizeof(m_data.dbl) == sizeof(m_data.ulonglong))
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.ulonglong;
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
85836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        if (sizeof(m_data.ldbl) == sizeof(m_data.uint))
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.uint;
86036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        else if (sizeof(m_data.ldbl) == sizeof(m_data.ulong))
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.ulong;
86236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        else if (sizeof(m_data.ldbl) == sizeof(m_data.ulonglong))
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data.ulonglong;
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlong long
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::SLongLong(long long fail_value) const
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return (long long)m_data.sint;
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (long long)m_data.uint;
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return (long long)m_data.slong;
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (long long)m_data.ulong;
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return (long long)m_data.slonglong;
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (long long)m_data.ulonglong;
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (long long)m_data.flt;
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (long long)m_data.dbl;
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (long long)m_data.ldbl;
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerunsigned long long
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::ULongLong(unsigned long long fail_value) const
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
897671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_sint:        return (unsigned long long)m_data.sint;
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (unsigned long long)m_data.uint;
899671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_slong:       return (unsigned long long)m_data.slong;
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (unsigned long long)m_data.ulong;
901671dd558650c457d54f124a58db91b0e26802399Enrico Granata    case e_slonglong:   return (unsigned long long)m_data.slonglong;
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (unsigned long long)m_data.ulonglong;
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (unsigned long long)m_data.flt;
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (unsigned long long)m_data.dbl;
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (unsigned long long)m_data.ldbl;
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerfloat
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Float(float fail_value) const
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return (float)m_data.sint;
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (float)m_data.uint;
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return (float)m_data.slong;
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (float)m_data.ulong;
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return (float)m_data.slonglong;
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (float)m_data.ulonglong;
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (float)m_data.flt;
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (float)m_data.dbl;
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (float)m_data.ldbl;
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdouble
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::Double(double fail_value) const
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return (double)m_data.sint;
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (double)m_data.uint;
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return (double)m_data.slong;
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (double)m_data.ulong;
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return (double)m_data.slonglong;
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (double)m_data.ulonglong;
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (double)m_data.flt;
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (double)m_data.dbl;
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (double)m_data.ldbl;
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlong double
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::LongDouble(long double fail_value) const
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        return (long double)m_data.sint;
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        return (long double)m_data.uint;
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       return (long double)m_data.slong;
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       return (long double)m_data.ulong;
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   return (long double)m_data.slonglong;
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return (long double)m_data.ulonglong;
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       return (long double)m_data.flt;
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      return (long double)m_data.dbl;
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: return (long double)m_data.ldbl;
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return fail_value;
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator+= (const Scalar& rhs)
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) != Scalar::e_void)
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_type)
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:        break;
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:        m_data.sint         = a->m_data.sint        + b->m_data.sint;       break;
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:        m_data.uint         = a->m_data.uint        + b->m_data.uint;       break;
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:       m_data.slong        = a->m_data.slong       + b->m_data.slong;      break;
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:       m_data.ulong        = a->m_data.ulong       + b->m_data.ulong;      break;
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:   m_data.slonglong    = a->m_data.slonglong   + b->m_data.slonglong;  break;
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:   m_data.ulonglong    = a->m_data.ulonglong   + b->m_data.ulonglong;  break;
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:       m_data.flt          = a->m_data.flt         + b->m_data.flt;        break;
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:      m_data.dbl          = a->m_data.dbl         + b->m_data.dbl;        break;
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double: m_data.ldbl         = a->m_data.ldbl        + b->m_data.ldbl;       break;
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator<<= (const Scalar& rhs)
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = e_void;
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.sint <<= rhs.m_data.sint;        break;
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.sint <<= rhs.m_data.uint;        break;
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.sint <<= rhs.m_data.slong;       break;
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.sint <<= rhs.m_data.ulong;       break;
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.sint <<= rhs.m_data.slonglong;   break;
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.sint <<= rhs.m_data.ulonglong;   break;
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.uint <<= rhs.m_data.sint;        break;
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.uint <<= rhs.m_data.uint;        break;
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.uint <<= rhs.m_data.slong;       break;
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.uint <<= rhs.m_data.ulong;       break;
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.uint <<= rhs.m_data.slonglong;   break;
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.uint <<= rhs.m_data.ulonglong;   break;
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.slong <<= rhs.m_data.sint;       break;
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.slong <<= rhs.m_data.uint;       break;
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.slong <<= rhs.m_data.slong;      break;
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.slong <<= rhs.m_data.ulong;      break;
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.slong <<= rhs.m_data.slonglong;  break;
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.slong <<= rhs.m_data.ulonglong;  break;
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulong <<= rhs.m_data.sint;       break;
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulong <<= rhs.m_data.uint;       break;
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulong <<= rhs.m_data.slong;      break;
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulong <<= rhs.m_data.ulong;      break;
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulong <<= rhs.m_data.slonglong;  break;
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulong <<= rhs.m_data.ulonglong;  break;
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.slonglong <<= rhs.m_data.sint;       break;
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.slonglong <<= rhs.m_data.uint;       break;
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.slonglong <<= rhs.m_data.slong;      break;
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.slonglong <<= rhs.m_data.ulong;      break;
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.slonglong <<= rhs.m_data.slonglong;  break;
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.slonglong <<= rhs.m_data.ulonglong;  break;
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulonglong <<= rhs.m_data.sint;       break;
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulonglong <<= rhs.m_data.uint;       break;
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulonglong <<= rhs.m_data.slong;      break;
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulonglong <<= rhs.m_data.ulong;      break;
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulonglong <<= rhs.m_data.slonglong;  break;
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulonglong <<= rhs.m_data.ulonglong;  break;
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::ShiftRightLogical(const Scalar& rhs)
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = e_void;
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.uint >>= rhs.m_data.sint;        break;
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.uint >>= rhs.m_data.uint;        break;
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.uint >>= rhs.m_data.slong;       break;
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.uint >>= rhs.m_data.ulong;       break;
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.uint >>= rhs.m_data.slonglong;   break;
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.uint >>= rhs.m_data.ulonglong;   break;
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulong >>= rhs.m_data.sint;       break;
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulong >>= rhs.m_data.uint;       break;
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulong >>= rhs.m_data.slong;      break;
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulong >>= rhs.m_data.ulong;      break;
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulong >>= rhs.m_data.slonglong;  break;
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulong >>= rhs.m_data.ulonglong;  break;
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulonglong >>= rhs.m_data.sint;       break;
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulonglong >>= rhs.m_data.uint;       break;
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulonglong >>= rhs.m_data.slong;      break;
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulonglong >>= rhs.m_data.ulong;      break;
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulonglong >>= rhs.m_data.slonglong;  break;
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulonglong >>= rhs.m_data.ulonglong;  break;
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_type != e_void;
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator>>= (const Scalar& rhs)
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = e_void;
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.sint >>= rhs.m_data.sint;        break;
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.sint >>= rhs.m_data.uint;        break;
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.sint >>= rhs.m_data.slong;       break;
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.sint >>= rhs.m_data.ulong;       break;
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.sint >>= rhs.m_data.slonglong;   break;
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.sint >>= rhs.m_data.ulonglong;   break;
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.uint >>= rhs.m_data.sint;        break;
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.uint >>= rhs.m_data.uint;        break;
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.uint >>= rhs.m_data.slong;       break;
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.uint >>= rhs.m_data.ulong;       break;
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.uint >>= rhs.m_data.slonglong;   break;
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.uint >>= rhs.m_data.ulonglong;   break;
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.slong >>= rhs.m_data.sint;       break;
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.slong >>= rhs.m_data.uint;       break;
125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.slong >>= rhs.m_data.slong;      break;
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.slong >>= rhs.m_data.ulong;      break;
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.slong >>= rhs.m_data.slonglong;  break;
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.slong >>= rhs.m_data.ulonglong;  break;
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulong >>= rhs.m_data.sint;       break;
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulong >>= rhs.m_data.uint;       break;
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulong >>= rhs.m_data.slong;      break;
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulong >>= rhs.m_data.ulong;      break;
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulong >>= rhs.m_data.slonglong;  break;
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulong >>= rhs.m_data.ulonglong;  break;
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.slonglong >>= rhs.m_data.sint;       break;
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.slonglong >>= rhs.m_data.uint;       break;
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.slonglong >>= rhs.m_data.slong;      break;
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.slonglong >>= rhs.m_data.ulong;      break;
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.slonglong >>= rhs.m_data.slonglong;  break;
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.slonglong >>= rhs.m_data.ulonglong;  break;
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulonglong >>= rhs.m_data.sint;       break;
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulonglong >>= rhs.m_data.uint;       break;
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulonglong >>= rhs.m_data.slong;      break;
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulonglong >>= rhs.m_data.ulong;      break;
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulonglong >>= rhs.m_data.slonglong;  break;
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulonglong >>= rhs.m_data.ulonglong;  break;
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar&
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::operator&= (const Scalar& rhs)
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = e_void;
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.sint &= rhs.m_data.sint;         break;
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.sint &= rhs.m_data.uint;         break;
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.sint &= rhs.m_data.slong;        break;
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.sint &= rhs.m_data.ulong;        break;
133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.sint &= rhs.m_data.slonglong;    break;
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.sint &= rhs.m_data.ulonglong;    break;
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.uint &= rhs.m_data.sint;         break;
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.uint &= rhs.m_data.uint;         break;
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.uint &= rhs.m_data.slong;        break;
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.uint &= rhs.m_data.ulong;        break;
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.uint &= rhs.m_data.slonglong;    break;
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.uint &= rhs.m_data.ulonglong;    break;
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.slong &= rhs.m_data.sint;        break;
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.slong &= rhs.m_data.uint;        break;
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.slong &= rhs.m_data.slong;       break;
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.slong &= rhs.m_data.ulong;       break;
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.slong &= rhs.m_data.slonglong;   break;
137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.slong &= rhs.m_data.ulonglong;   break;
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulong &= rhs.m_data.sint;        break;
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulong &= rhs.m_data.uint;        break;
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulong &= rhs.m_data.slong;       break;
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulong &= rhs.m_data.ulong;       break;
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulong &= rhs.m_data.slonglong;   break;
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulong &= rhs.m_data.ulonglong;   break;
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.slonglong &= rhs.m_data.sint;        break;
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.slonglong &= rhs.m_data.uint;        break;
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.slonglong &= rhs.m_data.slong;       break;
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.slonglong &= rhs.m_data.ulong;       break;
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.slonglong &= rhs.m_data.slonglong;   break;
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.slonglong &= rhs.m_data.ulonglong;   break;
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (rhs.m_type)
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_void:
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_float:
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_double:
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_long_double:
142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_type = e_void;
142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_sint:            m_data.ulonglong &= rhs.m_data.sint;        break;
142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_uint:            m_data.ulonglong &= rhs.m_data.uint;        break;
142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slong:           m_data.ulonglong &= rhs.m_data.slong;       break;
142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulong:           m_data.ulonglong &= rhs.m_data.ulong;       break;
142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_slonglong:       m_data.ulonglong &= rhs.m_data.slonglong;   break;
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case e_ulonglong:       m_data.ulonglong &= rhs.m_data.ulonglong;   break;
143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::AbsoluteValue()
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_data.sint < 0)
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data.sint = -m_data.sint;
144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_data.slong < 0)
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data.slong = -m_data.slong;
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_data.slonglong < 0)
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data.slonglong = -m_data.slonglong;
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:
146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   return true;
146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       m_data.flt = fabsf(m_data.flt);     return true;
146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      m_data.dbl = fabs(m_data.dbl);      return true;
146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: m_data.ldbl = fabsl(m_data.ldbl);   return true;
146724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::UnaryNegate()
147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:        break;
147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        m_data.sint = -m_data.sint;             return true;
147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        m_data.uint = -m_data.uint;             return true;
148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       m_data.slong = -m_data.slong;           return true;
148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       m_data.ulong = -m_data.ulong;           return true;
148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   m_data.slonglong = -m_data.slonglong;   return true;
148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   m_data.ulonglong = -m_data.ulonglong;   return true;
148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:       m_data.flt = -m_data.flt;               return true;
148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:      m_data.dbl = -m_data.dbl;               return true;
148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double: m_data.ldbl = -m_data.ldbl;             return true;
148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::OnesComplement()
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_type)
149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_sint:        m_data.sint = ~m_data.sint; return true;
149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_uint:        m_data.uint = ~m_data.uint; return true;
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slong:       m_data.slong = ~m_data.slong; return true;
149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulong:       m_data.ulong = ~m_data.ulong; return true;
150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_slonglong:   m_data.slonglong = ~m_data.slonglong; return true;
150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_ulonglong:   m_data.ulonglong = ~m_data.ulonglong; return true;
150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_void:
150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_float:
150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_double:
150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case e_long_double:
150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator+ (const Scalar& lhs, const Scalar& rhs)
151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:            break;
152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        + b->m_data.sint;       break;
152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        + b->m_data.uint;       break;
152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       + b->m_data.slong;      break;
152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       + b->m_data.ulong;      break;
152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   + b->m_data.slonglong;  break;
153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   + b->m_data.ulonglong;  break;
153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         + b->m_data.flt;        break;
153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         + b->m_data.dbl;        break;
153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        + b->m_data.ldbl;       break;
153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator- (const Scalar& lhs, const Scalar& rhs)
154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:            break;
155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        - b->m_data.sint;       break;
155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        - b->m_data.uint;       break;
155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       - b->m_data.slong;      break;
155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       - b->m_data.ulong;      break;
155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   - b->m_data.slonglong;  break;
155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   - b->m_data.ulonglong;  break;
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         - b->m_data.flt;        break;
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         - b->m_data.dbl;        break;
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        - b->m_data.ldbl;       break;
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator/ (const Scalar& lhs, const Scalar& rhs)
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:            break;
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:            if (b->m_data.sint != 0)        { result.m_data.sint = a->m_data.sint/ b->m_data.sint; return result; } break;
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:            if (b->m_data.uint != 0)        { result.m_data.uint = a->m_data.uint / b->m_data.uint; return result; } break;
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:           if (b->m_data.slong != 0)       { result.m_data.slong = a->m_data.slong / b->m_data.slong; return result; } break;
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:           if (b->m_data.ulong != 0)       { result.m_data.ulong = a->m_data.ulong / b->m_data.ulong; return result; } break;
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:       if (b->m_data.slonglong != 0)   { result.m_data.slonglong = a->m_data.slonglong / b->m_data.slonglong; return result; } break;
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:       if (b->m_data.ulonglong != 0)   { result.m_data.ulonglong = a->m_data.ulonglong / b->m_data.ulonglong; return result; } break;
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:           if (b->m_data.flt != 0.0f)      { result.m_data.flt = a->m_data.flt / b->m_data.flt; return result; } break;
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:      if (b->m_data.dbl != 0.0)       { result.m_data.dbl = a->m_data.dbl / b->m_data.dbl; return result; } break;
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double: if (b->m_data.ldbl != 0.0)      { result.m_data.ldbl = a->m_data.ldbl / b->m_data.ldbl; return result; } break;
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For division only, the only way it should make it here is if a promotion failed,
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // or if we are trying to do a divide by zero.
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    result.m_type = Scalar::e_void;
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator* (const Scalar& lhs, const Scalar& rhs)
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:            break;
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        * b->m_data.sint;       break;
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        * b->m_data.uint;       break;
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       * b->m_data.slong;      break;
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       * b->m_data.ulong;      break;
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   * b->m_data.slonglong;  break;
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   * b->m_data.ulonglong;  break;
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         * b->m_data.flt;        break;
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         * b->m_data.dbl;        break;
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        * b->m_data.ldbl;       break;
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator& (const Scalar& lhs, const Scalar& rhs)
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        & b->m_data.sint;       break;
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        & b->m_data.uint;       break;
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       & b->m_data.slong;      break;
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       & b->m_data.ulong;      break;
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   & b->m_data.slonglong;  break;
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   & b->m_data.ulonglong;  break;
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double:
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bitwise AND on floats, doubles of long doubles
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.m_type = Scalar::e_void;
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator| (const Scalar& lhs, const Scalar& rhs)
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        | b->m_data.sint;       break;
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        | b->m_data.uint;       break;
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       | b->m_data.slong;      break;
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       | b->m_data.ulong;      break;
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   | b->m_data.slonglong;  break;
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   | b->m_data.ulonglong;  break;
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double:
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bitwise AND on floats, doubles of long doubles
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.m_type = Scalar::e_void;
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator% (const Scalar& lhs, const Scalar& rhs)
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        % b->m_data.sint;       break;
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        % b->m_data.uint;       break;
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       % b->m_data.slong;      break;
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       % b->m_data.ulong;      break;
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   % b->m_data.slonglong;  break;
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   % b->m_data.ulonglong;  break;
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double:
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bitwise AND on floats, doubles of long doubles
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.m_type = Scalar::e_void;
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Scalar
171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator^ (const Scalar& lhs, const Scalar& rhs)
171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar result;
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (result.m_type)
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        ^ b->m_data.sint;       break;
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        ^ b->m_data.uint;       break;
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       ^ b->m_data.slong;      break;
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       ^ b->m_data.ulong;      break;
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   ^ b->m_data.slonglong;  break;
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   ^ b->m_data.ulonglong;  break;
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_void:
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_float:
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_double:
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Scalar::e_long_double:
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bitwise AND on floats, doubles of long doubles
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.m_type = Scalar::e_void;
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1742fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callananconst Scalar
1743fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callananlldb_private::operator<< (const Scalar& lhs, const Scalar &rhs)
1744fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan{
1745fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan    Scalar result = lhs;
1746fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan    result <<= rhs;
1747fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan    return result;
1748fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan}
1749fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan
1750fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callananconst Scalar
1751fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callananlldb_private::operator>> (const Scalar& lhs, const Scalar &rhs)
1752fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan{
1753fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan    Scalar result = lhs;
1754fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan    result >>= rhs;
1755fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan    return result;
1756fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan}
1757fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the raw unsigned integer without any casting or conversion
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerunsigned int
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::RawUInt () const
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.uint;
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the raw unsigned long without any casting or conversion
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerunsigned long
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::RawULong () const
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.ulong;
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Return the raw unsigned long long without any casting or conversion
177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerunsigned long long
177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar::RawULongLong () const
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data.ulonglong;
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
178136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonScalar::SetValueFromCString (const char *value_str, Encoding encoding, size_t byte_size)
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
1784b822658f49a461f9d6eff177c67c264226b9648eJohnny Chen    if (value_str == NULL || value_str[0] == '\0')
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorString ("Invalid c-string value string.");
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool success = false;
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorString ("Invalid encoding.");
179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size <= sizeof (unsigned long long))
179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 0, &success);
180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!success)
18019c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string value", value_str);
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (!UIntValueIsValidForSize (uval64, byte_size))
180336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %zu byte unsigned integer value", uval64, byte_size);
180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize (byte_size);
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (m_type)
180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
180936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                case e_uint:        m_data.uint = (uint_t)uval64;           break;
181036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                case e_ulong:       m_data.ulong = (ulong_t)uval64;         break;
181136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                case e_ulonglong:   m_data.ulonglong = (ulonglong_t)uval64; break;
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default:
181336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %zu", byte_size);
181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
182036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %zu", byte_size);
182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size <= sizeof (long long))
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint64_t sval64 = Args::StringToSInt64(value_str, INT64_MAX, 0, &success);
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!success)
18309c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("'%s' is not a valid signed integer string value", value_str);
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (!SIntValueIsValidForSize (sval64, byte_size))
183236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %zu byte signed integer value", sval64, byte_size);
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize (byte_size);
183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (m_type)
183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
183836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                case e_sint:        m_data.sint = (sint_t)sval64;           break;
183936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                case e_slong:       m_data.slong = (slong_t)sval64;         break;
184036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                case e_slonglong:   m_data.slonglong = (slonglong_t)sval64; break;
184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default:
184236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    error.SetErrorStringWithFormat ("unsupported signed integer byte size: %zu", byte_size);
184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
184936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            error.SetErrorStringWithFormat ("unsupported signed integer byte size: %zu", byte_size);
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size == sizeof (float))
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (::sscanf (value_str, "%f", &m_data.flt) == 1)
185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_type = e_float;
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
18609c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (byte_size == sizeof (double))
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (::sscanf (value_str, "%lf", &m_data.dbl) == 1)
186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_type = e_double;
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
18679c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (byte_size == sizeof (long double))
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (::sscanf (value_str, "%Lf", &m_data.ldbl) == 1)
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_type = e_long_double;
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
18749c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
187836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            error.SetErrorStringWithFormat ("unsupported float byte size: %zu", byte_size);
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
18849c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton        error.SetErrorString ("vector encoding unsupported.");
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Fail())
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_type = e_void;
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1893ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananError
1894ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananScalar::SetValueFromData (DataExtractor &data, lldb::Encoding encoding, size_t byte_size)
1895ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan{
1896ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    Error error;
1897ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
1898ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    switch (encoding)
1899ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    {
1900ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    case lldb::eEncodingInvalid:
1901ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        error.SetErrorString ("invalid encoding");
1902ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        break;
1903ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    case lldb::eEncodingVector:
1904ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        error.SetErrorString ("vector encoding unsupported");
1905ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        break;
1906ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    case lldb::eEncodingUint:
1907ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        {
1908ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            lldb::offset_t offset;
1909ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
1910ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            switch (byte_size)
1911ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            {
1912ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 1: operator=((uint8_t)data.GetU8(&offset)); break;
1913ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 2: operator=((uint16_t)data.GetU16(&offset)); break;
1914ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 4: operator=((uint32_t)data.GetU32(&offset)); break;
1915ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 8: operator=((uint64_t)data.GetU64(&offset)); break;
1916ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            default:
1917ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %zu", byte_size);
1918ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                break;
1919ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            }
1920ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        }
1921ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        break;
1922ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    case lldb::eEncodingSint:
1923ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        {
1924ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            lldb::offset_t offset;
1925ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
1926ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            switch (byte_size)
1927ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            {
1928ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 1: operator=((int8_t)data.GetU8(&offset)); break;
1929ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 2: operator=((int16_t)data.GetU16(&offset)); break;
1930ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 4: operator=((int32_t)data.GetU32(&offset)); break;
1931ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            case 8: operator=((int64_t)data.GetU64(&offset)); break;
1932ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            default:
1933ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                error.SetErrorStringWithFormat ("unsupported signed integer byte size: %zu", byte_size);
1934ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                break;
1935ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            }
1936ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        }
1937ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        break;
1938ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    case lldb::eEncodingIEEE754:
1939ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        {
1940ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            lldb::offset_t offset;
1941ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
1942ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            if (byte_size == sizeof (float))
1943ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                operator=((float)data.GetFloat(&offset));
1944ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            else if (byte_size == sizeof (double))
1945ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                operator=((double)data.GetDouble(&offset));
1946ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            else if (byte_size == sizeof (long double))
1947ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                operator=((long double)data.GetLongDouble(&offset));
1948ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            else
1949ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan                error.SetErrorStringWithFormat ("unsupported float byte size: %zu", byte_size);
1950ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        }
1951ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        break;
1952ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    }
1953ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
1954ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    return error;
1955ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan}
1956ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
19585fba9eec8d79109bf44d5b0a59dda377c65544c5Greg ClaytonScalar::SignExtend (uint32_t sign_bit_pos)
19595fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton{
19605fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton    const uint32_t max_bit_pos = GetByteSize() * 8;
19615fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton
19625fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton    if (sign_bit_pos < max_bit_pos)
19635fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton    {
19645fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        switch (m_type)
19655fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        {
19665fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_void:
19675fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_float:
19685fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_double:
19695fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_long_double:
19705fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            return false;
19715fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton
19725fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_sint:
19735fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_uint:
19745fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            if (max_bit_pos == sign_bit_pos)
19755fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                return true;
19765fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            else if (sign_bit_pos < (max_bit_pos-1))
19775fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            {
19785fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                unsigned int sign_bit = 1u << sign_bit_pos;
19795fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                if (m_data.uint & sign_bit)
19805fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                {
19815fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                    const unsigned int mask = ~(sign_bit) + 1u;
19825fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                    m_data.uint |= mask;
19835fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                }
19845fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                return true;
19855fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            }
19865fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            break;
19875fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton
19885fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_slong:
19895fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_ulong:
19905fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            if (max_bit_pos == sign_bit_pos)
19915fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                return true;
19925fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            else if (sign_bit_pos < (max_bit_pos-1))
19935fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            {
19945fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                unsigned long sign_bit = 1ul << sign_bit_pos;
19954e56cd9fb11ab938f581c714c3f26a44ee1cbacaGreg Clayton                if (m_data.ulong & sign_bit)
19965fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                {
19975fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                    const unsigned long mask = ~(sign_bit) + 1ul;
19984e56cd9fb11ab938f581c714c3f26a44ee1cbacaGreg Clayton                    m_data.ulong |= mask;
19995fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                }
20005fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                return true;
20015fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            }
20025fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            break;
20035fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton
20045fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_slonglong:
20055fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        case Scalar::e_ulonglong:
20065fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            if (max_bit_pos == sign_bit_pos)
20075fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                return true;
20085fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            else if (sign_bit_pos < (max_bit_pos-1))
20095fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            {
20105fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                unsigned long long sign_bit = 1ull << sign_bit_pos;
20114e56cd9fb11ab938f581c714c3f26a44ee1cbacaGreg Clayton                if (m_data.ulonglong & sign_bit)
20125fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                {
20135fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                    const unsigned long long mask = ~(sign_bit) + 1ull;
20144e56cd9fb11ab938f581c714c3f26a44ee1cbacaGreg Clayton                    m_data.ulonglong |= mask;
20155fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                }
20165fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton                return true;
20175fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            }
20185fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton            break;
20195fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton        }
20205fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton    }
20215fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton    return false;
20225fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton}
20235fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton
202436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonScalar::GetAsMemoryData (void *dst,
202636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                         size_t dst_len,
2027c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                         lldb::ByteOrder dst_byte_order,
2028c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                         Error &error) const
2029c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{
2030c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    // Get a data extractor that points to the native scalar data
2031c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    DataExtractor data;
2032c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (!GetData(data))
2033c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    {
2034c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        error.SetErrorString ("invalid scalar value");
2035c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        return 0;
2036c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    }
2037c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2038c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    const size_t src_len = data.GetByteSize();
2039c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2040c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    // Prepare a memory buffer that contains some or all of the register value
204136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t bytes_copied = data.CopyByteOrderedData (0,                  // src offset
2042c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            src_len,            // src length
2043c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            dst,                // dst buffer
2044c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            dst_len,            // dst length
2045c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            dst_byte_order);    // dst byte order
2046c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (bytes_copied == 0)
2047c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        error.SetErrorString ("failed to copy data");
2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
2049c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    return bytes_copied;
2050c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton}
2051c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
20525fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Claytonbool
20531716ad73618aab3cff4d82c3adc11a88ef76273dGreg ClaytonScalar::ExtractBitfield (uint32_t bit_size,
20541716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                         uint32_t bit_offset)
20551716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton{
20561716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    if (bit_size == 0)
20571716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        return true;
20581716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
20591716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    uint32_t msbit = bit_offset + bit_size - 1;
20601716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    uint32_t lsbit = bit_offset;
20611716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    switch (m_type)
20621716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    {
20631716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_void:
20641716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            break;
20651716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
20661716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case e_float:
206736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (sizeof(m_data.flt) == sizeof(sint_t))
206836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
206936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            else if (sizeof(m_data.flt) == sizeof(ulong_t))
207036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
207136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            else if (sizeof(m_data.flt) == sizeof(ulonglong_t))
207236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
20731716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            else
20741716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                return false;
20751716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
20761716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
20771716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case e_double:
207836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (sizeof(m_data.dbl) == sizeof(sint_t))
20791716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
208036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            else if (sizeof(m_data.dbl) == sizeof(ulong_t))
20811716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
208236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            else if (sizeof(m_data.dbl) == sizeof(ulonglong_t))
20831716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
20841716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            else
20851716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                return false;
20861716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
20871716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
20881716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case e_long_double:
208936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            if (sizeof(m_data.ldbl) == sizeof(sint_t))
20901716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
209136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            else if (sizeof(m_data.ldbl) == sizeof(ulong_t))
20921716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
209336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            else if (sizeof(m_data.ldbl) == sizeof(ulonglong_t))
20941716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
20951716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            else
20961716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton                return false;
20971716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
20981716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
20991716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_sint:
210036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
21011716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
21021716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21031716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_uint:
210436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            m_data.uint = (uint_t)UnsignedBits (m_data.uint, msbit, lsbit);
21051716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
21061716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21071716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_slong:
210836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
21091716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
21101716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21111716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_ulong:
211236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            m_data.ulong = (ulong_t)UnsignedBits (m_data.ulong, msbit, lsbit);
21131716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
21141716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21151716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_slonglong:
211636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
21171716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
21181716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21191716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton        case Scalar::e_ulonglong:
212036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            m_data.ulonglong = (ulonglong_t)UnsignedBits (m_data.ulonglong, msbit, lsbit);
21211716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton            return true;
21221716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    }
21231716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton    return false;
21241716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton}
21251716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21261716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21271716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21281716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21291716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton
21301716ad73618aab3cff4d82c3adc11a88ef76273dGreg Claytonbool
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator== (const Scalar& lhs, const Scalar& rhs)
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If either entry is void then we can just compare the types
213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return lhs.m_type == rhs.m_type;
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_void:            break;
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_sint:            return a->m_data.sint       == b->m_data.sint;
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_uint:            return a->m_data.uint       == b->m_data.uint;
214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slong:           return a->m_data.slong      == b->m_data.slong;
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulong:           return a->m_data.ulong      == b->m_data.ulong;
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slonglong:       return a->m_data.slonglong  == b->m_data.slonglong;
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulonglong:       return a->m_data.ulonglong  == b->m_data.ulonglong;
214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_float:           return a->m_data.flt        == b->m_data.flt;
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_double:      return a->m_data.dbl        == b->m_data.dbl;
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_long_double: return a->m_data.ldbl       == b->m_data.ldbl;
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator!= (const Scalar& lhs, const Scalar& rhs)
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If either entry is void then we can just compare the types
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return lhs.m_type != rhs.m_type;
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;  // A temp value that might get a copy of either promoted value
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_void:            break;
216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_sint:            return a->m_data.sint       != b->m_data.sint;
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_uint:            return a->m_data.uint       != b->m_data.uint;
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slong:           return a->m_data.slong      != b->m_data.slong;
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulong:           return a->m_data.ulong      != b->m_data.ulong;
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slonglong:       return a->m_data.slonglong  != b->m_data.slonglong;
217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulonglong:       return a->m_data.ulonglong  != b->m_data.ulonglong;
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_float:           return a->m_data.flt        != b->m_data.flt;
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_double:      return a->m_data.dbl        != b->m_data.dbl;
217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_long_double: return a->m_data.ldbl       != b->m_data.ldbl;
217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator< (const Scalar& lhs, const Scalar& rhs)
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_void:            break;
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_sint:            return a->m_data.sint       < b->m_data.sint;
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_uint:            return a->m_data.uint       < b->m_data.uint;
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slong:           return a->m_data.slong      < b->m_data.slong;
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulong:           return a->m_data.ulong      < b->m_data.ulong;
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slonglong:       return a->m_data.slonglong  < b->m_data.slonglong;
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulonglong:       return a->m_data.ulonglong  < b->m_data.ulonglong;
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_float:           return a->m_data.flt        < b->m_data.flt;
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_double:      return a->m_data.dbl        < b->m_data.dbl;
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_long_double: return a->m_data.ldbl       < b->m_data.ldbl;
220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator<= (const Scalar& lhs, const Scalar& rhs)
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_void:            break;
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_sint:            return a->m_data.sint       <= b->m_data.sint;
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_uint:            return a->m_data.uint       <= b->m_data.uint;
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slong:           return a->m_data.slong      <= b->m_data.slong;
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulong:           return a->m_data.ulong      <= b->m_data.ulong;
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slonglong:       return a->m_data.slonglong  <= b->m_data.slonglong;
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulonglong:       return a->m_data.ulonglong  <= b->m_data.ulonglong;
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_float:           return a->m_data.flt        <= b->m_data.flt;
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_double:      return a->m_data.dbl        <= b->m_data.dbl;
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_long_double: return a->m_data.ldbl       <= b->m_data.ldbl;
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator> (const Scalar& lhs, const Scalar& rhs)
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_void:            break;
224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_sint:            return a->m_data.sint       > b->m_data.sint;
224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_uint:            return a->m_data.uint       > b->m_data.uint;
224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slong:           return a->m_data.slong      > b->m_data.slong;
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulong:           return a->m_data.ulong      > b->m_data.ulong;
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slonglong:       return a->m_data.slonglong  > b->m_data.slonglong;
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulonglong:       return a->m_data.ulonglong  > b->m_data.ulonglong;
225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_float:           return a->m_data.flt        > b->m_data.flt;
225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_double:      return a->m_data.dbl        > b->m_data.dbl;
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_long_double: return a->m_data.ldbl       > b->m_data.ldbl;
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator>= (const Scalar& lhs, const Scalar& rhs)
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar temp_value;
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* a;
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Scalar* b;
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_void:            break;
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_sint:            return a->m_data.sint       >= b->m_data.sint;
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_uint:            return a->m_data.uint       >= b->m_data.uint;
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slong:           return a->m_data.slong      >= b->m_data.slong;
227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulong:           return a->m_data.ulong      >= b->m_data.ulong;
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_slonglong:       return a->m_data.slonglong  >= b->m_data.slonglong;
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_ulonglong:       return a->m_data.ulonglong  >= b->m_data.ulonglong;
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_float:           return a->m_data.flt        >= b->m_data.flt;
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_double:      return a->m_data.dbl        >= b->m_data.dbl;
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Scalar::e_long_double: return a->m_data.ldbl       >= b->m_data.ldbl;
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2286