summaryrefslogtreecommitdiff
path: root/register_address.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'register_address.cpp')
-rw-r--r--register_address.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/register_address.cpp b/register_address.cpp
index e499da2..2fcd350 100644
--- a/register_address.cpp
+++ b/register_address.cpp
@@ -1,3 +1,4 @@
+#include <iostream>
#include <sstream>
#include "register_address.h"
@@ -12,6 +13,28 @@ register_address::register_address(
m_swizzle(swizzle)
{ }
+register_address::register_address() :
+ m_type(REGISTER_TYPE_NONE),
+ m_index(0),
+ m_swizzle(SWIZZLE_EMPTY)
+ { }
+
+register_address::register_address(
+ register_type type,
+ unsigned int int_val)
+ :
+ m_type(type)
+{
+ unsigned int swz_val = int_val % 4;
+ switch (swz_val) {
+ case 0: m_swizzle = SWIZZLE_X;
+ case 1: m_swizzle = SWIZZLE_Y;
+ case 2: m_swizzle = SWIZZLE_Z;
+ case 3: m_swizzle = SWIZZLE_W;
+ }
+ m_index = int_val / 4;
+}
+
std::string
register_address::to_string()
{
@@ -47,3 +70,19 @@ register_address::swizzle_to_string(enum swizzle swz)
default: return "?";
}
}
+
+unsigned int
+register_address::to_int()
+{
+ unsigned int swz_val;
+ switch(m_swizzle) {
+ case SWIZZLE_X: swz_val = 0;
+ case SWIZZLE_Y: swz_val = 1;
+ case SWIZZLE_Z: swz_val = 2;
+ case SWIZZLE_W: swz_val = 3;
+ default:
+ std::cerr << __FUNCTION__ << ": unhandled swizzle\n";
+ return 0;
+ }
+ return (m_index * 4) + swz_val;
+}