summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2010-12-16 14:43:51 -0800
committerTom Stellard <tstellar@gmail.com>2010-12-16 14:43:51 -0800
commit962a4157f5492972a679fe6dbfaa0a7288304e9f (patch)
treef2162acc59f134247eb89c8f08396b42e59c234a
parent87da9b9035d27fb433a402d0e99d966b9bff1d78 (diff)
Add new register types.
-rw-r--r--Makefile19
-rw-r--r--emulator.cpp14
-rw-r--r--emulator.h6
-rw-r--r--program.cpp9
-rw-r--r--register_address.cpp39
-rw-r--r--register_address.h12
6 files changed, 77 insertions, 22 deletions
diff --git a/Makefile b/Makefile
index 0bd7026..4660078 100644
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,18 @@
CXXFLAGS+=-g -Wall
-DEPS := $(OBJS:.o=.d)
--include $(DEPS)
+LIBNAME=debugger
-debugger: main.o evaluator.o emulator.o value.o instruction.o register_address.o test_loader.o program.o
+OBJECTS= \
+emulator.o \
+evaluator.o \
+instruction.o \
+program.o \
+register_address.o \
+value.o
+
+lib: $(OBJECTS)
+ ar -r lib$(LIBNAME).a $^
+
+debugger: main.o test_loader.o $(OBJECTS)
g++ -o $@ $^
-%.o: %.cpp
- $(CXX) -MM -MF $(patsubst %.o,%.d,$@) $<
- $(CXX) $(CXXFLAGS) -o $@ -c $<
diff --git a/emulator.cpp b/emulator.cpp
index 140b49e..dfcf78e 100644
--- a/emulator.cpp
+++ b/emulator.cpp
@@ -29,6 +29,7 @@ emulator::run()
std::cerr << "Could not load program\n";
return;
}
+ m_immediate_regs = p->m_immediate_regs;
std::vector<instruction *>::iterator it;
for(it = p->m_instructions.begin();
it < p->m_instructions.end(); ++it) {
@@ -48,7 +49,7 @@ emulator::set_constants(float value)
value *
emulator::get_value(register_address addr)
{
- unsigned int index = calc_reg_index(addr.m_index, addr.m_swizzle);
+ unsigned int index = addr.to_int();
switch(addr.m_type) {
case REGISTER_TYPE_TEMP: return m_temp_regs[index]->clone();
@@ -63,6 +64,7 @@ emulator::get_value(register_address addr)
}
}
case REGISTER_TYPE_OUT: return m_out_regs[index]->clone();
+ case REGISTER_TYPE_IMMEDIATE: return m_immediate_regs[index]->clone();
default:
assert(0);
return NULL;
@@ -74,7 +76,7 @@ emulator::set_value(
register_address addr,
value * val)
{
- unsigned int index = calc_reg_index(addr.m_index, addr.m_swizzle);
+ unsigned int index = addr.to_int();
switch(addr.m_type) {
case REGISTER_TYPE_TEMP:
@@ -96,11 +98,3 @@ emulator::get_output_value(int index)
//XXX: Make sure not to go over bounds.
return m_out_regs[index]->simplify();
}
-
-unsigned int
-emulator::calc_reg_index(
- unsigned int index,
- enum swizzle swz)
-{
- return (index * 4) + (swz - 1);
-}
diff --git a/emulator.h b/emulator.h
index 374ceba..3f64ca4 100644
--- a/emulator.h
+++ b/emulator.h
@@ -26,16 +26,12 @@ public:
value * get_output_value(int index);
private:
- unsigned int calc_reg_index(
- unsigned int index,
- enum swizzle swz);
-
program_loader * m_loader;
std::vector<value *> m_temp_regs;
std::vector<float_value *> m_const_regs;
std::vector<value *> m_out_regs;
std::vector<value *> m_private_regs;
- std::vector<float_value*> m_imediate_regs;
+ std::vector<float_value*> m_immediate_regs;
};
#endif //EMULATOR_H
diff --git a/program.cpp b/program.cpp
index e6d7ca7..01d584f 100644
--- a/program.cpp
+++ b/program.cpp
@@ -1,5 +1,14 @@
#include "program.h"
+#include "value.h"
+
+register_address
+program::add_immediate(float value)
+{
+ m_immediate_regs.push_back(new float_value(value));
+ return register_address(REGISTER_TYPE_IMMEDIATE, m_immediate_regs.size());
+}
+
void
program::add_instruction(instruction * inst)
{
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;
+}
diff --git a/register_address.h b/register_address.h
index 293cfda..7f1d1ae 100644
--- a/register_address.h
+++ b/register_address.h
@@ -4,10 +4,12 @@
#define REGISTER_ADDRESS_H_
enum register_type {
+ REGISTER_TYPE_NONE,
REGISTER_TYPE_TEMP,
REGISTER_TYPE_CONST,
REGISTER_TYPE_IN,
- REGISTER_TYPE_OUT
+ REGISTER_TYPE_OUT,
+ REGISTER_TYPE_IMMEDIATE
};
enum swizzle {
@@ -26,11 +28,19 @@ public:
unsigned int index,
enum swizzle swizzle);
+ register_address();
+
+ register_address(
+ register_type type,
+ unsigned int int_val);
+
std::string to_string();
static std::string register_type_to_string(enum register_type type);
static std::string swizzle_to_string(enum swizzle swz);
+ unsigned int to_int();
+
register_type m_type;
unsigned int m_index;
enum swizzle m_swizzle;