Andreas Sandberg has uploaded this change for review. (
https://gem5-review.googlesource.com/3481
Change subject: arch-arm: Fix some poorly done type max and min in NEON
......................................................................
arch-arm: Fix some poorly done type max and min in NEON
The ISA code for ARM calculates min and max elements for types using
bit manipulation. That triggers some warnings, treated as errors, as
the compiler can tell that there is an overflow and the sign
flips. Fixed using standard lib definitions instead.
Change-Id: Ie2331b410c7f76d4bd87da5afe9edf20c8ac91b3
Reviewed-by: Giacomo Gabrielli <[email protected]>
Reviewed-by: Andreas Sandberg <[email protected]>
---
M src/arch/arm/isa/insts/neon.isa
M src/arch/arm/isa/insts/neon64.isa
2 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/src/arch/arm/isa/insts/neon.isa
b/src/arch/arm/isa/insts/neon.isa
index 163b71c..64419e4 100644
--- a/src/arch/arm/isa/insts/neon.isa
+++ b/src/arch/arm/isa/insts/neon.isa
@@ -2170,9 +2170,12 @@
bool negSrc1 = (srcElem1 < 0);
bool negSrc2 = (srcElem2 < 0);
if ((negDest != negSrc1) && (negSrc1 == negSrc2)) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
if (negDest)
- destElem -= 1;
+ /* If (>=0) plus (>=0) yields (<0), saturate to +. */
+ destElem = std::numeric_limits<Element>::max();
+ else
+ /* If (<0) plus (<0) yields (>=0), saturate to -. */
+ destElem = std::numeric_limits<Element>::min();
fpscr.qc = 1;
}
FpscrQc = fpscr;
@@ -2199,9 +2202,12 @@
bool negSrc1 = (srcElem1 < 0);
bool posSrc2 = (srcElem2 >= 0);
if ((negDest != negSrc1) && (negSrc1 == posSrc2)) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
if (negDest)
- destElem -= 1;
+ /* If (>=0) minus (<0) yields (<0), saturate to +. */
+ destElem = std::numeric_limits<Element>::max();
+ else
+ /* If (<0) minus (>=0) yields (>=0), saturate to -. */
+ destElem = std::numeric_limits<Element>::min();
fpscr.qc = 1;
}
FpscrQc = fpscr;
@@ -2514,7 +2520,7 @@
vqdmlalCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
BigElement midElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
- Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
+ Element maxNeg = std::numeric_limits<Element>::min();
Element halfNeg = maxNeg / 2;
if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
(srcElem1 == halfNeg && srcElem2 == maxNeg) ||
@@ -2539,7 +2545,7 @@
vqdmlslCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
BigElement midElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
- Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
+ Element maxNeg = std::numeric_limits<Element>::min();
Element halfNeg = maxNeg / 2;
if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
(srcElem1 == halfNeg && srcElem2 == maxNeg) ||
@@ -2565,8 +2571,7 @@
FPSCR fpscr = (FPSCR) FpscrQc;
destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
if (srcElem1 == srcElem2 &&
- srcElem1 == (Element)((Element)1 <<
- (Element)(sizeof(Element) * 8 - 1))) {
+ srcElem1 ==
(Element)(std::numeric_limits<Element>::min())) {
destElem = ~((BigElement)srcElem1 << (sizeof(Element) * 8));
fpscr.qc = 1;
}
@@ -2611,8 +2616,7 @@
destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2) >>
(sizeof(Element) * 8);
if (srcElem1 == srcElem2 &&
- srcElem1 == (Element)((Element)1 <<
- (sizeof(Element) * 8 - 1))) {
+ srcElem1 ==
(Element)(std::numeric_limits<Element>::min())) {
destElem = ~srcElem1;
fpscr.qc = 1;
}
@@ -2626,7 +2630,7 @@
destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2 +
((int64_t)1 << (sizeof(Element) * 8 - 1))) >>
(sizeof(Element) * 8);
- Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
+ Element maxNeg = std::numeric_limits<Element>::min();
Element halfNeg = maxNeg / 2;
if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
(srcElem1 == halfNeg && srcElem2 == maxNeg) ||
@@ -2634,7 +2638,7 @@
if (destElem < 0) {
destElem = mask(sizeof(Element) * 8 - 1);
} else {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
}
fpscr.qc = 1;
}
@@ -2973,7 +2977,7 @@
FPSCR fpscr = (FPSCR) FpscrQc;
if (imm >= sizeof(Element) * 8) {
if (srcElem1 != 0) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
if (srcElem1 > 0)
destElem = ~destElem;
fpscr.qc = 1;
@@ -2986,7 +2990,7 @@
sizeof(Element) * 8 - 1,
sizeof(Element) * 8 - 1 - imm);
if (topBits != 0 && topBits != mask(imm + 1)) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
if (srcElem1 > 0)
destElem = ~destElem;
fpscr.qc = 1;
@@ -3489,7 +3493,7 @@
vqabsCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
- if (srcElem1 == (Element)((Element)1 << (sizeof(Element) * 8 -
1))) {
+ if (srcElem1 == (Element)(std::numeric_limits<Element>::min())) {
fpscr.qc = 1;
destElem = ~srcElem1;
} else if (srcElem1 < 0) {
@@ -3504,7 +3508,7 @@
vqnegCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
- if (srcElem1 == (Element)((Element)1 << (sizeof(Element) * 8 -
1))) {
+ if (srcElem1 == (Element)(std::numeric_limits<Element>::min())) {
fpscr.qc = 1;
destElem = ~srcElem1;
} else {
diff --git a/src/arch/arm/isa/insts/neon64.isa
b/src/arch/arm/isa/insts/neon64.isa
index 697ea80..7c9040b 100644
--- a/src/arch/arm/isa/insts/neon64.isa
+++ b/src/arch/arm/isa/insts/neon64.isa
@@ -2006,7 +2006,7 @@
# SQABS
sqabsCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
- if (srcElem1 == (Element)((Element)1 << (sizeof(Element) * 8 -
1))) {
+ if (srcElem1 == (Element)(std::numeric_limits<Element>::min())) {
fpscr.qc = 1;
destElem = ~srcElem1;
} else if (srcElem1 < 0) {
@@ -2030,7 +2030,7 @@
bool negSrc1 = (srcElem1 < 0);
bool negSrc2 = (srcElem2 < 0);
if ((negDest != negSrc1) && (negSrc1 == negSrc2)) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
if (negDest)
destElem -= 1;
fpscr.qc = 1;
@@ -2047,7 +2047,7 @@
qdmlalCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
BigElement midElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
- Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
+ Element maxNeg = std::numeric_limits<Element>::min();
Element halfNeg = maxNeg / 2;
if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
(srcElem1 == halfNeg && srcElem2 == maxNeg) ||
@@ -2086,7 +2086,7 @@
qdmlslCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
BigElement midElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
- Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
+ Element maxNeg = std::numeric_limits<Element>::min();
Element halfNeg = maxNeg / 2;
if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
(srcElem1 == halfNeg && srcElem2 == maxNeg) ||
@@ -2178,7 +2178,7 @@
# SQNEG
sqnegCode = '''
FPSCR fpscr = (FPSCR) FpscrQc;
- if (srcElem1 == (Element)((Element)1 << (sizeof(Element) * 8 -
1))) {
+ if (srcElem1 == (Element)(std::numeric_limits<Element>::min())) {
fpscr.qc = 1;
destElem = ~srcElem1;
} else {
@@ -2198,7 +2198,7 @@
destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2 +
((int64_t)1 << (sizeof(Element) * 8 - 1))) >>
(sizeof(Element) * 8);
- Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
+ Element maxNeg = std::numeric_limits<Element>::min();
Element halfNeg = maxNeg / 2;
if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
(srcElem1 == halfNeg && srcElem2 == maxNeg) ||
@@ -2206,7 +2206,7 @@
if (destElem < 0) {
destElem = mask(sizeof(Element) * 8 - 1);
} else {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
}
fpscr.qc = 1;
}
@@ -2368,7 +2368,7 @@
FPSCR fpscr = (FPSCR) FpscrQc;
if (imm >= sizeof(Element) * 8) {
if (srcElem1 != 0) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
if (srcElem1 > 0)
destElem = ~destElem;
fpscr.qc = 1;
@@ -2381,7 +2381,7 @@
sizeof(Element) * 8 - 1,
sizeof(Element) * 8 - 1 - imm);
if (topBits != 0 && topBits != mask(imm + 1)) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
if (srcElem1 > 0)
destElem = ~destElem;
fpscr.qc = 1;
@@ -2557,7 +2557,7 @@
bool negSrc1 = (srcElem1 < 0);
bool posSrc2 = (srcElem2 >= 0);
if ((negDest != negSrc1) && (negSrc1 == posSrc2)) {
- destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+ destElem = std::numeric_limits<Element>::min();
if (negDest)
destElem -= 1;
fpscr.qc = 1;
--
To view, visit https://gem5-review.googlesource.com/3481
To unsubscribe, visit https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie2331b410c7f76d4bd87da5afe9edf20c8ac91b3
Gerrit-Change-Number: 3481
Gerrit-PatchSet: 1
Gerrit-Owner: Andreas Sandberg <[email protected]>
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev