From 86a6253a2fb2d016a63e57d6a5e5461df87668e5 Mon Sep 17 00:00:00 2001 From: bd Date: Tue, 22 Apr 2025 02:16:10 -0400 Subject: Properly set condition codes for all operations sub SHIFTs --- inc/ex.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'inc/ex.h') diff --git a/inc/ex.h b/inc/ex.h index 1c06ac2..f7428da 100644 --- a/inc/ex.h +++ b/inc/ex.h @@ -23,6 +23,31 @@ #include #include +#define ADDITION_OF_GUARD(a, b) \ + (b >= 0) && (a > MAX_INT - b) + +#define ADDITION_UF_GUARD(a, b) \ + (b < 0) && (a < (-(MAX_INT)-1) - b) + +#define SUBTRACTION_OF_GUARD(a, b) \ + (b < 0) && (a > MAX_INT + b) + +#define SUBTRACTION_UF_GUARD(a, b) \ + (b >= 0) && (a < (-(MAX_INT)-1) + b) + +#define MULTIPLICATION_OF_GUARD(a, b) \ + (b != 0) && \ + (((b > 0) && (a > 0) && (a > MAX_INT / b)) || \ + ((b < 0) && (a < 0) && (a < MAX_INT / b))) + +#define MULTIPLICATION_UF_GUARD(a, b) \ + (b != 0) && \ + (((b > 0) && (a < 0) && (a < (-(MAX_INT)-1) / b)) || \ + ((b < 0) && (a > 0) && (a > (-(MAX_INT)-1) / b))) + +#define DIVISION_OF_GUARD(a, b) \ + ((a == -(MAX_INT) - 1) && (b == -1)) || (b == 0) + class HaltException : public std::exception { const char *what() const noexcept override { -- cgit v1.2.3