No public description
PiperOrigin-RevId: 559172498
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);