diff --git a/sim/kelvin_vector_instructions.cc b/sim/kelvin_vector_instructions.cc
index fce79e7..05f94f9 100644
--- a/sim/kelvin_vector_instructions.cc
+++ b/sim/kelvin_vector_instructions.cc
@@ -736,58 +736,59 @@
 T KelvinVShiftHelper(bool round, T vs1, T vs2) {
   using WT = typename mpact::sim::riscv::WideType<T>::type;
   if (std::is_signed<T>::value == true) {
-    constexpr int n = sizeof(T) * 8;
+    constexpr int kMaxShiftBit = sizeof(T) * 8;
     int shamt = vs2;
-    WT s = vs1;
+    WT shift = vs1;
     if (!vs1) {
       return 0;
-    } else if (vs1 < 0 && shamt >= n) {
-      s = -1 + round;
-    } else if (vs1 > 0 && shamt >= n) {
-      s = 0;
+    } else if (vs1 < 0 && shamt >= kMaxShiftBit) {
+      shift = -1 + round;
+    } else if (vs1 > 0 && shamt >= kMaxShiftBit) {
+      shift = 0;
     } else if (shamt > 0) {
-      s = (static_cast<WT>(vs1) +
-           (round ? static_cast<WT>(1ll << (shamt - 1)) : 0)) >>
-          shamt;
+      shift = (static_cast<WT>(vs1) +
+               (round ? static_cast<WT>(1ll << (shamt - 1)) : 0)) >>
+              shamt;
     } else {  // shamt < 0
       using UT = typename std::make_unsigned<T>::type;
-      UT ushamt = static_cast<UT>(-shamt <= n ? -shamt : n);
-      CHECK_LE(ushamt, n);
+      UT ushamt =
+          static_cast<UT>(-shamt <= kMaxShiftBit ? -shamt : kMaxShiftBit);
+      CHECK_LE(ushamt, kMaxShiftBit);
       CHECK_GE(ushamt, 0);
       // Use unsigned WideType to prevent undefined negative shift.
       using UWT = typename mpact::sim::riscv::WideType<UT>::type;
-      s = static_cast<WT>(static_cast<UWT>(vs1) << ushamt);
+      shift = static_cast<WT>(static_cast<UWT>(vs1) << ushamt);
     }
     T neg_max = std::numeric_limits<T>::min();
     T pos_max = std::numeric_limits<T>::max();
-    bool neg_sat = vs1 < 0 && (shamt <= -n || s < neg_max);
-    bool pos_sat = vs1 > 0 && (shamt <= -n || s > pos_max);
+    bool neg_sat = vs1 < 0 && (shamt <= -kMaxShiftBit || shift < neg_max);
+    bool pos_sat = vs1 > 0 && (shamt <= -kMaxShiftBit || shift > pos_max);
     if (neg_sat) return neg_max;
     if (pos_sat) return pos_max;
-    return s;
-  } else {
-    constexpr int n = sizeof(T) * 8;
-    // Shift can be positive/negative.
-    int shamt = static_cast<typename std::make_signed<T>::type>(vs2);
-    WT s = vs1;
-    if (!vs1) {
-      return 0;
-    } else if (shamt > n) {
-      s = 0;
-    } else if (shamt > 0) {
-      s = (static_cast<WT>(vs1) +
-           (round ? static_cast<WT>(1ull << (shamt - 1)) : 0)) >>
-          shamt;
-    } else {
-      using UT = typename std::make_unsigned<T>::type;
-      UT ushamt = static_cast<UT>(-shamt <= n ? -shamt : n);
-      s = static_cast<WT>(vs1) << (ushamt);
-    }
-    T pos_max = std::numeric_limits<T>::max();
-    bool pos_sat = vs1 && (shamt < -n || s > pos_max);
-    if (pos_sat) return pos_max;
-    return s;
+    return shift;
   }
+  // unsigned.
+  constexpr int kMaxShiftBit = sizeof(T) * 8;
+  // Shift can be positive/negative.
+  int shamt = static_cast<typename std::make_signed<T>::type>(vs2);
+  WT shift = vs1;
+  if (!vs1) {
+    return 0;
+  } else if (shamt > kMaxShiftBit) {
+    shift = 0;
+  } else if (shamt > 0) {
+    shift = (static_cast<WT>(vs1) +
+             (round ? static_cast<WT>(1ull << (shamt - 1)) : 0)) >>
+            shamt;
+  } else {
+    using UT = typename std::make_unsigned<T>::type;
+    UT ushamt = static_cast<UT>(-shamt <= kMaxShiftBit ? -shamt : kMaxShiftBit);
+    shift = static_cast<WT>(vs1) << (ushamt);
+  }
+  T pos_max = std::numeric_limits<T>::max();
+  bool pos_sat = vs1 && (shamt < -kMaxShiftBit || shift > pos_max);
+  if (pos_sat) return pos_max;
+  return shift;
 }
 
 template <typename T>
@@ -939,11 +940,11 @@
               static_cast<WT>(std::numeric_limits<T>::min()),
               std::min(static_cast<WT>(std::numeric_limits<T>::max()), result));
           return result;
-        } else {
-          result =
-              std::min(static_cast<WT>(std::numeric_limits<T>::max()), result);
-          return result;
         }
+
+        result =
+            std::min(static_cast<WT>(std::numeric_limits<T>::max()), result);
+        return result;
       }));
 }
 template void KelvinVMuls<int8_t>(bool, bool, Instruction *);
@@ -1318,9 +1319,9 @@
 
   if (dst_element_index & 1) {
     return GetInstructionSource<T>(inst, 1, scalar ? 0 : src_element_index);
-  } else {
-    return GetInstructionSource<T>(inst, 0, src_element_index);
   }
+
+  return GetInstructionSource<T>(inst, 0, src_element_index);
 }
 
 template <typename T>
diff --git a/sim/test/kelvin_vector_instructions_test.cc b/sim/test/kelvin_vector_instructions_test.cc
index 5c75baa..a465223 100644
--- a/sim/test/kelvin_vector_instructions_test.cc
+++ b/sim/test/kelvin_vector_instructions_test.cc
@@ -745,10 +745,10 @@
     if (std::is_signed<Vd>::value) {
       return static_cast<Vd>(
           (static_cast<int64_t>(vs1) + static_cast<int64_t>(vs2)) >> 1);
-    } else {
-      return static_cast<Vd>(
-          (static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2)) >> 1);
     }
+
+    return static_cast<Vd>(
+        (static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2)) >> 1);
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVHadd<Vd>(scalar, strip_mine, false /* round */, inst);
@@ -770,10 +770,10 @@
     if (std::is_signed<Vd>::value) {
       return static_cast<Vd>(
           (static_cast<int64_t>(vs1) + static_cast<int64_t>(vs2) + 1) >> 1);
-    } else {
-      return static_cast<Vd>(
-          (static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2) + 1) >> 1);
     }
+
+    return static_cast<Vd>(
+        (static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2) + 1) >> 1);
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVHadd<Vd>(scalar, strip_mine, true /* round */, inst);
@@ -795,10 +795,10 @@
     if (std::is_signed<Vd>::value) {
       return static_cast<Vd>(
           (static_cast<int64_t>(vs1) - static_cast<int64_t>(vs2)) >> 1);
-    } else {
-      return static_cast<Vd>(
-          (static_cast<uint64_t>(vs1) - static_cast<uint64_t>(vs2)) >> 1);
     }
+
+    return static_cast<Vd>(
+        (static_cast<uint64_t>(vs1) - static_cast<uint64_t>(vs2)) >> 1);
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVHsub<Vd>(scalar, strip_mine, false /* round */, inst);
@@ -820,10 +820,10 @@
     if (std::is_signed<Vd>::value) {
       return static_cast<Vd>(
           (static_cast<int64_t>(vs1) - static_cast<int64_t>(vs2) + 1) >> 1);
-    } else {
-      return static_cast<Vd>(
-          (static_cast<uint64_t>(vs1) - static_cast<uint64_t>(vs2) + 1) >> 1);
     }
+
+    return static_cast<Vd>(
+        (static_cast<uint64_t>(vs1) - static_cast<uint64_t>(vs2) + 1) >> 1);
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVHsub<Vd>(scalar, strip_mine, true /* round */, inst);
@@ -1019,57 +1019,61 @@
 struct VShiftOp {
   static Vd Op(bool round, Vs1 vs1, Vs2 vs2) {
     if (std::is_signed<Vd>::value == true) {
-      constexpr int n = sizeof(Vd) * 8;
+      constexpr int kMaxShiftBit = sizeof(Vd) * 8;
       int shamt = 0;
       if (sizeof(Vd) == 1) shamt = static_cast<int8_t>(vs2);
       if (sizeof(Vd) == 2) shamt = static_cast<int16_t>(vs2);
       if (sizeof(Vd) == 4) shamt = static_cast<int32_t>(vs2);
-      int64_t s = vs1;
+      int64_t shift = vs1;
       if (!vs1) {
         return 0;
-      } else if (vs1 < 0 && shamt >= n) {
-        s = -1 + round;
-      } else if (vs1 > 0 && shamt >= n) {
-        s = 0;
+      } else if (vs1 < 0 && shamt >= kMaxShiftBit) {
+        shift = -1 + round;
+      } else if (vs1 > 0 && shamt >= kMaxShiftBit) {
+        shift = 0;
       } else if (shamt > 0) {
-        s = (static_cast<int64_t>(vs1) + (round ? (1ll << (shamt - 1)) : 0)) >>
+        shift =
+            (static_cast<int64_t>(vs1) + (round ? (1ll << (shamt - 1)) : 0)) >>
             shamt;
       } else {  // shamt < 0
-        uint32_t ushamt = static_cast<uint32_t>(-shamt <= n ? -shamt : n);
-        s = static_cast<int64_t>(static_cast<uint64_t>(vs1) << ushamt);
+        uint32_t ushamt = static_cast<uint32_t>(
+            -shamt <= kMaxShiftBit ? -shamt : kMaxShiftBit);
+        shift = static_cast<int64_t>(static_cast<uint64_t>(vs1) << ushamt);
       }
-      int64_t neg_max = (-1ull) << (n - 1);
-      int64_t pos_max = (1ll << (n - 1)) - 1;
-      bool neg_sat = vs1 < 0 && (shamt <= -n || s < neg_max);
-      bool pos_sat = vs1 > 0 && (shamt <= -n || s > pos_max);
+      int64_t neg_max = (-1ull) << (kMaxShiftBit - 1);
+      int64_t pos_max = (1ll << (kMaxShiftBit - 1)) - 1;
+      bool neg_sat = vs1 < 0 && (shamt <= -kMaxShiftBit || shift < neg_max);
+      bool pos_sat = vs1 > 0 && (shamt <= -kMaxShiftBit || shift > pos_max);
       if (neg_sat) return neg_max;
       if (pos_sat) return pos_max;
-      return s;
-    } else {
-      constexpr int n = sizeof(Vd) * 8;
-      int shamt = 0;
-      if (sizeof(Vd) == 1) shamt = static_cast<int8_t>(vs2);
-      if (sizeof(Vd) == 2) shamt = static_cast<int16_t>(vs2);
-      if (sizeof(Vd) == 4) shamt = static_cast<int32_t>(vs2);
-      uint64_t s = vs1;
-      if (!vs1) {
-        return 0;
-      } else if (shamt > n) {
-        s = 0;
-      } else if (shamt > 0) {
-        s = (static_cast<uint64_t>(vs1) +
-             (round ? (1ull << (shamt - 1)) : 0)) >>
-            shamt;
-      } else {
-        using UT = typename std::make_unsigned<Vd>::type;
-        UT ushamt = static_cast<UT>(-shamt <= n ? -shamt : n);
-        s = static_cast<uint64_t>(vs1) << (ushamt);
-      }
-      uint64_t pos_max = (1ull << n) - 1;
-      bool pos_sat = vs1 && (shamt < -n || s >= (1ull << n));
-      if (pos_sat) return pos_max;
-      return s;
+      return shift;
     }
+
+    constexpr int kMaxShiftBit = sizeof(Vd) * 8;
+    int shamt = 0;
+    if (sizeof(Vd) == 1) shamt = static_cast<int8_t>(vs2);
+    if (sizeof(Vd) == 2) shamt = static_cast<int16_t>(vs2);
+    if (sizeof(Vd) == 4) shamt = static_cast<int32_t>(vs2);
+    uint64_t shift = vs1;
+    if (!vs1) {
+      return 0;
+    } else if (shamt > kMaxShiftBit) {
+      shift = 0;
+    } else if (shamt > 0) {
+      shift =
+          (static_cast<uint64_t>(vs1) + (round ? (1ull << (shamt - 1)) : 0)) >>
+          shamt;
+    } else {
+      using UT = typename std::make_unsigned<Vd>::type;
+      UT ushamt =
+          static_cast<UT>(-shamt <= kMaxShiftBit ? -shamt : kMaxShiftBit);
+      shift = static_cast<uint64_t>(vs1) << (ushamt);
+    }
+    uint64_t pos_max = (1ull << kMaxShiftBit) - 1;
+    bool pos_sat =
+        vs1 && (shamt < -kMaxShiftBit || shift >= (1ull << kMaxShiftBit));
+    if (pos_sat) return pos_max;
+    return shift;
   }
 
   static void KelvinOp(bool round, bool scalar, bool strip_mine,
@@ -1250,10 +1254,10 @@
     if (std::is_signed<Vd>::value) {
       return static_cast<Vd>(static_cast<int64_t>(vs1) *
                              static_cast<int64_t>(vs2));
-    } else {
-      return static_cast<Vd>(static_cast<uint64_t>(vs1) *
-                             static_cast<uint64_t>(vs2));
     }
+
+    return static_cast<Vd>(static_cast<uint64_t>(vs1) *
+                           static_cast<uint64_t>(vs2));
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVMul<Vd>(scalar, strip_mine, inst);
@@ -1273,11 +1277,11 @@
           static_cast<int64_t>(std::numeric_limits<Vd>::min()),
           std::min(static_cast<int64_t>(std::numeric_limits<Vd>::max()), m));
       return m;
-    } else {
-      uint64_t m = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2);
-      m = std::min(static_cast<uint64_t>(std::numeric_limits<Vd>::max()), m);
-      return m;
     }
+
+    uint64_t m = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2);
+    m = std::min(static_cast<uint64_t>(std::numeric_limits<Vd>::max()), m);
+    return m;
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVMuls<Vd>(scalar, strip_mine, inst);
@@ -1321,10 +1325,10 @@
     if (std::is_signed<Vs1>::value) {
       int64_t result = static_cast<int64_t>(vs1) * static_cast<int64_t>(vs2);
       return static_cast<uint64_t>(result) >> n;
-    } else {
-      uint64_t result = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2);
-      return result >> n;
     }
+
+    uint64_t result = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2);
+    return result >> n;
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVMulh<Vd>(scalar, strip_mine, false /* round */, inst);
@@ -1349,11 +1353,11 @@
       int64_t result = static_cast<int64_t>(vs1) * static_cast<int64_t>(vs2);
       result += 1ll << (n - 1);
       return static_cast<uint64_t>(result) >> n;
-    } else {
-      uint64_t result = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2);
-      result += 1ull << (n - 1);
-      return result >> n;
     }
+
+    uint64_t result = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2);
+    result += 1ull << (n - 1);
+    return result >> n;
   }
   static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) {
     KelvinVMulh<Vd>(scalar, strip_mine, true /* round */, inst);
