IVGCVSW-4211 Add Signed 8 bit Quantisation support into the Reference backend

!android-nn-driver:2435

Signed-off-by: Finn Williams <Finn.Williams@arm.com>
Change-Id: I10ecd4a8937725953396805f33a3562a5384c4d4
diff --git a/src/backends/reference/workloads/BaseIterator.hpp b/src/backends/reference/workloads/BaseIterator.hpp
index ca5110c..ca6d3cb 100644
--- a/src/backends/reference/workloads/BaseIterator.hpp
+++ b/src/backends/reference/workloads/BaseIterator.hpp
@@ -137,6 +137,25 @@
     const int32_t m_Offset;
 };
 
+class QSymmS8Decoder : public TypedIterator<const int8_t, Decoder<float>>
+{
+public:
+    QSymmS8Decoder(const int8_t* data, const float scale, const int32_t offset)
+            : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
+
+    QSymmS8Decoder(const float scale, const int32_t offset)
+            : QSymmS8Decoder(nullptr, scale, offset) {}
+
+    float Get() const override
+    {
+        return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
+    }
+
+private:
+    const float m_Scale;
+    const int32_t m_Offset;
+};
+
 class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
 {
 public:
@@ -245,6 +264,30 @@
     const int32_t m_Offset;
 };
 
+class QSymmS8Encoder : public TypedIterator<int8_t, Encoder<float>>
+{
+public:
+    QSymmS8Encoder(int8_t* data, const float scale, const int32_t offset)
+            : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
+
+    QSymmS8Encoder(const float scale, const int32_t offset)
+            : QSymmS8Encoder(nullptr, scale, offset) {}
+
+    void Set(float right) override
+    {
+        *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale, m_Offset);
+    }
+
+    float Get() const override
+    {
+        return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
+    }
+
+private:
+    const float m_Scale;
+    const int32_t m_Offset;
+};
+
 class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
 {
 public: