summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2011-01-04 19:39:08 -0800
committerTom Stellard <tstellar@gmail.com>2011-01-04 19:39:08 -0800
commite5ab0c159565b9f012ff00f3b5471b02bd7ee4eb (patch)
treecfba8b9db1c7233557801a3e69e5744744d06df6
parentc8365d7ec42498b1eeab9ea0ded84fda7b22fe76 (diff)
Add sat_instruction
-rw-r--r--evaluator.cpp23
-rw-r--r--evaluator.h8
-rw-r--r--instruction.cpp4
-rw-r--r--instruction.h5
4 files changed, 40 insertions, 0 deletions
diff --git a/evaluator.cpp b/evaluator.cpp
index 2741d84..c61b116 100644
--- a/evaluator.cpp
+++ b/evaluator.cpp
@@ -144,3 +144,26 @@ sub_evaluator::evaluate(
}
return new float_value(l->m_value - r->m_value);
}
+
+sat_evaluator::sat_evaluator() :
+ evaluator("SAT")
+ { }
+
+value *
+sat_evaluator::evaluate(
+ float_value * l,
+ float_value * r)
+{
+ float val;
+ if (!l || !l->m_has_value) {
+ return default_evaluate(l, r);
+ }
+ val = l->m_value;
+ if (val < 0.0f) {
+ val = 0.0f;
+ }
+ if (val > 1.0f) {
+ val = 1.0f;
+ }
+ return new float_value(val);
+}
diff --git a/evaluator.h b/evaluator.h
index 2b3f682..cd90765 100644
--- a/evaluator.h
+++ b/evaluator.h
@@ -64,4 +64,12 @@ public:
float_value * l,
float_value * r);
};
+
+class sat_evaluator : public evaluator {
+public:
+ sat_evaluator();
+ value * evaluate(
+ float_value * l,
+ float_value * r);
+};
#endif //EVALUATOR_H_
diff --git a/instruction.cpp b/instruction.cpp
index 52dc8ba..5787c21 100644
--- a/instruction.cpp
+++ b/instruction.cpp
@@ -123,3 +123,7 @@ abs_instruction::abs_instruction(std::vector<register_address> dst) :
sub_instruction::sub_instruction(std::vector<register_address> dst) :
instruction("SUB", new sub_evaluator(), dst, 2)
{ }
+
+sat_instruction::sat_instruction(std::vector<register_address> dst) :
+ instruction("SAT", new sat_evaluator(), dst, 1)
+ { }
diff --git a/instruction.h b/instruction.h
index 13bf4de..cded5ca 100644
--- a/instruction.h
+++ b/instruction.h
@@ -73,4 +73,9 @@ public:
sub_instruction(std::vector<register_address> dst);
};
+class sat_instruction : public instruction {
+public:
+ sat_instruction(std::vector<register_address> dst);
+};
+
#endif //INSTRUCTION_H_