summaryrefslogtreecommitdiff
path: root/simon128_simd.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2020-04-08 22:19:50 -0400
committerJeffrey Walton <noloader@gmail.com>2020-04-08 22:19:50 -0400
commitbe0dea49be333f4c7434bf8e2fffb81b5e00498d (patch)
tree24e1d094baf4bc81288395a08dcce412dd509518 /simon128_simd.cpp
parent38df1c0024e1217e1064d1800140586c523b1c74 (diff)
downloadcryptopp-git-be0dea49be333f4c7434bf8e2fffb81b5e00498d.tar.gz
Add VecSplatElement64 for PowerPC
Diffstat (limited to 'simon128_simd.cpp')
-rw-r--r--simon128_simd.cpp60
1 files changed, 15 insertions, 45 deletions
diff --git a/simon128_simd.cpp b/simon128_simd.cpp
index d57f1a4a..3b9db7e7 100644
--- a/simon128_simd.cpp
+++ b/simon128_simd.cpp
@@ -554,7 +554,7 @@ using CryptoPP::VecSub64;
using CryptoPP::VecAnd64;
using CryptoPP::VecOr64;
using CryptoPP::VecXor64;
-using CryptoPP::VecSplatWord64;
+using CryptoPP::VecSplatElement64;
using CryptoPP::VecRotateLeft64;
using CryptoPP::VecRotateRight64;
using CryptoPP::VecLoad;
@@ -641,34 +641,19 @@ inline void SIMON128_Dec_Block(uint32x4_p &block, const word64 *subkeys, unsigne
std::swap(x1, y1);
const word32* ptr = reinterpret_cast<const word32*>(subkeys+rounds-1);
- const simon128_t rk = (simon128_t)VecLoad(ptr);
+ const simon128_t tk = (simon128_t)VecLoad(ptr);
+ const simon128_t rk = (simon128_t)VecSplatElement64<0>(tk);
-#if defined(_ARCH_PWR8)
- const simon128_t rk1 = vec_splat(rk, 0);
-#else
- const uint8x16_p m = {0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7};
- const simon128_t rk1 = VecPermute(rk, m);
-#endif
-
- y1 = VecXor64(VecXor64(y1, rk1), SIMON128_f(x1));
+ y1 = VecXor64(VecXor64(y1, rk), SIMON128_f(x1));
rounds--;
}
for (int i = static_cast<int>(rounds-2); i >= 0; i -= 2)
{
const word32* ptr = reinterpret_cast<const word32*>(subkeys+i);
- const simon128_t rk = (simon128_t)VecLoad(ptr);
-
-#if defined(_ARCH_PWR8)
- const simon128_t rk1 = vec_splat(rk, 1);
- const simon128_t rk2 = vec_splat(rk, 0);
-#else
- const uint8x16_p m1 = {8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15};
- const uint8x16_p m2 = {0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7};
-
- const simon128_t rk1 = VecPermute(rk, m1);
- const simon128_t rk2 = VecPermute(rk, m2);
-#endif
+ const simon128_t tk = (simon128_t)VecLoad(ptr);
+ const simon128_t rk1 = (simon128_t)VecSplatElement64<1>(tk);
+ const simon128_t rk2 = (simon128_t)VecSplatElement64<0>(tk);
x1 = VecXor64(VecXor64(x1, SIMON128_f(y1)), rk1);
y1 = VecXor64(VecXor64(y1, SIMON128_f(x1)), rk2);
@@ -779,36 +764,21 @@ inline void SIMON128_Dec_6_Blocks(uint32x4_p &block0, uint32x4_p &block1,
std::swap(x1, y1); std::swap(x2, y2); std::swap(x3, y3);
const word32* ptr = reinterpret_cast<const word32*>(subkeys+rounds-1);
- const simon128_t rk = (simon128_t)VecLoad(ptr);
+ const simon128_t tk = (simon128_t)VecLoad(ptr);
+ const simon128_t rk = (simon128_t)VecSplatElement64<0>(tk);
-#if defined(_ARCH_PWR8)
- const simon128_t rk1 = vec_splat(rk, 0);
-#else
- const uint8x16_p m = {0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7};
- const simon128_t rk1 = VecPermute(rk, m);
-#endif
-
- y1 = VecXor64(VecXor64(y1, rk1), SIMON128_f(x1));
- y2 = VecXor64(VecXor64(y2, rk1), SIMON128_f(x2));
- y3 = VecXor64(VecXor64(y3, rk1), SIMON128_f(x3));
+ y1 = VecXor64(VecXor64(y1, rk), SIMON128_f(x1));
+ y2 = VecXor64(VecXor64(y2, rk), SIMON128_f(x2));
+ y3 = VecXor64(VecXor64(y3, rk), SIMON128_f(x3));
rounds--;
}
for (int i = static_cast<int>(rounds-2); i >= 0; i -= 2)
{
const word32* ptr = reinterpret_cast<const word32*>(subkeys+i);
- const simon128_t rk = (simon128_t)VecLoad(ptr);
-
-#if defined(_ARCH_PWR8)
- const simon128_t rk1 = vec_splat(rk, 1);
- const simon128_t rk2 = vec_splat(rk, 0);
-#else
- const uint8x16_p m1 = {8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15};
- const uint8x16_p m2 = {0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7};
-
- const simon128_t rk1 = VecPermute(rk, m1);
- const simon128_t rk2 = VecPermute(rk, m2);
-#endif
+ const simon128_t tk = (simon128_t)VecLoad(ptr);
+ const simon128_t rk1 = (simon128_t)VecSplatElement64<1>(tk);
+ const simon128_t rk2 = (simon128_t)VecSplatElement64<0>(tk);
x1 = VecXor64(VecXor64(x1, SIMON128_f(y1)), rk1);
x2 = VecXor64(VecXor64(x2, SIMON128_f(y2)), rk1);