summaryrefslogtreecommitdiff
path: root/validat1.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2018-08-06 22:19:59 -0400
committerJeffrey Walton <noloader@gmail.com>2018-08-06 22:19:59 -0400
commitd4428d7f1cada9cc24d88189c583a50454c260ac (patch)
tree5ac7750456e7c574202095be911fc4bee02d17ed /validat1.cpp
parenta4ebb75538f1fde6cdba481765b5f9216ecb0bc3 (diff)
downloadcryptopp-git-d4428d7f1cada9cc24d88189c583a50454c260ac.tar.gz
Add VectorLoad and VectorStore test code
Applies to POWER4 and above only
Diffstat (limited to 'validat1.cpp')
-rw-r--r--validat1.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/validat1.cpp b/validat1.cpp
index 9095ad22..ac39543a 100644
--- a/validat1.cpp
+++ b/validat1.cpp
@@ -14,6 +14,10 @@
#include "gzip.h"
#include "zlib.h"
+#if defined(CRYPTOPP_ALTIVEC_AVAILABLE)
+# include "ppc-simd.h"
+#endif
+
#include <iostream>
#include <iomanip>
#include <sstream>
@@ -1058,5 +1062,79 @@ bool TestHuffmanCodes()
}
#endif
+#if defined(CRYPTOPP_EXTENDED_VALIDATION)
+# if defined(CRYPTOPP_ALTIVEC_AVAILABLE)
+bool TestAltivecOps()
+{
+ std::cout << "\nTesting Altivec operations...\n\n";
+ bool pass=true;
+
+ if (HasAltivec() == false)
+ {
+ std::cout << "\nAltivec not available, skipping test." << std::endl;
+ return true;
+ }
+
+ //********** Unaligned loads and stores **********//
+
+ CRYPTOPP_ALIGN_DATA(16)
+ byte dest[20], src[20] = {23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4};
+ const byte exp1[16] ={22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7};
+ const byte exp2[16] ={21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6};
+ const byte exp3[16] ={20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5};
+
+ VectorStore(VectorLoad(src), dest);
+ pass = (0 == std::memcmp(src, dest, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStore(VectorLoad(src+1), dest+1);
+ pass = (0 == std::memcmp(exp1, dest+1, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStore(VectorLoad(src+2), dest+2);
+ pass = (0 == std::memcmp(exp2, dest+2, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStore(VectorLoad(src+3), dest+3);
+ pass = (0 == std::memcmp(exp3, dest+3, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStoreBE(VectorLoadBE(src), dest);
+ pass = (0 == std::memcmp(src, dest, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStoreBE(VectorLoadBE(src+1), dest+1);
+ pass = (0 == std::memcmp(exp1, dest+1, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStoreBE(VectorLoadBE(src+2), dest+2);
+ pass = (0 == std::memcmp(exp2, dest+2, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStoreBE(VectorLoadBE(src+3), dest+3);
+ pass = (0 == std::memcmp(exp3, dest+3, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+#if defined(CRYPTOPP_LITTLE_ENDIAN)
+ VectorStore(VectorLoadBE(src), dest);
+ pass = (0 != std::memcmp(src, dest, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+
+ VectorStoreBE(VectorLoad(src), dest);
+ pass = (0 != std::memcmp(src, dest, 16)) && pass;
+ CRYPTOPP_ASSERT(pass);
+#endif
+
+ if (!pass)
+ std::cout << "FAILED:";
+ else
+ std::cout << "passed:";
+ std::cout << " Altivec loads and stores" << std::endl;
+
+ return pass;
+}
+#endif
+#endif
+
NAMESPACE_END // Test
NAMESPACE_END // CryptoPP