1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-05-02 22:43:33 +00:00

some cleanups in the arithmetic operations code (#427)

* arithmetic opcode implementations should return LispPTR rather than int

* all callers of ERROR_EXIT() have return type LispPTR, therefore ERROR_EXIT should too

* N_[I]GETNUMBER, [N_]ARITH_SWITCH need (int) casts for some large constants that would otherwise be unsigned

* Expand use of macro N_ARITH_BODY_1_UNSIGNED and correct types

* Remove unused macros N_ARITH_BODY_1 and N_ARITH_BODY_1_UNSIGNED

* Cast to correct type for storing to TopOfStack, and return type of TIMER_EXIT()
This commit is contained in:
Nick Briggs
2022-07-20 10:28:21 -07:00
committed by GitHub
parent 77957d421a
commit 9a10f63fe6
5 changed files with 65 additions and 55 deletions

View File

@@ -33,8 +33,8 @@
do { \
(dest) = (sour); /* access memory once */ \
switch (SEGMASK & (dest)) { \
case S_POSITIVE: (dest) = 0xFFFF & (dest); break; \
case S_NEGATIVE: (dest) = 0xFFFF0000 | (dest); break; \
case S_POSITIVE: (dest) &= 0xFFFF; break; \
case S_NEGATIVE: (dest) |= (int)0xFFFF0000; break; \
default: \
/* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \
if (GetTypeNumber(dest) != TYPE_FIXP) goto label; \
@@ -46,8 +46,8 @@
do { \
(dest) = (sour); /* access memory once */ \
switch (SEGMASK & (dest)) { \
case S_POSITIVE: (dest) = 0xFFFF & (dest); break; \
case S_NEGATIVE: (dest) = 0xFFFF0000 | (dest); break; \
case S_POSITIVE: (dest) &= 0xFFFF; break; \
case S_NEGATIVE: (dest) |= (int)0xFFFF0000; break; \
default: \
switch (GetTypeNumber(dest)) { \
case TYPE_FIXP: (dest) = FIXP_VALUE(dest); break; \
@@ -66,9 +66,9 @@
#define ARITH_SWITCH(arg, result) \
do { \
switch ((int)(arg) & 0xFFFF0000) { \
switch ((arg) & (int)0xFFFF0000) { \
case 0: (result) = (S_POSITIVE | (int)(arg)); break; \
case 0xFFFF0000: (result) = (S_NEGATIVE | (0xFFFF & (int)(arg))); break; \
case (int)0xFFFF0000: (result) = (S_NEGATIVE | (0xFFFF & (arg))); break; \
default: { \
register LispPTR *wordp; \
/* arg is FIXP, call createcell */ \
@@ -106,9 +106,9 @@
#define N_ARITH_SWITCH(arg) \
do { \
switch ((arg) & 0xFFFF0000) { \
case 0: return (S_POSITIVE | (arg)); \
case 0xFFFF0000: return (S_NEGATIVE | (0xFFFF & (arg))); \
switch ((arg) & (int)0xFFFF0000) { \
case 0: return (LispPTR) (S_POSITIVE | (arg)); \
case (int)0xFFFF0000: return (LispPTR)(S_NEGATIVE | (0xFFFF & (arg))); \
default: { \
register LispPTR *fixpp; \
/* arg is FIXP, call createcell */ \
@@ -134,32 +134,4 @@
ERROR_EXIT(tos); \
} while (0)
#define N_ARITH_BODY_1(a, n, op) \
do { \
register int arg1; \
\
N_GETNUMBER(a, arg1, do_ufn); \
\
arg1 = arg1 op n; \
\
N_ARITH_SWITCH(arg1); \
\
do_ufn: \
ERROR_EXIT(a); \
} while (0)
#define N_ARITH_BODY_1_UNSIGNED(a, n, op) \
do { \
register unsigned int arg1; \
\
N_GETNUMBER(a, arg1, do_ufn); \
\
arg1 = arg1 op n; \
\
N_ARITH_SWITCH(arg1); \
\
do_ufn: \
ERROR_EXIT(a); \
} while (0)
#endif /* ARITH_H */