aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
Diffstat (limited to 'riscv')
-rw-r--r--riscv/decode.h24
1 files changed, 10 insertions, 14 deletions
diff --git a/riscv/decode.h b/riscv/decode.h
index 0f12262..72e2dc8 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -476,31 +476,27 @@ static inline bool is_overlaped(const int astart, const int asize,
#define INT_ROUNDING(result, xrm, gb) \
- if (gb > 0) { \
- switch(xrm) {\
+ do { \
+ const uint64_t lsb = 1UL << (gb); \
+ const uint64_t lsb_half = lsb >> 1; \
+ switch (xrm) {\
case VRM::RNU:\
- result += ((uint64_t)1 << ((gb) - 1));\
+ result += lsb_half; \
break;\
case VRM::RNE:\
- if ((result & ((uint64_t)0x3 << ((gb) - 1))) == 0x1){\
- result -= ((uint64_t)1 << ((gb) - 1));\
- }else if ((result & ((uint64_t)0x3 << ((gb) - 1))) == 0x3){\
- result += ((uint64_t)1 << ((gb) - 1));\
- }\
+ if ((result & lsb_half) && ((result & (lsb_half - 1)) || (result & lsb))) \
+ result += lsb; \
break;\
case VRM::RDN:\
- result = (result >> ((gb) - 1)) << ((gb) - 1);\
break;\
case VRM::ROD:\
- result |= ((uint64_t)1ul << (gb)); \
+ if (result & (lsb - 1)) \
+ result |= lsb; \
break;\
case VRM::INVALID_RM:\
assert(true);\
} \
- } else if (gb == 0 && xrm == VRM::ROD) { \
- result |= 1ul; \
- }
-
+ } while (0)
//
// vector: integer and masking operand access helper