diff options
author | Tom Stellard <tstellar@gmail.com> | 2010-12-16 14:43:51 -0800 |
---|---|---|
committer | Tom Stellard <tstellar@gmail.com> | 2010-12-16 14:43:51 -0800 |
commit | 962a4157f5492972a679fe6dbfaa0a7288304e9f (patch) | |
tree | f2162acc59f134247eb89c8f08396b42e59c234a | |
parent | 87da9b9035d27fb433a402d0e99d966b9bff1d78 (diff) |
Add new register types.
-rw-r--r-- | Makefile | 19 | ||||
-rw-r--r-- | emulator.cpp | 14 | ||||
-rw-r--r-- | emulator.h | 6 | ||||
-rw-r--r-- | program.cpp | 9 | ||||
-rw-r--r-- | register_address.cpp | 39 | ||||
-rw-r--r-- | register_address.h | 12 |
6 files changed, 77 insertions, 22 deletions
@@ -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); -} @@ -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; |