1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-13 15:18:14 +00:00

Types work out better and better code if not trying to over-optimize memory accesses in arith.h

This commit is contained in:
Nick Briggs 2022-08-13 15:35:18 -07:00
parent 543f7985a2
commit 9e2b3eb882

View File

@ -38,29 +38,27 @@
#define N_GETNUMBER(sour, dest, label) \ #define N_GETNUMBER(sour, dest, label) \
do { \ do { \
(dest) = (sour); /* access memory once */ \ switch (SEGMASK & (sour)) { \
switch (SEGMASK & (dest)) { \ case S_POSITIVE: (dest) = (int)((sour) & 0xFFFF); break; \
case S_POSITIVE: (dest) &= 0xFFFF; break; \ case S_NEGATIVE: (dest) = (int)((sour) | 0xFFFF0000); break; \
case S_NEGATIVE: (dest) |= (int)0xFFFF0000; break; \
default: \ default: \
/* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \ /* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \
if (GetTypeNumber(dest) != TYPE_FIXP) goto label; \ if (GetTypeNumber(sour) != TYPE_FIXP) goto label; \
(dest) = FIXP_VALUE(dest); \ (dest) = FIXP_VALUE(sour); \
} \ } \
} while (0) } while (0)
#define N_IGETNUMBER(sour, dest, label) \ #define N_IGETNUMBER(sour, dest, label) \
do { \ do { \
(dest) = (sour); /* access memory once */ \ switch (SEGMASK & (sour)) { \
switch (SEGMASK & (dest)) { \ case S_POSITIVE: (dest) = (int)((sour) & 0xFFFF); break; \
case S_POSITIVE: (dest) &= 0xFFFF; break; \ case S_NEGATIVE: (dest) = (int)((sour) | 0xFFFF0000); break; \
case S_NEGATIVE: (dest) |= (int)0xFFFF0000; break; \
default: \ default: \
switch (GetTypeNumber(dest)) { \ switch (GetTypeNumber(sour)) { \
case TYPE_FIXP: (dest) = FIXP_VALUE(dest); break; \ case TYPE_FIXP: (dest) = FIXP_VALUE(sour); break; \
case TYPE_FLOATP: { \ case TYPE_FLOATP: { \
register float temp; \ register float temp; \
temp = FLOATP_VALUE(dest); \ temp = FLOATP_VALUE(sour); \
/* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \ /* NOLINTNEXTLINE(bugprone-macro-parentheses) */ \
if ((temp > ((float)0x7fffffff)) || (temp < ((float)0x80000000))) goto label; \ if ((temp > ((float)0x7fffffff)) || (temp < ((float)0x80000000))) goto label; \
(dest) = (int)temp; \ (dest) = (int)temp; \