summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2010-12-29 12:45:08 -0800
committerTom Stellard <tstellar@gmail.com>2010-12-29 12:45:08 -0800
commit5bc2a1f3dd379dc2b642a094dbeb191901fccafa (patch)
treec5d45edcddca9df99ed2fccb94d7992e8b531be8
parente70c6bfb0970de17d02528b44df6e11c159d552c (diff)
add sub_instruction
-rw-r--r--evaluator.cpp15
-rw-r--r--evaluator.h8
-rw-r--r--instruction.cpp4
-rw-r--r--instruction.h5
4 files changed, 32 insertions, 0 deletions
diff --git a/evaluator.cpp b/evaluator.cpp
index c182bcd..2741d84 100644
--- a/evaluator.cpp
+++ b/evaluator.cpp
@@ -129,3 +129,18 @@ abs_evaluator::evaluate(
}
return new float_value(fabsf(l->m_value));
}
+
+sub_evaluator::sub_evaluator() :
+ evaluator("-")
+ { }
+
+value *
+sub_evaluator::evaluate(
+ float_value * l,
+ float_value * r)
+{
+ if (!l || !r || !l->m_has_value || !r->m_has_value) {
+ return default_evaluate(l, r);
+ }
+ return new float_value(l->m_value - r->m_value);
+}
diff --git a/evaluator.h b/evaluator.h
index 02c7ff6..2b3f682 100644
--- a/evaluator.h
+++ b/evaluator.h
@@ -56,4 +56,12 @@ public:
float_value * l,
float_value * r);
};
+
+class sub_evaluator : public evaluator {
+public:
+ sub_evaluator();
+ value * evaluate(
+ float_value * l,
+ float_value * r);
+};
#endif //EVALUATOR_H_
diff --git a/instruction.cpp b/instruction.cpp
index 1f6f81d..779b397 100644
--- a/instruction.cpp
+++ b/instruction.cpp
@@ -119,3 +119,7 @@ mad_instruction::execute(emulator & emulator)
abs_instruction::abs_instruction(std::vector<register_address> dst) :
instruction("ABS", new abs_evaluator(), dst, 1)
{ }
+
+sub_instruction::sub_instruction(std::vector<register_address> dst) :
+ instruction("SUB", new sub_evaluator(), dst, 2)
+ { }
diff --git a/instruction.h b/instruction.h
index d178644..13bf4de 100644
--- a/instruction.h
+++ b/instruction.h
@@ -68,4 +68,9 @@ public:
abs_instruction(std::vector<register_address> dst);
};
+class sub_instruction : public instruction {
+public:
+ sub_instruction(std::vector<register_address> dst);
+};
+
#endif //INSTRUCTION_H_