blob: 0022c348bfeec85403d90e06cf4661c822d4dc55 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Scalar.cpp ----------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/Scalar.h"
11
12#include <math.h>
Daniel Malead01b2952012-11-29 21:49:15 +000013#include <inttypes.h>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014
Jim Ingham40af72e2010-06-15 19:49:27 +000015#include "lldb/Interpreter/Args.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include "lldb/Core/Error.h"
17#include "lldb/Core/Stream.h"
18#include "lldb/Core/DataExtractor.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000019#include "lldb/Host/Endian.h"
Vince Harron5275aaa2015-01-15 20:08:35 +000020#include "lldb/Host/StringConvert.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
Greg Claytondcad5022011-12-29 01:26:56 +000022#include "Plugins/Process/Utility/InstructionUtils.h"
23
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024using namespace lldb;
25using namespace lldb_private;
26
27//----------------------------------------------------------------------
28// Promote to max type currently follows the ANSI C rule for type
29// promotion in expressions.
30//----------------------------------------------------------------------
31static Scalar::Type
32PromoteToMaxType
33(
34 const Scalar& lhs, // The const left hand side object
35 const Scalar& rhs, // The const right hand side object
36 Scalar& temp_value, // A modifiable temp value than can be used to hold either the promoted lhs or rhs object
37 const Scalar* &promoted_lhs_ptr, // Pointer to the resulting possibly promoted value of lhs (at most one of lhs/rhs will get promoted)
38 const Scalar* &promoted_rhs_ptr // Pointer to the resulting possibly promoted value of rhs (at most one of lhs/rhs will get promoted)
39)
40{
41 Scalar result;
42 // Initialize the promoted values for both the right and left hand side values
43 // to be the objects themselves. If no promotion is needed (both right and left
44 // have the same type), then the temp_value will not get used.
45 promoted_lhs_ptr = &lhs;
46 promoted_rhs_ptr = &rhs;
47 // Extract the types of both the right and left hand side values
48 Scalar::Type lhs_type = lhs.GetType();
49 Scalar::Type rhs_type = rhs.GetType();
50
51 if (lhs_type > rhs_type)
52 {
53 // Right hand side need to be promoted
54 temp_value = rhs; // Copy right hand side into the temp value
55 if (temp_value.Promote(lhs_type)) // Promote it
56 promoted_rhs_ptr = &temp_value; // Update the pointer for the promoted right hand side
57 }
58 else if (lhs_type < rhs_type)
59 {
60 // Left hand side need to be promoted
61 temp_value = lhs; // Copy left hand side value into the temp value
62 if (temp_value.Promote(rhs_type)) // Promote it
63 promoted_lhs_ptr = &temp_value; // Update the pointer for the promoted left hand side
64 }
65
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +000066 // Make sure our type promotion worked as expected
Chris Lattner30fdc8d2010-06-08 16:52:24 +000067 if (promoted_lhs_ptr->GetType() == promoted_rhs_ptr->GetType())
68 return promoted_lhs_ptr->GetType(); // Return the resulting max type
69
70 // Return the void type (zero) if we fail to promote either of the values.
71 return Scalar::e_void;
72}
73
74
75//----------------------------------------------------------------------
76// Scalar constructor
77//----------------------------------------------------------------------
78Scalar::Scalar() :
79 m_type(e_void),
80 m_data()
81{
82}
83
84//----------------------------------------------------------------------
85// Scalar copy constructor
86//----------------------------------------------------------------------
87Scalar::Scalar(const Scalar& rhs) :
88 m_type(rhs.m_type),
89 m_data(rhs.m_data) // TODO: verify that for C++ this will correctly copy the union??
90{
91}
92
93//Scalar::Scalar(const RegisterValue& reg) :
94// m_type(e_void),
95// m_data()
96//{
97// switch (reg.info.encoding)
98// {
99// case eEncodingUint: // unsigned integer
100// switch (reg.info.byte_size)
101// {
102// case 1: m_type = e_uint; m_data.uint = reg.value.uint8; break;
103// case 2: m_type = e_uint; m_data.uint = reg.value.uint16; break;
104// case 4: m_type = e_uint; m_data.uint = reg.value.uint32; break;
105// case 8: m_type = e_ulonglong; m_data.ulonglong = reg.value.uint64; break;
106// break;
107// }
108// break;
109//
110// case eEncodingSint: // signed integer
111// switch (reg.info.byte_size)
112// {
113// case 1: m_type = e_sint; m_data.sint = reg.value.sint8; break;
114// case 2: m_type = e_sint; m_data.sint = reg.value.sint16; break;
115// case 4: m_type = e_sint; m_data.sint = reg.value.sint32; break;
116// case 8: m_type = e_slonglong; m_data.slonglong = reg.value.sint64; break;
117// break;
118// }
119// break;
120//
121// case eEncodingIEEE754: // float
122// switch (reg.info.byte_size)
123// {
124// case 4: m_type = e_float; m_data.flt = reg.value.float32; break;
125// case 8: m_type = e_double; m_data.dbl = reg.value.float64; break;
126// break;
127// }
128// break;
129// case eEncodingVector: // vector registers
130// break;
131// }
132//}
133
134bool
135Scalar::GetData (DataExtractor &data, size_t limit_byte_size) const
136{
137 size_t byte_size = GetByteSize();
138 if (byte_size > 0)
139 {
140 if (limit_byte_size < byte_size)
141 {
Greg Clayton7fb56d02011-02-01 01:31:41 +0000142 if (lldb::endian::InlHostByteOrder() == eByteOrderLittle)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000143 {
144 // On little endian systems if we want fewer bytes from the
145 // current type we just specify fewer bytes since the LSByte
146 // is first...
Greg Clayton7fb56d02011-02-01 01:31:41 +0000147 data.SetData((uint8_t*)&m_data, limit_byte_size, lldb::endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000148 }
Greg Clayton7fb56d02011-02-01 01:31:41 +0000149 else if (lldb::endian::InlHostByteOrder() == eByteOrderBig)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000150 {
151 // On big endian systems if we want fewer bytes from the
152 // current type have to advance our initial byte pointer and
153 // trim down the number of bytes since the MSByte is first
Greg Clayton7fb56d02011-02-01 01:31:41 +0000154 data.SetData(((uint8_t*)&m_data) + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155 }
156 }
157 else
158 {
159 // We want all of the data
Greg Clayton7fb56d02011-02-01 01:31:41 +0000160 data.SetData((uint8_t*)&m_data, byte_size, lldb::endian::InlHostByteOrder());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000161 }
162 return true;
163 }
164 data.Clear();
165 return false;
166}
167
168size_t
169Scalar::GetByteSize() const
170{
171 switch (m_type)
172 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000173 case e_void:
174 break;
175 case e_sint: return sizeof(m_data.sint);
176 case e_uint: return sizeof(m_data.uint);
177 case e_slong: return sizeof(m_data.slong);
178 case e_ulong: return sizeof(m_data.ulong);
179 case e_slonglong: return sizeof(m_data.slonglong);
180 case e_ulonglong: return sizeof(m_data.ulonglong);
181 case e_float: return sizeof(m_data.flt);
182 case e_double: return sizeof(m_data.dbl);
183 case e_long_double: return sizeof(m_data.ldbl);
184 }
185 return 0;
186}
187
188bool
189Scalar::IsZero() const
190{
191 switch (m_type)
192 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193 case e_void:
194 break;
195 case e_sint: return m_data.sint == 0;
196 case e_uint: return m_data.uint == 0;
197 case e_slong: return m_data.slong == 0;
198 case e_ulong: return m_data.ulong == 0;
199 case e_slonglong: return m_data.slonglong == 0;
200 case e_ulonglong: return m_data.ulonglong == 0;
201 case e_float: return m_data.flt == 0.0f;
202 case e_double: return m_data.dbl == 0.0;
203 case e_long_double: return m_data.ldbl == 0.0;
204 }
205 return false;
206}
207
208void
209Scalar::GetValue (Stream *s, bool show_type) const
210{
211 if (show_type)
212 s->Printf("(%s) ", GetTypeAsCString());
213
214 switch (m_type)
215 {
216 case e_void:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000217 break;
218 case e_sint: s->Printf("%i", m_data.sint); break;
219 case e_uint: s->Printf("0x%8.8x", m_data.uint); break;
220 case e_slong: s->Printf("%li", m_data.slong); break;
221 case e_ulong: s->Printf("0x%8.8lx", m_data.ulong); break;
222 case e_slonglong: s->Printf("%lli", m_data.slonglong); break;
223 case e_ulonglong: s->Printf("0x%16.16llx", m_data.ulonglong); break;
224 case e_float: s->Printf("%f", m_data.flt); break;
225 case e_double: s->Printf("%g", m_data.dbl); break;
226 case e_long_double: s->Printf("%Lg", m_data.ldbl); break;
227 }
228}
229
230const char *
231Scalar::GetTypeAsCString() const
232{
233 switch (m_type)
234 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000235 case e_void: return "void";
236 case e_sint: return "int";
237 case e_uint: return "unsigned int";
238 case e_slong: return "long";
239 case e_ulong: return "unsigned long";
240 case e_slonglong: return "long long";
241 case e_ulonglong: return "unsigned long long";
242 case e_float: return "float";
243 case e_double: return "double";
244 case e_long_double: return "long double";
245 }
246 return "<invalid Scalar type>";
247}
248
249
250
251//----------------------------------------------------------------------
252// Scalar copy constructor
253//----------------------------------------------------------------------
254Scalar&
255Scalar::operator=(const Scalar& rhs)
256{
257 if (this != &rhs)
258 {
259 m_type = rhs.m_type;
260 ::memcpy (&m_data, &rhs.m_data, sizeof(m_data));
261 }
262 return *this;
263}
264
265Scalar&
266Scalar::operator= (const int v)
267{
268 m_type = e_sint;
269 m_data.sint = v;
270 return *this;
271}
272
273
274Scalar&
275Scalar::operator= (unsigned int v)
276{
277 m_type = e_uint;
278 m_data.uint = v;
279 return *this;
280}
281
282Scalar&
283Scalar::operator= (long v)
284{
285 m_type = e_slong;
286 m_data.slong = v;
287 return *this;
288}
289
290Scalar&
291Scalar::operator= (unsigned long v)
292{
293 m_type = e_ulong;
294 m_data.ulong = v;
295 return *this;
296}
297
298Scalar&
299Scalar::operator= (long long v)
300{
301 m_type = e_slonglong;
302 m_data.slonglong = v;
303 return *this;
304}
305
306Scalar&
307Scalar::operator= (unsigned long long v)
308{
309 m_type = e_ulonglong;
310 m_data.ulonglong = v;
311 return *this;
312}
313
314Scalar&
315Scalar::operator= (float v)
316{
317 m_type = e_float;
318 m_data.flt = v;
319 return *this;
320}
321
322Scalar&
323Scalar::operator= (double v)
324{
325 m_type = e_double;
326 m_data.dbl = v;
327 return *this;
328}
329
330Scalar&
331Scalar::operator= (long double v)
332{
333 m_type = e_long_double;
334 m_data.ldbl = v;
335 return *this;
336}
337
338//----------------------------------------------------------------------
339// Destructor
340//----------------------------------------------------------------------
341Scalar::~Scalar()
342{
343}
344
345bool
346Scalar::Promote(Scalar::Type type)
347{
348 bool success = false;
349 switch (m_type)
350 {
351 case e_void:
352 break;
353
354 case e_sint:
355 switch (type)
356 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000357 case e_void: break;
358 case e_sint: success = true; break;
359 case e_uint: m_data.uint = m_data.sint; success = true; break;
360 case e_slong: m_data.slong = m_data.sint; success = true; break;
361 case e_ulong: m_data.ulong = m_data.sint; success = true; break;
362 case e_slonglong: m_data.slonglong = m_data.sint; success = true; break;
363 case e_ulonglong: m_data.ulonglong = m_data.sint; success = true; break;
364 case e_float: m_data.flt = m_data.sint; success = true; break;
365 case e_double: m_data.dbl = m_data.sint; success = true; break;
366 case e_long_double: m_data.ldbl = m_data.sint; success = true; break;
367 }
368 break;
369
370 case e_uint:
371 switch (type)
372 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000373 case e_void:
374 case e_sint: break;
375 case e_uint: success = true; break;
376 case e_slong: m_data.slong = m_data.uint; success = true; break;
377 case e_ulong: m_data.ulong = m_data.uint; success = true; break;
378 case e_slonglong: m_data.slonglong = m_data.uint; success = true; break;
379 case e_ulonglong: m_data.ulonglong = m_data.uint; success = true; break;
380 case e_float: m_data.flt = m_data.uint; success = true; break;
381 case e_double: m_data.dbl = m_data.uint; success = true; break;
382 case e_long_double: m_data.ldbl = m_data.uint; success = true; break;
383 }
384 break;
385
386 case e_slong:
387 switch (type)
388 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000389 case e_void:
390 case e_sint:
391 case e_uint: break;
392 case e_slong: success = true; break;
393 case e_ulong: m_data.ulong = m_data.slong; success = true; break;
394 case e_slonglong: m_data.slonglong = m_data.slong; success = true; break;
395 case e_ulonglong: m_data.ulonglong = m_data.slong; success = true; break;
396 case e_float: m_data.flt = m_data.slong; success = true; break;
397 case e_double: m_data.dbl = m_data.slong; success = true; break;
398 case e_long_double: m_data.ldbl = m_data.slong; success = true; break;
399 }
400 break;
401
402 case e_ulong:
403 switch (type)
404 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000405 case e_void:
406 case e_sint:
407 case e_uint:
408 case e_slong: break;
409 case e_ulong: success = true; break;
410 case e_slonglong: m_data.slonglong = m_data.ulong; success = true; break;
411 case e_ulonglong: m_data.ulonglong = m_data.ulong; success = true; break;
412 case e_float: m_data.flt = m_data.ulong; success = true; break;
413 case e_double: m_data.dbl = m_data.ulong; success = true; break;
414 case e_long_double: m_data.ldbl = m_data.ulong; success = true; break;
415 }
416 break;
417
418 case e_slonglong:
419 switch (type)
420 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421 case e_void:
422 case e_sint:
423 case e_uint:
424 case e_slong:
425 case e_ulong: break;
426 case e_slonglong: success = true; break;
427 case e_ulonglong: m_data.ulonglong = m_data.slonglong; success = true; break;
428 case e_float: m_data.flt = m_data.slonglong; success = true; break;
429 case e_double: m_data.dbl = m_data.slonglong; success = true; break;
430 case e_long_double: m_data.ldbl = m_data.slonglong; success = true; break;
431 }
432 break;
433
434 case e_ulonglong:
435 switch (type)
436 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000437 case e_void:
438 case e_sint:
439 case e_uint:
440 case e_slong:
441 case e_ulong:
442 case e_slonglong: break;
443 case e_ulonglong: success = true; break;
444 case e_float: m_data.flt = m_data.ulonglong; success = true; break;
445 case e_double: m_data.dbl = m_data.ulonglong; success = true; break;
446 case e_long_double: m_data.ldbl = m_data.ulonglong; success = true; break;
447 }
448 break;
449
450 case e_float:
451 switch (type)
452 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000453 case e_void:
454 case e_sint:
455 case e_uint:
456 case e_slong:
457 case e_ulong:
458 case e_slonglong:
459 case e_ulonglong: break;
460 case e_float: success = true; break;
461 case e_double: m_data.dbl = m_data.flt; success = true; break;
462 case e_long_double: m_data.ldbl = m_data.ulonglong; success = true; break;
463 }
464 break;
465
466 case e_double:
467 switch (type)
468 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469 case e_void:
470 case e_sint:
471 case e_uint:
472 case e_slong:
473 case e_ulong:
474 case e_slonglong:
475 case e_ulonglong:
476 case e_float: break;
477 case e_double: success = true; break;
478 case e_long_double: m_data.ldbl = m_data.dbl; success = true; break;
479 }
480 break;
481
482 case e_long_double:
483 switch (type)
484 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485 case e_void:
486 case e_sint:
487 case e_uint:
488 case e_slong:
489 case e_ulong:
490 case e_slonglong:
491 case e_ulonglong:
492 case e_float:
493 case e_double: break;
494 case e_long_double: success = true; break;
495 }
496 break;
497 }
498
499 if (success)
500 m_type = type;
501 return success;
502}
503
504const char *
505Scalar::GetValueTypeAsCString (Scalar::Type type)
506{
507 switch (type)
508 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000509 case e_void: return "void";
510 case e_sint: return "int";
511 case e_uint: return "unsigned int";
512 case e_slong: return "long";
513 case e_ulong: return "unsigned long";
514 case e_slonglong: return "long long";
515 case e_ulonglong: return "unsigned long long";
516 case e_float: return "float";
517 case e_double: return "double";
518 case e_long_double: return "long double";
519 }
520 return "???";
521}
522
523
524Scalar::Type
525Scalar::GetValueTypeForSignedIntegerWithByteSize (size_t byte_size)
526{
Greg Claytonc7bece562013-01-25 18:06:21 +0000527 if (byte_size <= sizeof(sint_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000528 return e_sint;
Greg Claytonc7bece562013-01-25 18:06:21 +0000529 if (byte_size <= sizeof(slong_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000530 return e_slong;
Greg Claytonc7bece562013-01-25 18:06:21 +0000531 if (byte_size <= sizeof(slonglong_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000532 return e_slonglong;
533 return e_void;
534}
535
536Scalar::Type
537Scalar::GetValueTypeForUnsignedIntegerWithByteSize (size_t byte_size)
538{
Greg Claytonc7bece562013-01-25 18:06:21 +0000539 if (byte_size <= sizeof(uint_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000540 return e_uint;
Greg Claytonc7bece562013-01-25 18:06:21 +0000541 if (byte_size <= sizeof(ulong_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000542 return e_ulong;
Greg Claytonc7bece562013-01-25 18:06:21 +0000543 if (byte_size <= sizeof(ulonglong_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000544 return e_ulonglong;
545 return e_void;
546}
547
548Scalar::Type
549Scalar::GetValueTypeForFloatWithByteSize (size_t byte_size)
550{
Greg Claytonc7bece562013-01-25 18:06:21 +0000551 if (byte_size == sizeof(float_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000552 return e_float;
Greg Claytonc7bece562013-01-25 18:06:21 +0000553 if (byte_size == sizeof(double_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554 return e_double;
Greg Claytonc7bece562013-01-25 18:06:21 +0000555 if (byte_size == sizeof(long_double_t))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000556 return e_long_double;
557 return e_void;
558}
559
560bool
561Scalar::Cast(Scalar::Type type)
562{
563 bool success = false;
564 switch (m_type)
565 {
566 case e_void:
567 break;
568
569 case e_sint:
570 switch (type)
571 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000572 case e_void: break;
573 case e_sint: success = true; break;
574 case e_uint: m_data.uint = m_data.sint; success = true; break;
575 case e_slong: m_data.slong = m_data.sint; success = true; break;
576 case e_ulong: m_data.ulong = m_data.sint; success = true; break;
577 case e_slonglong: m_data.slonglong = m_data.sint; success = true; break;
578 case e_ulonglong: m_data.ulonglong = m_data.sint; success = true; break;
579 case e_float: m_data.flt = m_data.sint; success = true; break;
580 case e_double: m_data.dbl = m_data.sint; success = true; break;
581 case e_long_double: m_data.ldbl = m_data.sint; success = true; break;
582 }
583 break;
584
585 case e_uint:
586 switch (type)
587 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000588 case e_void:
589 case e_sint: m_data.sint = m_data.uint; success = true; break;
590 case e_uint: success = true; break;
591 case e_slong: m_data.slong = m_data.uint; success = true; break;
592 case e_ulong: m_data.ulong = m_data.uint; success = true; break;
593 case e_slonglong: m_data.slonglong = m_data.uint; success = true; break;
594 case e_ulonglong: m_data.ulonglong = m_data.uint; success = true; break;
595 case e_float: m_data.flt = m_data.uint; success = true; break;
596 case e_double: m_data.dbl = m_data.uint; success = true; break;
597 case e_long_double: m_data.ldbl = m_data.uint; success = true; break;
598 }
599 break;
600
601 case e_slong:
602 switch (type)
603 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000604 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000605 case e_sint: m_data.sint = (sint_t)m_data.slong; success = true; break;
606 case e_uint: m_data.uint = (uint_t)m_data.slong; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000607 case e_slong: success = true; break;
608 case e_ulong: m_data.ulong = m_data.slong; success = true; break;
609 case e_slonglong: m_data.slonglong = m_data.slong; success = true; break;
610 case e_ulonglong: m_data.ulonglong = m_data.slong; success = true; break;
611 case e_float: m_data.flt = m_data.slong; success = true; break;
612 case e_double: m_data.dbl = m_data.slong; success = true; break;
613 case e_long_double: m_data.ldbl = m_data.slong; success = true; break;
614 }
615 break;
616
617 case e_ulong:
618 switch (type)
619 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000620 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000621 case e_sint: m_data.sint = (sint_t)m_data.ulong; success = true; break;
622 case e_uint: m_data.uint = (uint_t)m_data.ulong; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000623 case e_slong: m_data.slong = m_data.ulong; success = true; break;
624 case e_ulong: success = true; break;
625 case e_slonglong: m_data.slonglong = m_data.ulong; success = true; break;
626 case e_ulonglong: m_data.ulonglong = m_data.ulong; success = true; break;
627 case e_float: m_data.flt = m_data.ulong; success = true; break;
628 case e_double: m_data.dbl = m_data.ulong; success = true; break;
629 case e_long_double: m_data.ldbl = m_data.ulong; success = true; break;
630 }
631 break;
632
633 case e_slonglong:
634 switch (type)
635 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000636 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000637 case e_sint: m_data.sint = (sint_t)m_data.slonglong; success = true; break;
638 case e_uint: m_data.uint = (uint_t)m_data.slonglong; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639 case e_slong: m_data.slong = m_data.slonglong; success = true; break;
640 case e_ulong: m_data.ulong = m_data.slonglong; success = true; break;
641 case e_slonglong: success = true; break;
642 case e_ulonglong: m_data.ulonglong = m_data.slonglong; success = true; break;
643 case e_float: m_data.flt = m_data.slonglong; success = true; break;
644 case e_double: m_data.dbl = m_data.slonglong; success = true; break;
645 case e_long_double: m_data.ldbl = m_data.slonglong; success = true; break;
646 }
647 break;
648
649 case e_ulonglong:
650 switch (type)
651 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000652 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000653 case e_sint: m_data.sint = (sint_t)m_data.ulonglong; success = true; break;
654 case e_uint: m_data.uint = (uint_t)m_data.ulonglong; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000655 case e_slong: m_data.slong = m_data.ulonglong; success = true; break;
656 case e_ulong: m_data.ulong = m_data.ulonglong; success = true; break;
657 case e_slonglong: m_data.slonglong = m_data.ulonglong; success = true; break;
658 case e_ulonglong: success = true; break;
659 case e_float: m_data.flt = m_data.ulonglong; success = true; break;
660 case e_double: m_data.dbl = m_data.ulonglong; success = true; break;
661 case e_long_double: m_data.ldbl = m_data.ulonglong; success = true; break;
662 }
663 break;
664
665 case e_float:
666 switch (type)
667 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000668 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000669 case e_sint: m_data.sint = (sint_t)m_data.flt; success = true; break;
670 case e_uint: m_data.uint = (uint_t)m_data.flt; success = true; break;
671 case e_slong: m_data.slong = (slong_t)m_data.flt; success = true; break;
672 case e_ulong: m_data.ulong = (ulong_t)m_data.flt; success = true; break;
673 case e_slonglong: m_data.slonglong = (slonglong_t)m_data.flt; success = true; break;
674 case e_ulonglong: m_data.ulonglong = (ulonglong_t)m_data.flt; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000675 case e_float: success = true; break;
Greg Claytonc7bece562013-01-25 18:06:21 +0000676 case e_double: m_data.dbl = m_data.flt; success = true; break;
677 case e_long_double: m_data.ldbl = m_data.flt; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000678 }
679 break;
680
681 case e_double:
682 switch (type)
683 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000684 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000685 case e_sint: m_data.sint = (sint_t)m_data.dbl; success = true; break;
686 case e_uint: m_data.uint = (uint_t)m_data.dbl; success = true; break;
687 case e_slong: m_data.slong = (slong_t)m_data.dbl; success = true; break;
688 case e_ulong: m_data.ulong = (ulong_t)m_data.dbl; success = true; break;
689 case e_slonglong: m_data.slonglong = (slonglong_t)m_data.dbl; success = true; break;
690 case e_ulonglong: m_data.ulonglong = (ulonglong_t)m_data.dbl; success = true; break;
691 case e_float: m_data.flt = (float_t)m_data.dbl; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000692 case e_double: success = true; break;
Greg Claytonc7bece562013-01-25 18:06:21 +0000693 case e_long_double: m_data.ldbl = m_data.dbl; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000694 }
695 break;
696
697 case e_long_double:
698 switch (type)
699 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000700 case e_void:
Greg Claytonc7bece562013-01-25 18:06:21 +0000701 case e_sint: m_data.sint = (sint_t)m_data.ldbl; success = true; break;
702 case e_uint: m_data.uint = (uint_t)m_data.ldbl; success = true; break;
703 case e_slong: m_data.slong = (slong_t)m_data.ldbl; success = true; break;
704 case e_ulong: m_data.ulong = (ulong_t)m_data.ldbl; success = true; break;
705 case e_slonglong: m_data.slonglong = (slonglong_t)m_data.ldbl; success = true; break;
706 case e_ulonglong: m_data.ulonglong = (ulonglong_t)m_data.ldbl; success = true; break;
707 case e_float: m_data.flt = (float_t)m_data.ldbl; success = true; break;
708 case e_double: m_data.dbl = (double_t)m_data.ldbl; success = true; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000709 case e_long_double: success = true; break;
710 }
711 break;
712 }
713
714 if (success)
715 m_type = type;
716 return success;
717}
718
Sean Callanan0b342b62013-05-24 20:36:56 +0000719bool
720Scalar::MakeSigned ()
721{
722 bool success = false;
723
724 switch (m_type)
725 {
726 case e_void: break;
727 case e_sint: success = true; break;
728 case e_uint: m_type = e_sint; success = true; break;
729 case e_slong: success = true; break;
730 case e_ulong: m_type = e_slong; success = true; break;
731 case e_slonglong: success = true; break;
732 case e_ulonglong: m_type = e_slonglong; success = true; break;
733 case e_float: success = true; break;
734 case e_double: success = true; break;
735 case e_long_double: success = true; break;
736 }
737
738 return success;
739}
740
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000741int
742Scalar::SInt(int fail_value) const
743{
744 switch (m_type)
745 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000746 case e_void: break;
747 case e_sint: return m_data.sint;
748 case e_uint: return (int)m_data.uint;
749 case e_slong: return (int)m_data.slong;
750 case e_ulong: return (int)m_data.ulong;
751 case e_slonglong: return (int)m_data.slonglong;
752 case e_ulonglong: return (int)m_data.ulonglong;
753 case e_float: return (int)m_data.flt;
754 case e_double: return (int)m_data.dbl;
755 case e_long_double: return (int)m_data.ldbl;
756 }
757 return fail_value;
758}
759
760unsigned int
761Scalar::UInt(unsigned int fail_value) const
762{
763 switch (m_type)
764 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765 case e_void: break;
Enrico Granata5020f952012-10-24 21:42:49 +0000766 case e_sint: return (unsigned int)m_data.sint;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767 case e_uint: return (unsigned int)m_data.uint;
Enrico Granata5020f952012-10-24 21:42:49 +0000768 case e_slong: return (unsigned int)m_data.slong;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000769 case e_ulong: return (unsigned int)m_data.ulong;
Enrico Granata5020f952012-10-24 21:42:49 +0000770 case e_slonglong: return (unsigned int)m_data.slonglong;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000771 case e_ulonglong: return (unsigned int)m_data.ulonglong;
772 case e_float: return (unsigned int)m_data.flt;
773 case e_double: return (unsigned int)m_data.dbl;
774 case e_long_double: return (unsigned int)m_data.ldbl;
775 }
776 return fail_value;
777}
778
779
780long
781Scalar::SLong(long fail_value) const
782{
783 switch (m_type)
784 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000785 case e_void: break;
786 case e_sint: return (long)m_data.sint;
787 case e_uint: return (long)m_data.uint;
788 case e_slong: return (long)m_data.slong;
789 case e_ulong: return (long)m_data.ulong;
790 case e_slonglong: return (long)m_data.slonglong;
791 case e_ulonglong: return (long)m_data.ulonglong;
792 case e_float: return (long)m_data.flt;
793 case e_double: return (long)m_data.dbl;
794 case e_long_double: return (long)m_data.ldbl;
795 }
796 return fail_value;
797}
798
799
800
801unsigned long
802Scalar::ULong(unsigned long fail_value) const
803{
804 switch (m_type)
805 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000806 case e_void: break;
Enrico Granata5020f952012-10-24 21:42:49 +0000807 case e_sint: return (unsigned long)m_data.sint;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000808 case e_uint: return (unsigned long)m_data.uint;
Enrico Granata5020f952012-10-24 21:42:49 +0000809 case e_slong: return (unsigned long)m_data.slong;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000810 case e_ulong: return (unsigned long)m_data.ulong;
Enrico Granata5020f952012-10-24 21:42:49 +0000811 case e_slonglong: return (unsigned long)m_data.slonglong;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000812 case e_ulonglong: return (unsigned long)m_data.ulonglong;
813 case e_float: return (unsigned long)m_data.flt;
814 case e_double: return (unsigned long)m_data.dbl;
815 case e_long_double: return (unsigned long)m_data.ldbl;
816 }
817 return fail_value;
818}
819
820uint64_t
821Scalar::GetRawBits64(uint64_t fail_value) const
822{
823 switch (m_type)
824 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000825 case e_void:
826 break;
827
828 case e_sint:
829 case e_uint:
830 return m_data.uint;
831
832 case e_slong:
833 case e_ulong:
834 return m_data.ulong;
835
836 case e_slonglong:
837 case e_ulonglong:
838 return m_data.ulonglong;
839
840 case e_float:
Greg Claytonc7bece562013-01-25 18:06:21 +0000841 if (sizeof(m_data.flt) == sizeof(m_data.uint))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000842 return m_data.uint;
Greg Claytonc7bece562013-01-25 18:06:21 +0000843 else if (sizeof(m_data.flt) == sizeof(m_data.ulong))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000844 return m_data.ulong;
Greg Claytonc7bece562013-01-25 18:06:21 +0000845 else if (sizeof(m_data.flt) == sizeof(m_data.ulonglong))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000846 return m_data.ulonglong;
847 break;
848
849 case e_double:
Greg Claytonc7bece562013-01-25 18:06:21 +0000850 if (sizeof(m_data.dbl) == sizeof(m_data.uint))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000851 return m_data.uint;
Greg Claytonc7bece562013-01-25 18:06:21 +0000852 else if (sizeof(m_data.dbl) == sizeof(m_data.ulong))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000853 return m_data.ulong;
Greg Claytonc7bece562013-01-25 18:06:21 +0000854 else if (sizeof(m_data.dbl) == sizeof(m_data.ulonglong))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000855 return m_data.ulonglong;
856 break;
857
858 case e_long_double:
Greg Claytonc7bece562013-01-25 18:06:21 +0000859 if (sizeof(m_data.ldbl) == sizeof(m_data.uint))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000860 return m_data.uint;
Greg Claytonc7bece562013-01-25 18:06:21 +0000861 else if (sizeof(m_data.ldbl) == sizeof(m_data.ulong))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000862 return m_data.ulong;
Greg Claytonc7bece562013-01-25 18:06:21 +0000863 else if (sizeof(m_data.ldbl) == sizeof(m_data.ulonglong))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000864 return m_data.ulonglong;
865 break;
866 }
867 return fail_value;
868}
869
870
871
872long long
873Scalar::SLongLong(long long fail_value) const
874{
875 switch (m_type)
876 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000877 case e_void: break;
878 case e_sint: return (long long)m_data.sint;
879 case e_uint: return (long long)m_data.uint;
880 case e_slong: return (long long)m_data.slong;
881 case e_ulong: return (long long)m_data.ulong;
882 case e_slonglong: return (long long)m_data.slonglong;
883 case e_ulonglong: return (long long)m_data.ulonglong;
884 case e_float: return (long long)m_data.flt;
885 case e_double: return (long long)m_data.dbl;
886 case e_long_double: return (long long)m_data.ldbl;
887 }
888 return fail_value;
889}
890
891
892unsigned long long
893Scalar::ULongLong(unsigned long long fail_value) const
894{
895 switch (m_type)
896 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000897 case e_void: break;
Enrico Granata5020f952012-10-24 21:42:49 +0000898 case e_sint: return (unsigned long long)m_data.sint;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000899 case e_uint: return (unsigned long long)m_data.uint;
Enrico Granata5020f952012-10-24 21:42:49 +0000900 case e_slong: return (unsigned long long)m_data.slong;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000901 case e_ulong: return (unsigned long long)m_data.ulong;
Enrico Granata5020f952012-10-24 21:42:49 +0000902 case e_slonglong: return (unsigned long long)m_data.slonglong;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000903 case e_ulonglong: return (unsigned long long)m_data.ulonglong;
904 case e_float: return (unsigned long long)m_data.flt;
905 case e_double: return (unsigned long long)m_data.dbl;
906 case e_long_double: return (unsigned long long)m_data.ldbl;
907 }
908 return fail_value;
909}
910
911
912float
913Scalar::Float(float fail_value) const
914{
915 switch (m_type)
916 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000917 case e_void: break;
918 case e_sint: return (float)m_data.sint;
919 case e_uint: return (float)m_data.uint;
920 case e_slong: return (float)m_data.slong;
921 case e_ulong: return (float)m_data.ulong;
922 case e_slonglong: return (float)m_data.slonglong;
923 case e_ulonglong: return (float)m_data.ulonglong;
924 case e_float: return (float)m_data.flt;
925 case e_double: return (float)m_data.dbl;
926 case e_long_double: return (float)m_data.ldbl;
927 }
928 return fail_value;
929}
930
931
932double
933Scalar::Double(double fail_value) const
934{
935 switch (m_type)
936 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000937 case e_void: break;
938 case e_sint: return (double)m_data.sint;
939 case e_uint: return (double)m_data.uint;
940 case e_slong: return (double)m_data.slong;
941 case e_ulong: return (double)m_data.ulong;
942 case e_slonglong: return (double)m_data.slonglong;
943 case e_ulonglong: return (double)m_data.ulonglong;
944 case e_float: return (double)m_data.flt;
945 case e_double: return (double)m_data.dbl;
946 case e_long_double: return (double)m_data.ldbl;
947 }
948 return fail_value;
949}
950
951
952long double
953Scalar::LongDouble(long double fail_value) const
954{
955 switch (m_type)
956 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000957 case e_void: break;
958 case e_sint: return (long double)m_data.sint;
959 case e_uint: return (long double)m_data.uint;
960 case e_slong: return (long double)m_data.slong;
961 case e_ulong: return (long double)m_data.ulong;
962 case e_slonglong: return (long double)m_data.slonglong;
963 case e_ulonglong: return (long double)m_data.ulonglong;
964 case e_float: return (long double)m_data.flt;
965 case e_double: return (long double)m_data.dbl;
966 case e_long_double: return (long double)m_data.ldbl;
967 }
968 return fail_value;
969}
970
971
972Scalar&
973Scalar::operator+= (const Scalar& rhs)
974{
975 Scalar temp_value;
976 const Scalar* a;
977 const Scalar* b;
978 if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) != Scalar::e_void)
979 {
980 switch (m_type)
981 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000982 case e_void: break;
983 case e_sint: m_data.sint = a->m_data.sint + b->m_data.sint; break;
984 case e_uint: m_data.uint = a->m_data.uint + b->m_data.uint; break;
985 case e_slong: m_data.slong = a->m_data.slong + b->m_data.slong; break;
986 case e_ulong: m_data.ulong = a->m_data.ulong + b->m_data.ulong; break;
987 case e_slonglong: m_data.slonglong = a->m_data.slonglong + b->m_data.slonglong; break;
988 case e_ulonglong: m_data.ulonglong = a->m_data.ulonglong + b->m_data.ulonglong; break;
989 case e_float: m_data.flt = a->m_data.flt + b->m_data.flt; break;
990 case e_double: m_data.dbl = a->m_data.dbl + b->m_data.dbl; break;
991 case e_long_double: m_data.ldbl = a->m_data.ldbl + b->m_data.ldbl; break;
992 }
993 }
994 return *this;
995}
996
997Scalar&
998Scalar::operator<<= (const Scalar& rhs)
999{
1000 switch (m_type)
1001 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001002 case e_void:
1003 case e_float:
1004 case e_double:
1005 case e_long_double:
1006 m_type = e_void;
1007 break;
1008
1009 case e_sint:
1010 switch (rhs.m_type)
1011 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001012 case e_void:
1013 case e_float:
1014 case e_double:
1015 case e_long_double:
1016 m_type = e_void;
1017 break;
1018 case e_sint: m_data.sint <<= rhs.m_data.sint; break;
1019 case e_uint: m_data.sint <<= rhs.m_data.uint; break;
1020 case e_slong: m_data.sint <<= rhs.m_data.slong; break;
1021 case e_ulong: m_data.sint <<= rhs.m_data.ulong; break;
1022 case e_slonglong: m_data.sint <<= rhs.m_data.slonglong; break;
1023 case e_ulonglong: m_data.sint <<= rhs.m_data.ulonglong; break;
1024 }
1025 break;
1026
1027 case e_uint:
1028 switch (rhs.m_type)
1029 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001030 case e_void:
1031 case e_float:
1032 case e_double:
1033 case e_long_double:
1034 m_type = e_void;
1035 break;
1036 case e_sint: m_data.uint <<= rhs.m_data.sint; break;
1037 case e_uint: m_data.uint <<= rhs.m_data.uint; break;
1038 case e_slong: m_data.uint <<= rhs.m_data.slong; break;
1039 case e_ulong: m_data.uint <<= rhs.m_data.ulong; break;
1040 case e_slonglong: m_data.uint <<= rhs.m_data.slonglong; break;
1041 case e_ulonglong: m_data.uint <<= rhs.m_data.ulonglong; break;
1042 }
1043 break;
1044
1045 case e_slong:
1046 switch (rhs.m_type)
1047 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001048 case e_void:
1049 case e_float:
1050 case e_double:
1051 case e_long_double:
1052 m_type = e_void;
1053 break;
1054 case e_sint: m_data.slong <<= rhs.m_data.sint; break;
1055 case e_uint: m_data.slong <<= rhs.m_data.uint; break;
1056 case e_slong: m_data.slong <<= rhs.m_data.slong; break;
1057 case e_ulong: m_data.slong <<= rhs.m_data.ulong; break;
1058 case e_slonglong: m_data.slong <<= rhs.m_data.slonglong; break;
1059 case e_ulonglong: m_data.slong <<= rhs.m_data.ulonglong; break;
1060 }
1061 break;
1062
1063 case e_ulong:
1064 switch (rhs.m_type)
1065 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001066 case e_void:
1067 case e_float:
1068 case e_double:
1069 case e_long_double:
1070 m_type = e_void;
1071 break;
1072 case e_sint: m_data.ulong <<= rhs.m_data.sint; break;
1073 case e_uint: m_data.ulong <<= rhs.m_data.uint; break;
1074 case e_slong: m_data.ulong <<= rhs.m_data.slong; break;
1075 case e_ulong: m_data.ulong <<= rhs.m_data.ulong; break;
1076 case e_slonglong: m_data.ulong <<= rhs.m_data.slonglong; break;
1077 case e_ulonglong: m_data.ulong <<= rhs.m_data.ulonglong; break;
1078 }
1079 break;
1080 case e_slonglong:
1081 switch (rhs.m_type)
1082 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001083 case e_void:
1084 case e_float:
1085 case e_double:
1086 case e_long_double:
1087 m_type = e_void;
1088 break;
1089 case e_sint: m_data.slonglong <<= rhs.m_data.sint; break;
1090 case e_uint: m_data.slonglong <<= rhs.m_data.uint; break;
1091 case e_slong: m_data.slonglong <<= rhs.m_data.slong; break;
1092 case e_ulong: m_data.slonglong <<= rhs.m_data.ulong; break;
1093 case e_slonglong: m_data.slonglong <<= rhs.m_data.slonglong; break;
1094 case e_ulonglong: m_data.slonglong <<= rhs.m_data.ulonglong; break;
1095 }
1096 break;
1097
1098 case e_ulonglong:
1099 switch (rhs.m_type)
1100 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001101 case e_void:
1102 case e_float:
1103 case e_double:
1104 case e_long_double:
1105 m_type = e_void;
1106 break;
1107 case e_sint: m_data.ulonglong <<= rhs.m_data.sint; break;
1108 case e_uint: m_data.ulonglong <<= rhs.m_data.uint; break;
1109 case e_slong: m_data.ulonglong <<= rhs.m_data.slong; break;
1110 case e_ulong: m_data.ulonglong <<= rhs.m_data.ulong; break;
1111 case e_slonglong: m_data.ulonglong <<= rhs.m_data.slonglong; break;
1112 case e_ulonglong: m_data.ulonglong <<= rhs.m_data.ulonglong; break;
1113 }
1114 break;
1115 }
1116 return *this;
1117}
1118
1119bool
1120Scalar::ShiftRightLogical(const Scalar& rhs)
1121{
1122 switch (m_type)
1123 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001124 case e_void:
1125 case e_float:
1126 case e_double:
1127 case e_long_double:
1128 m_type = e_void;
1129 break;
1130
1131 case e_sint:
1132 case e_uint:
1133 switch (rhs.m_type)
1134 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001135 case e_void:
1136 case e_float:
1137 case e_double:
1138 case e_long_double:
1139 m_type = e_void;
1140 break;
1141 case e_sint: m_data.uint >>= rhs.m_data.sint; break;
1142 case e_uint: m_data.uint >>= rhs.m_data.uint; break;
1143 case e_slong: m_data.uint >>= rhs.m_data.slong; break;
1144 case e_ulong: m_data.uint >>= rhs.m_data.ulong; break;
1145 case e_slonglong: m_data.uint >>= rhs.m_data.slonglong; break;
1146 case e_ulonglong: m_data.uint >>= rhs.m_data.ulonglong; break;
1147 }
1148 break;
1149
1150 case e_slong:
1151 case e_ulong:
1152 switch (rhs.m_type)
1153 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001154 case e_void:
1155 case e_float:
1156 case e_double:
1157 case e_long_double:
1158 m_type = e_void;
1159 break;
1160 case e_sint: m_data.ulong >>= rhs.m_data.sint; break;
1161 case e_uint: m_data.ulong >>= rhs.m_data.uint; break;
1162 case e_slong: m_data.ulong >>= rhs.m_data.slong; break;
1163 case e_ulong: m_data.ulong >>= rhs.m_data.ulong; break;
1164 case e_slonglong: m_data.ulong >>= rhs.m_data.slonglong; break;
1165 case e_ulonglong: m_data.ulong >>= rhs.m_data.ulonglong; break;
1166 }
1167 break;
1168
1169 case e_slonglong:
1170 case e_ulonglong:
1171 switch (rhs.m_type)
1172 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001173 case e_void:
1174 case e_float:
1175 case e_double:
1176 case e_long_double:
1177 m_type = e_void;
1178 break;
1179 case e_sint: m_data.ulonglong >>= rhs.m_data.sint; break;
1180 case e_uint: m_data.ulonglong >>= rhs.m_data.uint; break;
1181 case e_slong: m_data.ulonglong >>= rhs.m_data.slong; break;
1182 case e_ulong: m_data.ulonglong >>= rhs.m_data.ulong; break;
1183 case e_slonglong: m_data.ulonglong >>= rhs.m_data.slonglong; break;
1184 case e_ulonglong: m_data.ulonglong >>= rhs.m_data.ulonglong; break;
1185 }
1186 break;
1187 }
1188 return m_type != e_void;
1189}
1190
1191
1192Scalar&
1193Scalar::operator>>= (const Scalar& rhs)
1194{
1195 switch (m_type)
1196 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001197 case e_void:
1198 case e_float:
1199 case e_double:
1200 case e_long_double:
1201 m_type = e_void;
1202 break;
1203
1204 case e_sint:
1205 switch (rhs.m_type)
1206 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001207 case e_void:
1208 case e_float:
1209 case e_double:
1210 case e_long_double:
1211 m_type = e_void;
1212 break;
1213 case e_sint: m_data.sint >>= rhs.m_data.sint; break;
1214 case e_uint: m_data.sint >>= rhs.m_data.uint; break;
1215 case e_slong: m_data.sint >>= rhs.m_data.slong; break;
1216 case e_ulong: m_data.sint >>= rhs.m_data.ulong; break;
1217 case e_slonglong: m_data.sint >>= rhs.m_data.slonglong; break;
1218 case e_ulonglong: m_data.sint >>= rhs.m_data.ulonglong; break;
1219 }
1220 break;
1221
1222 case e_uint:
1223 switch (rhs.m_type)
1224 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001225 case e_void:
1226 case e_float:
1227 case e_double:
1228 case e_long_double:
1229 m_type = e_void;
1230 break;
1231 case e_sint: m_data.uint >>= rhs.m_data.sint; break;
1232 case e_uint: m_data.uint >>= rhs.m_data.uint; break;
1233 case e_slong: m_data.uint >>= rhs.m_data.slong; break;
1234 case e_ulong: m_data.uint >>= rhs.m_data.ulong; break;
1235 case e_slonglong: m_data.uint >>= rhs.m_data.slonglong; break;
1236 case e_ulonglong: m_data.uint >>= rhs.m_data.ulonglong; break;
1237 }
1238 break;
1239
1240 case e_slong:
1241 switch (rhs.m_type)
1242 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001243 case e_void:
1244 case e_float:
1245 case e_double:
1246 case e_long_double:
1247 m_type = e_void;
1248 break;
1249 case e_sint: m_data.slong >>= rhs.m_data.sint; break;
1250 case e_uint: m_data.slong >>= rhs.m_data.uint; break;
1251 case e_slong: m_data.slong >>= rhs.m_data.slong; break;
1252 case e_ulong: m_data.slong >>= rhs.m_data.ulong; break;
1253 case e_slonglong: m_data.slong >>= rhs.m_data.slonglong; break;
1254 case e_ulonglong: m_data.slong >>= rhs.m_data.ulonglong; break;
1255 }
1256 break;
1257
1258 case e_ulong:
1259 switch (rhs.m_type)
1260 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001261 case e_void:
1262 case e_float:
1263 case e_double:
1264 case e_long_double:
1265 m_type = e_void;
1266 break;
1267 case e_sint: m_data.ulong >>= rhs.m_data.sint; break;
1268 case e_uint: m_data.ulong >>= rhs.m_data.uint; break;
1269 case e_slong: m_data.ulong >>= rhs.m_data.slong; break;
1270 case e_ulong: m_data.ulong >>= rhs.m_data.ulong; break;
1271 case e_slonglong: m_data.ulong >>= rhs.m_data.slonglong; break;
1272 case e_ulonglong: m_data.ulong >>= rhs.m_data.ulonglong; break;
1273 }
1274 break;
1275 case e_slonglong:
1276 switch (rhs.m_type)
1277 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001278 case e_void:
1279 case e_float:
1280 case e_double:
1281 case e_long_double:
1282 m_type = e_void;
1283 break;
1284 case e_sint: m_data.slonglong >>= rhs.m_data.sint; break;
1285 case e_uint: m_data.slonglong >>= rhs.m_data.uint; break;
1286 case e_slong: m_data.slonglong >>= rhs.m_data.slong; break;
1287 case e_ulong: m_data.slonglong >>= rhs.m_data.ulong; break;
1288 case e_slonglong: m_data.slonglong >>= rhs.m_data.slonglong; break;
1289 case e_ulonglong: m_data.slonglong >>= rhs.m_data.ulonglong; break;
1290 }
1291 break;
1292
1293 case e_ulonglong:
1294 switch (rhs.m_type)
1295 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001296 case e_void:
1297 case e_float:
1298 case e_double:
1299 case e_long_double:
1300 m_type = e_void;
1301 break;
1302 case e_sint: m_data.ulonglong >>= rhs.m_data.sint; break;
1303 case e_uint: m_data.ulonglong >>= rhs.m_data.uint; break;
1304 case e_slong: m_data.ulonglong >>= rhs.m_data.slong; break;
1305 case e_ulong: m_data.ulonglong >>= rhs.m_data.ulong; break;
1306 case e_slonglong: m_data.ulonglong >>= rhs.m_data.slonglong; break;
1307 case e_ulonglong: m_data.ulonglong >>= rhs.m_data.ulonglong; break;
1308 }
1309 break;
1310 }
1311 return *this;
1312}
1313
1314
1315Scalar&
1316Scalar::operator&= (const Scalar& rhs)
1317{
1318 switch (m_type)
1319 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001320 case e_void:
1321 case e_float:
1322 case e_double:
1323 case e_long_double:
1324 m_type = e_void;
1325 break;
1326
1327 case e_sint:
1328 switch (rhs.m_type)
1329 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001330 case e_void:
1331 case e_float:
1332 case e_double:
1333 case e_long_double:
1334 m_type = e_void;
1335 break;
1336 case e_sint: m_data.sint &= rhs.m_data.sint; break;
1337 case e_uint: m_data.sint &= rhs.m_data.uint; break;
1338 case e_slong: m_data.sint &= rhs.m_data.slong; break;
1339 case e_ulong: m_data.sint &= rhs.m_data.ulong; break;
1340 case e_slonglong: m_data.sint &= rhs.m_data.slonglong; break;
1341 case e_ulonglong: m_data.sint &= rhs.m_data.ulonglong; break;
1342 }
1343 break;
1344
1345 case e_uint:
1346 switch (rhs.m_type)
1347 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001348 case e_void:
1349 case e_float:
1350 case e_double:
1351 case e_long_double:
1352 m_type = e_void;
1353 break;
1354 case e_sint: m_data.uint &= rhs.m_data.sint; break;
1355 case e_uint: m_data.uint &= rhs.m_data.uint; break;
1356 case e_slong: m_data.uint &= rhs.m_data.slong; break;
1357 case e_ulong: m_data.uint &= rhs.m_data.ulong; break;
1358 case e_slonglong: m_data.uint &= rhs.m_data.slonglong; break;
1359 case e_ulonglong: m_data.uint &= rhs.m_data.ulonglong; break;
1360 }
1361 break;
1362
1363 case e_slong:
1364 switch (rhs.m_type)
1365 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001366 case e_void:
1367 case e_float:
1368 case e_double:
1369 case e_long_double:
1370 m_type = e_void;
1371 break;
1372 case e_sint: m_data.slong &= rhs.m_data.sint; break;
1373 case e_uint: m_data.slong &= rhs.m_data.uint; break;
1374 case e_slong: m_data.slong &= rhs.m_data.slong; break;
1375 case e_ulong: m_data.slong &= rhs.m_data.ulong; break;
1376 case e_slonglong: m_data.slong &= rhs.m_data.slonglong; break;
1377 case e_ulonglong: m_data.slong &= rhs.m_data.ulonglong; break;
1378 }
1379 break;
1380
1381 case e_ulong:
1382 switch (rhs.m_type)
1383 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001384 case e_void:
1385 case e_float:
1386 case e_double:
1387 case e_long_double:
1388 m_type = e_void;
1389 break;
1390 case e_sint: m_data.ulong &= rhs.m_data.sint; break;
1391 case e_uint: m_data.ulong &= rhs.m_data.uint; break;
1392 case e_slong: m_data.ulong &= rhs.m_data.slong; break;
1393 case e_ulong: m_data.ulong &= rhs.m_data.ulong; break;
1394 case e_slonglong: m_data.ulong &= rhs.m_data.slonglong; break;
1395 case e_ulonglong: m_data.ulong &= rhs.m_data.ulonglong; break;
1396 }
1397 break;
1398 case e_slonglong:
1399 switch (rhs.m_type)
1400 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001401 case e_void:
1402 case e_float:
1403 case e_double:
1404 case e_long_double:
1405 m_type = e_void;
1406 break;
1407 case e_sint: m_data.slonglong &= rhs.m_data.sint; break;
1408 case e_uint: m_data.slonglong &= rhs.m_data.uint; break;
1409 case e_slong: m_data.slonglong &= rhs.m_data.slong; break;
1410 case e_ulong: m_data.slonglong &= rhs.m_data.ulong; break;
1411 case e_slonglong: m_data.slonglong &= rhs.m_data.slonglong; break;
1412 case e_ulonglong: m_data.slonglong &= rhs.m_data.ulonglong; break;
1413 }
1414 break;
1415
1416 case e_ulonglong:
1417 switch (rhs.m_type)
1418 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001419 case e_void:
1420 case e_float:
1421 case e_double:
1422 case e_long_double:
1423 m_type = e_void;
1424 break;
1425 case e_sint: m_data.ulonglong &= rhs.m_data.sint; break;
1426 case e_uint: m_data.ulonglong &= rhs.m_data.uint; break;
1427 case e_slong: m_data.ulonglong &= rhs.m_data.slong; break;
1428 case e_ulong: m_data.ulonglong &= rhs.m_data.ulong; break;
1429 case e_slonglong: m_data.ulonglong &= rhs.m_data.slonglong; break;
1430 case e_ulonglong: m_data.ulonglong &= rhs.m_data.ulonglong; break;
1431 }
1432 break;
1433 }
1434 return *this;
1435}
1436
1437
1438
1439bool
1440Scalar::AbsoluteValue()
1441{
1442 switch (m_type)
1443 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001444 case e_void:
1445 break;
1446
1447 case e_sint:
1448 if (m_data.sint < 0)
1449 m_data.sint = -m_data.sint;
1450 return true;
1451
1452 case e_slong:
1453 if (m_data.slong < 0)
1454 m_data.slong = -m_data.slong;
1455 return true;
1456
1457 case e_slonglong:
1458 if (m_data.slonglong < 0)
1459 m_data.slonglong = -m_data.slonglong;
1460 return true;
1461
1462 case e_uint:
1463 case e_ulong:
1464 case e_ulonglong: return true;
1465 case e_float: m_data.flt = fabsf(m_data.flt); return true;
1466 case e_double: m_data.dbl = fabs(m_data.dbl); return true;
1467 case e_long_double: m_data.ldbl = fabsl(m_data.ldbl); return true;
1468 }
1469 return false;
1470}
1471
1472
1473bool
1474Scalar::UnaryNegate()
1475{
1476 switch (m_type)
1477 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001478 case e_void: break;
1479 case e_sint: m_data.sint = -m_data.sint; return true;
1480 case e_uint: m_data.uint = -m_data.uint; return true;
1481 case e_slong: m_data.slong = -m_data.slong; return true;
1482 case e_ulong: m_data.ulong = -m_data.ulong; return true;
1483 case e_slonglong: m_data.slonglong = -m_data.slonglong; return true;
1484 case e_ulonglong: m_data.ulonglong = -m_data.ulonglong; return true;
1485 case e_float: m_data.flt = -m_data.flt; return true;
1486 case e_double: m_data.dbl = -m_data.dbl; return true;
1487 case e_long_double: m_data.ldbl = -m_data.ldbl; return true;
1488 }
1489 return false;
1490}
1491
1492bool
1493Scalar::OnesComplement()
1494{
1495 switch (m_type)
1496 {
1497 case e_sint: m_data.sint = ~m_data.sint; return true;
1498 case e_uint: m_data.uint = ~m_data.uint; return true;
1499 case e_slong: m_data.slong = ~m_data.slong; return true;
1500 case e_ulong: m_data.ulong = ~m_data.ulong; return true;
1501 case e_slonglong: m_data.slonglong = ~m_data.slonglong; return true;
1502 case e_ulonglong: m_data.ulonglong = ~m_data.ulonglong; return true;
1503
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001504 case e_void:
1505 case e_float:
1506 case e_double:
1507 case e_long_double:
1508 break;
1509 }
1510 return false;
1511}
1512
1513
1514const Scalar
1515lldb_private::operator+ (const Scalar& lhs, const Scalar& rhs)
1516{
1517 Scalar result;
1518 Scalar temp_value;
1519 const Scalar* a;
1520 const Scalar* b;
1521 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1522 {
1523 switch (result.m_type)
1524 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001525 case Scalar::e_void: break;
1526 case Scalar::e_sint: result.m_data.sint = a->m_data.sint + b->m_data.sint; break;
1527 case Scalar::e_uint: result.m_data.uint = a->m_data.uint + b->m_data.uint; break;
1528 case Scalar::e_slong: result.m_data.slong = a->m_data.slong + b->m_data.slong; break;
1529 case Scalar::e_ulong: result.m_data.ulong = a->m_data.ulong + b->m_data.ulong; break;
1530 case Scalar::e_slonglong: result.m_data.slonglong = a->m_data.slonglong + b->m_data.slonglong; break;
1531 case Scalar::e_ulonglong: result.m_data.ulonglong = a->m_data.ulonglong + b->m_data.ulonglong; break;
1532 case Scalar::e_float: result.m_data.flt = a->m_data.flt + b->m_data.flt; break;
1533 case Scalar::e_double: result.m_data.dbl = a->m_data.dbl + b->m_data.dbl; break;
1534 case Scalar::e_long_double: result.m_data.ldbl = a->m_data.ldbl + b->m_data.ldbl; break;
1535 }
1536 }
1537 return result;
1538}
1539
1540
1541const Scalar
1542lldb_private::operator- (const Scalar& lhs, const Scalar& rhs)
1543{
1544 Scalar result;
1545 Scalar temp_value;
1546 const Scalar* a;
1547 const Scalar* b;
1548 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1549 {
1550 switch (result.m_type)
1551 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001552 case Scalar::e_void: break;
1553 case Scalar::e_sint: result.m_data.sint = a->m_data.sint - b->m_data.sint; break;
1554 case Scalar::e_uint: result.m_data.uint = a->m_data.uint - b->m_data.uint; break;
1555 case Scalar::e_slong: result.m_data.slong = a->m_data.slong - b->m_data.slong; break;
1556 case Scalar::e_ulong: result.m_data.ulong = a->m_data.ulong - b->m_data.ulong; break;
1557 case Scalar::e_slonglong: result.m_data.slonglong = a->m_data.slonglong - b->m_data.slonglong; break;
1558 case Scalar::e_ulonglong: result.m_data.ulonglong = a->m_data.ulonglong - b->m_data.ulonglong; break;
1559 case Scalar::e_float: result.m_data.flt = a->m_data.flt - b->m_data.flt; break;
1560 case Scalar::e_double: result.m_data.dbl = a->m_data.dbl - b->m_data.dbl; break;
1561 case Scalar::e_long_double: result.m_data.ldbl = a->m_data.ldbl - b->m_data.ldbl; break;
1562 }
1563 }
1564 return result;
1565}
1566
1567const Scalar
1568lldb_private::operator/ (const Scalar& lhs, const Scalar& rhs)
1569{
1570 Scalar result;
1571 Scalar temp_value;
1572 const Scalar* a;
1573 const Scalar* b;
1574 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1575 {
1576 switch (result.m_type)
1577 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001578 case Scalar::e_void: break;
1579
1580 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;
1581 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;
1582 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;
1583 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;
1584 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;
1585 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;
1586 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;
1587 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;
1588 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;
1589 }
1590 }
1591 // For division only, the only way it should make it here is if a promotion failed,
1592 // or if we are trying to do a divide by zero.
1593 result.m_type = Scalar::e_void;
1594 return result;
1595}
1596
1597const Scalar
1598lldb_private::operator* (const Scalar& lhs, const Scalar& rhs)
1599{
1600 Scalar result;
1601 Scalar temp_value;
1602 const Scalar* a;
1603 const Scalar* b;
1604 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1605 {
1606 switch (result.m_type)
1607 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001608 case Scalar::e_void: break;
1609 case Scalar::e_sint: result.m_data.sint = a->m_data.sint * b->m_data.sint; break;
1610 case Scalar::e_uint: result.m_data.uint = a->m_data.uint * b->m_data.uint; break;
1611 case Scalar::e_slong: result.m_data.slong = a->m_data.slong * b->m_data.slong; break;
1612 case Scalar::e_ulong: result.m_data.ulong = a->m_data.ulong * b->m_data.ulong; break;
1613 case Scalar::e_slonglong: result.m_data.slonglong = a->m_data.slonglong * b->m_data.slonglong; break;
1614 case Scalar::e_ulonglong: result.m_data.ulonglong = a->m_data.ulonglong * b->m_data.ulonglong; break;
1615 case Scalar::e_float: result.m_data.flt = a->m_data.flt * b->m_data.flt; break;
1616 case Scalar::e_double: result.m_data.dbl = a->m_data.dbl * b->m_data.dbl; break;
1617 case Scalar::e_long_double: result.m_data.ldbl = a->m_data.ldbl * b->m_data.ldbl; break;
1618 }
1619 }
1620 return result;
1621}
1622
1623const Scalar
1624lldb_private::operator& (const Scalar& lhs, const Scalar& rhs)
1625{
1626 Scalar result;
1627 Scalar temp_value;
1628 const Scalar* a;
1629 const Scalar* b;
1630 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1631 {
1632 switch (result.m_type)
1633 {
1634 case Scalar::e_sint: result.m_data.sint = a->m_data.sint & b->m_data.sint; break;
1635 case Scalar::e_uint: result.m_data.uint = a->m_data.uint & b->m_data.uint; break;
1636 case Scalar::e_slong: result.m_data.slong = a->m_data.slong & b->m_data.slong; break;
1637 case Scalar::e_ulong: result.m_data.ulong = a->m_data.ulong & b->m_data.ulong; break;
1638 case Scalar::e_slonglong: result.m_data.slonglong = a->m_data.slonglong & b->m_data.slonglong; break;
1639 case Scalar::e_ulonglong: result.m_data.ulonglong = a->m_data.ulonglong & b->m_data.ulonglong; break;
1640
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001641 case Scalar::e_void:
1642 case Scalar::e_float:
1643 case Scalar::e_double:
1644 case Scalar::e_long_double:
1645 // No bitwise AND on floats, doubles of long doubles
1646 result.m_type = Scalar::e_void;
1647 break;
1648 }
1649 }
1650 return result;
1651}
1652
1653const Scalar
1654lldb_private::operator| (const Scalar& lhs, const Scalar& rhs)
1655{
1656 Scalar result;
1657 Scalar temp_value;
1658 const Scalar* a;
1659 const Scalar* b;
1660 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1661 {
1662 switch (result.m_type)
1663 {
1664 case Scalar::e_sint: result.m_data.sint = a->m_data.sint | b->m_data.sint; break;
1665 case Scalar::e_uint: result.m_data.uint = a->m_data.uint | b->m_data.uint; break;
1666 case Scalar::e_slong: result.m_data.slong = a->m_data.slong | b->m_data.slong; break;
1667 case Scalar::e_ulong: result.m_data.ulong = a->m_data.ulong | b->m_data.ulong; break;
1668 case Scalar::e_slonglong: result.m_data.slonglong = a->m_data.slonglong | b->m_data.slonglong; break;
1669 case Scalar::e_ulonglong: result.m_data.ulonglong = a->m_data.ulonglong | b->m_data.ulonglong; break;
1670
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001671 case Scalar::e_void:
1672 case Scalar::e_float:
1673 case Scalar::e_double:
1674 case Scalar::e_long_double:
1675 // No bitwise AND on floats, doubles of long doubles
1676 result.m_type = Scalar::e_void;
1677 break;
1678 }
1679 }
1680 return result;
1681}
1682
1683const Scalar
1684lldb_private::operator% (const Scalar& lhs, const Scalar& rhs)
1685{
1686 Scalar result;
1687 Scalar temp_value;
1688 const Scalar* a;
1689 const Scalar* b;
1690 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1691 {
1692 switch (result.m_type)
1693 {
Sean Callanan9ba6eae2013-08-08 17:57:00 +00001694 default: break;
1695 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;
1696 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;
1697 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;
1698 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;
1699 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;
1700 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;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001701 }
1702 }
Sean Callanan9ba6eae2013-08-08 17:57:00 +00001703 result.m_type = Scalar::e_void;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001704 return result;
1705}
1706
1707const Scalar
1708lldb_private::operator^ (const Scalar& lhs, const Scalar& rhs)
1709{
1710 Scalar result;
1711 Scalar temp_value;
1712 const Scalar* a;
1713 const Scalar* b;
1714 if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
1715 {
1716 switch (result.m_type)
1717 {
1718 case Scalar::e_sint: result.m_data.sint = a->m_data.sint ^ b->m_data.sint; break;
1719 case Scalar::e_uint: result.m_data.uint = a->m_data.uint ^ b->m_data.uint; break;
1720 case Scalar::e_slong: result.m_data.slong = a->m_data.slong ^ b->m_data.slong; break;
1721 case Scalar::e_ulong: result.m_data.ulong = a->m_data.ulong ^ b->m_data.ulong; break;
1722 case Scalar::e_slonglong: result.m_data.slonglong = a->m_data.slonglong ^ b->m_data.slonglong; break;
1723 case Scalar::e_ulonglong: result.m_data.ulonglong = a->m_data.ulonglong ^ b->m_data.ulonglong; break;
1724
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001725 case Scalar::e_void:
1726 case Scalar::e_float:
1727 case Scalar::e_double:
1728 case Scalar::e_long_double:
1729 // No bitwise AND on floats, doubles of long doubles
1730 result.m_type = Scalar::e_void;
1731 break;
1732 }
1733 }
1734 return result;
1735}
1736
Sean Callanan087f4372013-01-09 22:44:41 +00001737const Scalar
1738lldb_private::operator<< (const Scalar& lhs, const Scalar &rhs)
1739{
1740 Scalar result = lhs;
1741 result <<= rhs;
1742 return result;
1743}
1744
1745const Scalar
1746lldb_private::operator>> (const Scalar& lhs, const Scalar &rhs)
1747{
1748 Scalar result = lhs;
1749 result >>= rhs;
1750 return result;
1751}
1752
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753// Return the raw unsigned integer without any casting or conversion
1754unsigned int
1755Scalar::RawUInt () const
1756{
1757 return m_data.uint;
1758}
1759
1760// Return the raw unsigned long without any casting or conversion
1761unsigned long
1762Scalar::RawULong () const
1763{
1764 return m_data.ulong;
1765}
1766
1767// Return the raw unsigned long long without any casting or conversion
1768unsigned long long
1769Scalar::RawULongLong () const
1770{
1771 return m_data.ulonglong;
1772}
1773
1774
1775Error
Greg Claytonc7bece562013-01-25 18:06:21 +00001776Scalar::SetValueFromCString (const char *value_str, Encoding encoding, size_t byte_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001777{
1778 Error error;
Johnny Chen84462772011-08-11 19:12:10 +00001779 if (value_str == NULL || value_str[0] == '\0')
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001780 {
1781 error.SetErrorString ("Invalid c-string value string.");
1782 return error;
1783 }
1784 bool success = false;
1785 switch (encoding)
1786 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001787 case eEncodingInvalid:
1788 error.SetErrorString ("Invalid encoding.");
1789 break;
1790
1791 case eEncodingUint:
1792 if (byte_size <= sizeof (unsigned long long))
1793 {
Vince Harron5275aaa2015-01-15 20:08:35 +00001794 uint64_t uval64 = StringConvert::ToUInt64(value_str, UINT64_MAX, 0, &success);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001795 if (!success)
Greg Clayton86edbf42011-10-26 00:56:27 +00001796 error.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string value", value_str);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001797 else if (!UIntValueIsValidForSize (uval64, byte_size))
Deepak Panickal99fbc072014-03-03 15:39:47 +00001798 error.SetErrorStringWithFormat("value 0x%" PRIx64 " is too large to fit in a %" PRIu64 " byte unsigned integer value", uval64, (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001799 else
1800 {
1801 m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize (byte_size);
1802 switch (m_type)
1803 {
Greg Claytonc7bece562013-01-25 18:06:21 +00001804 case e_uint: m_data.uint = (uint_t)uval64; break;
1805 case e_ulong: m_data.ulong = (ulong_t)uval64; break;
1806 case e_ulonglong: m_data.ulonglong = (ulonglong_t)uval64; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001807 default:
Deepak Panickal99fbc072014-03-03 15:39:47 +00001808 error.SetErrorStringWithFormat("unsupported unsigned integer byte size: %" PRIu64 "", (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001809 break;
1810 }
1811 }
1812 }
1813 else
1814 {
Deepak Panickal99fbc072014-03-03 15:39:47 +00001815 error.SetErrorStringWithFormat("unsupported unsigned integer byte size: %" PRIu64 "", (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816 return error;
1817 }
1818 break;
1819
1820 case eEncodingSint:
1821 if (byte_size <= sizeof (long long))
1822 {
Vince Harron5275aaa2015-01-15 20:08:35 +00001823 uint64_t sval64 = StringConvert::ToSInt64(value_str, INT64_MAX, 0, &success);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001824 if (!success)
Greg Clayton86edbf42011-10-26 00:56:27 +00001825 error.SetErrorStringWithFormat ("'%s' is not a valid signed integer string value", value_str);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001826 else if (!SIntValueIsValidForSize (sval64, byte_size))
Deepak Panickal99fbc072014-03-03 15:39:47 +00001827 error.SetErrorStringWithFormat("value 0x%" PRIx64 " is too large to fit in a %" PRIu64 " byte signed integer value", sval64, (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001828 else
1829 {
1830 m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize (byte_size);
1831 switch (m_type)
1832 {
Greg Claytonc7bece562013-01-25 18:06:21 +00001833 case e_sint: m_data.sint = (sint_t)sval64; break;
1834 case e_slong: m_data.slong = (slong_t)sval64; break;
1835 case e_slonglong: m_data.slonglong = (slonglong_t)sval64; break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001836 default:
Deepak Panickal99fbc072014-03-03 15:39:47 +00001837 error.SetErrorStringWithFormat("unsupported signed integer byte size: %" PRIu64 "", (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001838 break;
1839 }
1840 }
1841 }
1842 else
1843 {
Deepak Panickal99fbc072014-03-03 15:39:47 +00001844 error.SetErrorStringWithFormat("unsupported signed integer byte size: %" PRIu64 "", (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001845 return error;
1846 }
1847 break;
1848
1849 case eEncodingIEEE754:
1850 if (byte_size == sizeof (float))
1851 {
1852 if (::sscanf (value_str, "%f", &m_data.flt) == 1)
1853 m_type = e_float;
1854 else
Greg Clayton86edbf42011-10-26 00:56:27 +00001855 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001856 }
1857 else if (byte_size == sizeof (double))
1858 {
1859 if (::sscanf (value_str, "%lf", &m_data.dbl) == 1)
1860 m_type = e_double;
1861 else
Greg Clayton86edbf42011-10-26 00:56:27 +00001862 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001863 }
1864 else if (byte_size == sizeof (long double))
1865 {
1866 if (::sscanf (value_str, "%Lf", &m_data.ldbl) == 1)
1867 m_type = e_long_double;
1868 else
Greg Clayton86edbf42011-10-26 00:56:27 +00001869 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001870 }
1871 else
1872 {
Deepak Panickal99fbc072014-03-03 15:39:47 +00001873 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "", (uint64_t)byte_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001874 return error;
1875 }
1876 break;
1877
1878 case eEncodingVector:
Greg Clayton86edbf42011-10-26 00:56:27 +00001879 error.SetErrorString ("vector encoding unsupported.");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001880 break;
1881 }
1882 if (error.Fail())
1883 m_type = e_void;
1884
1885 return error;
1886}
1887
Sean Callanan389823e2013-04-13 01:21:23 +00001888Error
1889Scalar::SetValueFromData (DataExtractor &data, lldb::Encoding encoding, size_t byte_size)
1890{
1891 Error error;
1892
1893 switch (encoding)
1894 {
1895 case lldb::eEncodingInvalid:
1896 error.SetErrorString ("invalid encoding");
1897 break;
1898 case lldb::eEncodingVector:
1899 error.SetErrorString ("vector encoding unsupported");
1900 break;
1901 case lldb::eEncodingUint:
1902 {
Hafiz Abid Qadeerbfca0d72015-06-01 17:08:30 +00001903 lldb::offset_t offset = 0;
Sean Callanan389823e2013-04-13 01:21:23 +00001904
1905 switch (byte_size)
1906 {
1907 case 1: operator=((uint8_t)data.GetU8(&offset)); break;
1908 case 2: operator=((uint16_t)data.GetU16(&offset)); break;
1909 case 4: operator=((uint32_t)data.GetU32(&offset)); break;
1910 case 8: operator=((uint64_t)data.GetU64(&offset)); break;
1911 default:
Deepak Panickal99fbc072014-03-03 15:39:47 +00001912 error.SetErrorStringWithFormat("unsupported unsigned integer byte size: %" PRIu64 "", (uint64_t)byte_size);
Sean Callanan389823e2013-04-13 01:21:23 +00001913 break;
1914 }
1915 }
1916 break;
1917 case lldb::eEncodingSint:
1918 {
Hafiz Abid Qadeerbfca0d72015-06-01 17:08:30 +00001919 lldb::offset_t offset = 0;
Sean Callanan389823e2013-04-13 01:21:23 +00001920
1921 switch (byte_size)
1922 {
1923 case 1: operator=((int8_t)data.GetU8(&offset)); break;
1924 case 2: operator=((int16_t)data.GetU16(&offset)); break;
1925 case 4: operator=((int32_t)data.GetU32(&offset)); break;
1926 case 8: operator=((int64_t)data.GetU64(&offset)); break;
1927 default:
Deepak Panickal99fbc072014-03-03 15:39:47 +00001928 error.SetErrorStringWithFormat("unsupported signed integer byte size: %" PRIu64 "", (uint64_t)byte_size);
Sean Callanan389823e2013-04-13 01:21:23 +00001929 break;
1930 }
1931 }
1932 break;
1933 case lldb::eEncodingIEEE754:
1934 {
Hafiz Abid Qadeerbfca0d72015-06-01 17:08:30 +00001935 lldb::offset_t offset = 0;
Sean Callanan389823e2013-04-13 01:21:23 +00001936
1937 if (byte_size == sizeof (float))
1938 operator=((float)data.GetFloat(&offset));
1939 else if (byte_size == sizeof (double))
1940 operator=((double)data.GetDouble(&offset));
1941 else if (byte_size == sizeof (long double))
1942 operator=((long double)data.GetLongDouble(&offset));
1943 else
Deepak Panickal99fbc072014-03-03 15:39:47 +00001944 error.SetErrorStringWithFormat("unsupported float byte size: %" PRIu64 "", (uint64_t)byte_size);
Sean Callanan389823e2013-04-13 01:21:23 +00001945 }
1946 break;
1947 }
1948
1949 return error;
1950}
1951
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952bool
Greg Claytone3769382011-05-19 00:17:26 +00001953Scalar::SignExtend (uint32_t sign_bit_pos)
1954{
1955 const uint32_t max_bit_pos = GetByteSize() * 8;
1956
1957 if (sign_bit_pos < max_bit_pos)
1958 {
1959 switch (m_type)
1960 {
Greg Claytone3769382011-05-19 00:17:26 +00001961 case Scalar::e_void:
1962 case Scalar::e_float:
1963 case Scalar::e_double:
1964 case Scalar::e_long_double:
1965 return false;
1966
1967 case Scalar::e_sint:
1968 case Scalar::e_uint:
1969 if (max_bit_pos == sign_bit_pos)
1970 return true;
1971 else if (sign_bit_pos < (max_bit_pos-1))
1972 {
1973 unsigned int sign_bit = 1u << sign_bit_pos;
1974 if (m_data.uint & sign_bit)
1975 {
1976 const unsigned int mask = ~(sign_bit) + 1u;
1977 m_data.uint |= mask;
1978 }
1979 return true;
1980 }
1981 break;
1982
1983 case Scalar::e_slong:
1984 case Scalar::e_ulong:
1985 if (max_bit_pos == sign_bit_pos)
1986 return true;
1987 else if (sign_bit_pos < (max_bit_pos-1))
1988 {
1989 unsigned long sign_bit = 1ul << sign_bit_pos;
Greg Clayton316b4602011-05-19 00:55:50 +00001990 if (m_data.ulong & sign_bit)
Greg Claytone3769382011-05-19 00:17:26 +00001991 {
1992 const unsigned long mask = ~(sign_bit) + 1ul;
Greg Clayton316b4602011-05-19 00:55:50 +00001993 m_data.ulong |= mask;
Greg Claytone3769382011-05-19 00:17:26 +00001994 }
1995 return true;
1996 }
1997 break;
1998
1999 case Scalar::e_slonglong:
2000 case Scalar::e_ulonglong:
2001 if (max_bit_pos == sign_bit_pos)
2002 return true;
2003 else if (sign_bit_pos < (max_bit_pos-1))
2004 {
2005 unsigned long long sign_bit = 1ull << sign_bit_pos;
Greg Clayton316b4602011-05-19 00:55:50 +00002006 if (m_data.ulonglong & sign_bit)
Greg Claytone3769382011-05-19 00:17:26 +00002007 {
2008 const unsigned long long mask = ~(sign_bit) + 1ull;
Greg Clayton316b4602011-05-19 00:55:50 +00002009 m_data.ulonglong |= mask;
Greg Claytone3769382011-05-19 00:17:26 +00002010 }
2011 return true;
2012 }
2013 break;
2014 }
2015 }
2016 return false;
2017}
2018
Greg Claytonc7bece562013-01-25 18:06:21 +00002019size_t
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002020Scalar::GetAsMemoryData (void *dst,
Greg Claytonc7bece562013-01-25 18:06:21 +00002021 size_t dst_len,
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002022 lldb::ByteOrder dst_byte_order,
2023 Error &error) const
2024{
2025 // Get a data extractor that points to the native scalar data
2026 DataExtractor data;
2027 if (!GetData(data))
2028 {
2029 error.SetErrorString ("invalid scalar value");
2030 return 0;
2031 }
2032
2033 const size_t src_len = data.GetByteSize();
2034
2035 // Prepare a memory buffer that contains some or all of the register value
Greg Claytonc7bece562013-01-25 18:06:21 +00002036 const size_t bytes_copied = data.CopyByteOrderedData (0, // src offset
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002037 src_len, // src length
2038 dst, // dst buffer
2039 dst_len, // dst length
2040 dst_byte_order); // dst byte order
2041 if (bytes_copied == 0)
2042 error.SetErrorString ("failed to copy data");
2043
2044 return bytes_copied;
2045}
2046
Greg Claytone3769382011-05-19 00:17:26 +00002047bool
Greg Claytondcad5022011-12-29 01:26:56 +00002048Scalar::ExtractBitfield (uint32_t bit_size,
2049 uint32_t bit_offset)
2050{
2051 if (bit_size == 0)
2052 return true;
2053
2054 uint32_t msbit = bit_offset + bit_size - 1;
2055 uint32_t lsbit = bit_offset;
2056 switch (m_type)
2057 {
Greg Claytondcad5022011-12-29 01:26:56 +00002058 case Scalar::e_void:
2059 break;
2060
2061 case e_float:
Greg Claytonc7bece562013-01-25 18:06:21 +00002062 if (sizeof(m_data.flt) == sizeof(sint_t))
2063 m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
2064 else if (sizeof(m_data.flt) == sizeof(ulong_t))
2065 m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
2066 else if (sizeof(m_data.flt) == sizeof(ulonglong_t))
2067 m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002068 else
2069 return false;
2070 return true;
2071
2072 case e_double:
Greg Claytonc7bece562013-01-25 18:06:21 +00002073 if (sizeof(m_data.dbl) == sizeof(sint_t))
Greg Claytondcad5022011-12-29 01:26:56 +00002074 m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
Greg Claytonc7bece562013-01-25 18:06:21 +00002075 else if (sizeof(m_data.dbl) == sizeof(ulong_t))
Greg Claytondcad5022011-12-29 01:26:56 +00002076 m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
Greg Claytonc7bece562013-01-25 18:06:21 +00002077 else if (sizeof(m_data.dbl) == sizeof(ulonglong_t))
Greg Claytondcad5022011-12-29 01:26:56 +00002078 m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
2079 else
2080 return false;
2081 return true;
2082
2083 case e_long_double:
Greg Claytonc7bece562013-01-25 18:06:21 +00002084 if (sizeof(m_data.ldbl) == sizeof(sint_t))
Greg Claytondcad5022011-12-29 01:26:56 +00002085 m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
Greg Claytonc7bece562013-01-25 18:06:21 +00002086 else if (sizeof(m_data.ldbl) == sizeof(ulong_t))
Greg Claytondcad5022011-12-29 01:26:56 +00002087 m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
Greg Claytonc7bece562013-01-25 18:06:21 +00002088 else if (sizeof(m_data.ldbl) == sizeof(ulonglong_t))
Greg Claytondcad5022011-12-29 01:26:56 +00002089 m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
2090 else
2091 return false;
2092 return true;
2093
2094 case Scalar::e_sint:
Greg Claytonc7bece562013-01-25 18:06:21 +00002095 m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002096 return true;
2097
2098 case Scalar::e_uint:
Greg Claytonc7bece562013-01-25 18:06:21 +00002099 m_data.uint = (uint_t)UnsignedBits (m_data.uint, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002100 return true;
2101
2102 case Scalar::e_slong:
Greg Claytonc7bece562013-01-25 18:06:21 +00002103 m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002104 return true;
2105
2106 case Scalar::e_ulong:
Greg Claytonc7bece562013-01-25 18:06:21 +00002107 m_data.ulong = (ulong_t)UnsignedBits (m_data.ulong, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002108 return true;
2109
2110 case Scalar::e_slonglong:
Greg Claytonc7bece562013-01-25 18:06:21 +00002111 m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002112 return true;
2113
2114 case Scalar::e_ulonglong:
Greg Claytonc7bece562013-01-25 18:06:21 +00002115 m_data.ulonglong = (ulonglong_t)UnsignedBits (m_data.ulonglong, msbit, lsbit);
Greg Claytondcad5022011-12-29 01:26:56 +00002116 return true;
2117 }
2118 return false;
2119}
2120
2121
2122
2123
2124
2125bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002126lldb_private::operator== (const Scalar& lhs, const Scalar& rhs)
2127{
2128 // If either entry is void then we can just compare the types
2129 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2130 return lhs.m_type == rhs.m_type;
2131
2132 Scalar temp_value;
2133 const Scalar* a;
2134 const Scalar* b;
2135 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
2136 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002137 case Scalar::e_void: break;
2138 case Scalar::e_sint: return a->m_data.sint == b->m_data.sint;
2139 case Scalar::e_uint: return a->m_data.uint == b->m_data.uint;
2140 case Scalar::e_slong: return a->m_data.slong == b->m_data.slong;
2141 case Scalar::e_ulong: return a->m_data.ulong == b->m_data.ulong;
2142 case Scalar::e_slonglong: return a->m_data.slonglong == b->m_data.slonglong;
2143 case Scalar::e_ulonglong: return a->m_data.ulonglong == b->m_data.ulonglong;
2144 case Scalar::e_float: return a->m_data.flt == b->m_data.flt;
2145 case Scalar::e_double: return a->m_data.dbl == b->m_data.dbl;
2146 case Scalar::e_long_double: return a->m_data.ldbl == b->m_data.ldbl;
2147 }
2148 return false;
2149}
2150
2151bool
2152lldb_private::operator!= (const Scalar& lhs, const Scalar& rhs)
2153{
2154 // If either entry is void then we can just compare the types
2155 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2156 return lhs.m_type != rhs.m_type;
2157
2158 Scalar temp_value; // A temp value that might get a copy of either promoted value
2159 const Scalar* a;
2160 const Scalar* b;
2161 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
2162 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002163 case Scalar::e_void: break;
2164 case Scalar::e_sint: return a->m_data.sint != b->m_data.sint;
2165 case Scalar::e_uint: return a->m_data.uint != b->m_data.uint;
2166 case Scalar::e_slong: return a->m_data.slong != b->m_data.slong;
2167 case Scalar::e_ulong: return a->m_data.ulong != b->m_data.ulong;
2168 case Scalar::e_slonglong: return a->m_data.slonglong != b->m_data.slonglong;
2169 case Scalar::e_ulonglong: return a->m_data.ulonglong != b->m_data.ulonglong;
2170 case Scalar::e_float: return a->m_data.flt != b->m_data.flt;
2171 case Scalar::e_double: return a->m_data.dbl != b->m_data.dbl;
2172 case Scalar::e_long_double: return a->m_data.ldbl != b->m_data.ldbl;
2173 }
2174 return true;
2175}
2176
2177bool
2178lldb_private::operator< (const Scalar& lhs, const Scalar& rhs)
2179{
2180 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2181 return false;
2182
2183 Scalar temp_value;
2184 const Scalar* a;
2185 const Scalar* b;
2186 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
2187 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002188 case Scalar::e_void: break;
2189 case Scalar::e_sint: return a->m_data.sint < b->m_data.sint;
2190 case Scalar::e_uint: return a->m_data.uint < b->m_data.uint;
2191 case Scalar::e_slong: return a->m_data.slong < b->m_data.slong;
2192 case Scalar::e_ulong: return a->m_data.ulong < b->m_data.ulong;
2193 case Scalar::e_slonglong: return a->m_data.slonglong < b->m_data.slonglong;
2194 case Scalar::e_ulonglong: return a->m_data.ulonglong < b->m_data.ulonglong;
2195 case Scalar::e_float: return a->m_data.flt < b->m_data.flt;
2196 case Scalar::e_double: return a->m_data.dbl < b->m_data.dbl;
2197 case Scalar::e_long_double: return a->m_data.ldbl < b->m_data.ldbl;
2198 }
2199 return false;
2200}
2201
2202bool
2203lldb_private::operator<= (const Scalar& lhs, const Scalar& rhs)
2204{
2205 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2206 return false;
2207
2208 Scalar temp_value;
2209 const Scalar* a;
2210 const Scalar* b;
2211 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
2212 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002213 case Scalar::e_void: break;
2214 case Scalar::e_sint: return a->m_data.sint <= b->m_data.sint;
2215 case Scalar::e_uint: return a->m_data.uint <= b->m_data.uint;
2216 case Scalar::e_slong: return a->m_data.slong <= b->m_data.slong;
2217 case Scalar::e_ulong: return a->m_data.ulong <= b->m_data.ulong;
2218 case Scalar::e_slonglong: return a->m_data.slonglong <= b->m_data.slonglong;
2219 case Scalar::e_ulonglong: return a->m_data.ulonglong <= b->m_data.ulonglong;
2220 case Scalar::e_float: return a->m_data.flt <= b->m_data.flt;
2221 case Scalar::e_double: return a->m_data.dbl <= b->m_data.dbl;
2222 case Scalar::e_long_double: return a->m_data.ldbl <= b->m_data.ldbl;
2223 }
2224 return false;
2225}
2226
2227
2228bool
2229lldb_private::operator> (const Scalar& lhs, const Scalar& rhs)
2230{
2231 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2232 return false;
2233
2234 Scalar temp_value;
2235 const Scalar* a;
2236 const Scalar* b;
2237 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
2238 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002239 case Scalar::e_void: break;
2240 case Scalar::e_sint: return a->m_data.sint > b->m_data.sint;
2241 case Scalar::e_uint: return a->m_data.uint > b->m_data.uint;
2242 case Scalar::e_slong: return a->m_data.slong > b->m_data.slong;
2243 case Scalar::e_ulong: return a->m_data.ulong > b->m_data.ulong;
2244 case Scalar::e_slonglong: return a->m_data.slonglong > b->m_data.slonglong;
2245 case Scalar::e_ulonglong: return a->m_data.ulonglong > b->m_data.ulonglong;
2246 case Scalar::e_float: return a->m_data.flt > b->m_data.flt;
2247 case Scalar::e_double: return a->m_data.dbl > b->m_data.dbl;
2248 case Scalar::e_long_double: return a->m_data.ldbl > b->m_data.ldbl;
2249 }
2250 return false;
2251}
2252
2253bool
2254lldb_private::operator>= (const Scalar& lhs, const Scalar& rhs)
2255{
2256 if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
2257 return false;
2258
2259 Scalar temp_value;
2260 const Scalar* a;
2261 const Scalar* b;
2262 switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
2263 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002264 case Scalar::e_void: break;
2265 case Scalar::e_sint: return a->m_data.sint >= b->m_data.sint;
2266 case Scalar::e_uint: return a->m_data.uint >= b->m_data.uint;
2267 case Scalar::e_slong: return a->m_data.slong >= b->m_data.slong;
2268 case Scalar::e_ulong: return a->m_data.ulong >= b->m_data.ulong;
2269 case Scalar::e_slonglong: return a->m_data.slonglong >= b->m_data.slonglong;
2270 case Scalar::e_ulonglong: return a->m_data.ulonglong >= b->m_data.ulonglong;
2271 case Scalar::e_float: return a->m_data.flt >= b->m_data.flt;
2272 case Scalar::e_double: return a->m_data.dbl >= b->m_data.dbl;
2273 case Scalar::e_long_double: return a->m_data.ldbl >= b->m_data.ldbl;
2274 }
2275 return false;
2276}
2277
2278
2279
2280