diff options
author | QingShan Zhang <qshanz@cn.ibm.com> | 2019-06-04 08:53:53 +0000 |
---|---|---|
committer | QingShan Zhang <qshanz@cn.ibm.com> | 2019-06-04 08:53:53 +0000 |
commit | 11de0e71b0da7c822f7e7636ebe46f54ebc856db (patch) | |
tree | 068ce7d4cc92ccb53c76148e43aa5febd30ad607 /llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp | |
parent | 72667b4e4811e6ecac3031b4b3ec8ec50bce3ac1 (diff) | |
download | llvm-11de0e71b0da7c822f7e7636ebe46f54ebc856db.zip llvm-11de0e71b0da7c822f7e7636ebe46f54ebc856db.tar.gz llvm-11de0e71b0da7c822f7e7636ebe46f54ebc856db.tar.bz2 |
[DAGCombine] Match a pattern where a wide type scalar value is stored by several narrow stores
This opportunity is found from spec 2017 557.xz_r. And it is used by the sha encrypt/decrypt. See sha-2/sha512.c
static void store64(u64 x, unsigned char* y)
{
for(int i = 0; i != 8; ++i)
y[i] = (x >> ((7-i) * 8)) & 255;
}
static u64 load64(const unsigned char* y)
{
u64 res = 0;
for(int i = 0; i != 8; ++i)
res |= (u64)(y[i]) << ((7-i) * 8);
return res;
}
The load64 has been implemented by https://reviews.llvm.org/D26149
This patch is trying to implement the store pattern.
Match a pattern where a wide type scalar value is stored by several narrow
stores. Fold it into a single store or a BSWAP and a store if the targets
supports it.
Assuming little endian target:
i8 *p = ...
i32 val = ...
p[0] = (val >> 0) & 0xFF;
p[1] = (val >> 8) & 0xFF;
p[2] = (val >> 16) & 0xFF;
p[3] = (val >> 24) & 0xFF;
>
*((i32)p) = val;
i8 *p = ...
i32 val = ...
p[0] = (val >> 24) & 0xFF;
p[1] = (val >> 16) & 0xFF;
p[2] = (val >> 8) & 0xFF;
p[3] = (val >> 0) & 0xFF;
>
*((i32)p) = BSWAP(val);
Differential Revision: https://reviews.llvm.org/D61843
llvm-svn: 362472
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCMachineScheduler.cpp')
0 files changed, 0 insertions, 0 deletions