summaryrefslogtreecommitdiff
path: root/register_address.cpp
blob: 9f40c6ce3a851bb8dd014ceba497017f7e9ab306 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <sstream>

#include "register_address.h"

register_address::register_address(
	register_type type,
	unsigned int index,
	enum swizzle swizzle)
	:
	m_type(type),
	m_index(index),
	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; break;
	case 1: m_swizzle = SWIZZLE_Y; break;
	case 2: m_swizzle = SWIZZLE_Z; break;
	case 3: m_swizzle = SWIZZLE_W; break;
	}
	m_index = int_val / 4;
}

std::string
register_address::to_string()
{
	std::ostringstream s;

	s << register_address::register_type_to_string(m_type) << "[" <<  m_index << "]." <<
	swizzle_to_string(m_swizzle);

	return s.str();
}

std::string
register_address::register_type_to_string(enum register_type type)
{
	switch(type) {
		case REGISTER_TYPE_TEMP: return "TEMP";
		case REGISTER_TYPE_CONST: return "CONST";
		case REGISTER_TYPE_IN: return "IN";
		case REGISTER_TYPE_OUT: return "OUT";
		case REGISTER_TYPE_IMMEDIATE: return "IMM";
		case REGISTER_TYPE_PRIVATE: return "PRIV";
		default: return "NONE";
	}
}

std::string
register_address::swizzle_to_string(enum swizzle swz)
{
	switch(swz) {
		case SWIZZLE_EMPTY: return "_";
		case SWIZZLE_X: return "x";
		case SWIZZLE_Y: return "y";
		case SWIZZLE_Z: return "z";
		case SWIZZLE_W: return "w";
		default: return  "?";
	}
}

unsigned int
register_address::to_int()
{
	unsigned int swz_val;
	switch(m_swizzle) {
	case SWIZZLE_X: swz_val = 0; break;
	case SWIZZLE_Y: swz_val = 1; break;
	case SWIZZLE_Z: swz_val = 2; break;
	case SWIZZLE_W: swz_val = 3; break;
	case SWIZZLE_EMPTY:
		if (m_type == REGISTER_TYPE_NONE) {
			return 0;
		}
		/* Fall through */
	default:
		std::cerr << __FUNCTION__ << ": unhandled swizzle: " <<
					m_swizzle << "\n";
		return 0;
	}
	return (m_index * 4) + swz_val;
}