diff options
author | Levi Broderick <GrabYourPitchforks@users.noreply.github.com> | 2018-11-08 15:35:32 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-08 15:35:32 -0800 |
commit | a6c04ffea322382d5ed38c9278ade2c5c5b950ff (patch) | |
tree | 32ac6480e615e988b5d3953aca062b30420d223c /src/jit/valuenum.cpp | |
parent | ae4dc9cd50e50dd1f199fa457dc65495f26a71b4 (diff) | |
download | coreclr-a6c04ffea322382d5ed38c9278ade2c5c5b950ff.tar.gz coreclr-a6c04ffea322382d5ed38c9278ade2c5c5b950ff.tar.bz2 coreclr-a6c04ffea322382d5ed38c9278ade2c5c5b950ff.zip |
Enlighten ValueNumStore::EvalOpSpecialized about bswap nodes (#20883)
Diffstat (limited to 'src/jit/valuenum.cpp')
-rw-r--r-- | src/jit/valuenum.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/jit/valuenum.cpp b/src/jit/valuenum.cpp index 6238ba9f20..31a331c19b 100644 --- a/src/jit/valuenum.cpp +++ b/src/jit/valuenum.cpp @@ -625,6 +625,38 @@ T ValueNumStore::EvalOpSpecialized(VNFunc vnf, T v0) case GT_NOT: return ~v0; + case GT_BSWAP16: + { + UINT16 v0_unsigned = UINT16(v0); + + v0_unsigned = ((v0_unsigned >> 8) & 0xFF) | ((v0_unsigned << 8) & 0xFF00); + return T(v0_unsigned); + } + + case GT_BSWAP: + if (sizeof(T) == 4) + { + UINT32 v0_unsigned = UINT32(v0); + + v0_unsigned = ((v0_unsigned >> 24) & 0xFF) | ((v0_unsigned >> 8) & 0xFF00) | + ((v0_unsigned << 8) & 0xFF0000) | ((v0_unsigned << 24) & 0xFF000000); + return T(v0_unsigned); + } + else if (sizeof(T) == 8) + { + UINT64 v0_unsigned = UINT64(v0); + + v0_unsigned = ((v0_unsigned >> 56) & 0xFF) | ((v0_unsigned >> 40) & 0xFF00) | + ((v0_unsigned >> 24) & 0xFF0000) | ((v0_unsigned >> 8) & 0xFF000000) | + ((v0_unsigned << 8) & 0xFF00000000) | ((v0_unsigned << 24) & 0xFF0000000000) | + ((v0_unsigned << 40) & 0xFF000000000000) | ((v0_unsigned << 56) & 0xFF00000000000000); + return T(v0_unsigned); + } + else + { + break; // unknown primitive + } + default: break; } |