rewrite F_from_U16_BE() a little

Shouldn't be any significant change here... it's just that
aarch64-linux-gnu-g++ 7.2 segfaults when compiling the code
at head and handles this version just fine.

Change-Id: Ib291e1298aeb8a221f3be307ef13df41f43d53d2
Reviewed-on: https://skia-review.googlesource.com/c/skcms/+/225180
Auto-Submit: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/src/Transform_inl.h b/src/Transform_inl.h
index a8e8aa6..54fbdd2 100644
--- a/src/Transform_inl.h
+++ b/src/Transform_inl.h
@@ -540,8 +540,9 @@
 SI F F_from_U16_BE(U16 v) {
     // All 16-bit ICC values are big-endian, so we byte swap before converting to float.
     // MSVC catches the "loss" of data here in the portable path, so we also make sure to mask.
-    v = (U16)( ((v<<8)|(v>>8)) & 0xffff );
-    return cast<F>(v) * (1/65535.0f);
+    U16 lo = (v >> 8),
+        hi = (v << 8) & 0xffff;
+    return cast<F>(lo|hi) * (1/65535.0f);
 }
 
 SI U16 U16_from_F(F v) {