summaryrefslogtreecommitdiff
path: root/src/jit/valuenum.cpp
diff options
context:
space:
mode:
authorLevi Broderick <GrabYourPitchforks@users.noreply.github.com>2018-11-08 15:35:32 -0800
committerGitHub <noreply@github.com>2018-11-08 15:35:32 -0800
commita6c04ffea322382d5ed38c9278ade2c5c5b950ff (patch)
tree32ac6480e615e988b5d3953aca062b30420d223c /src/jit/valuenum.cpp
parentae4dc9cd50e50dd1f199fa457dc65495f26a71b4 (diff)
downloadcoreclr-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.cpp32
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;
}