diff options
Diffstat (limited to 'src/jit')
-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; } |