History

move overflow-aware macros elsewhere

Sigrid Solveig Haflínudóttir committed 3 months ago

Commit 2a331a61 parent 225ecdf5 files · +37 −40Browse files

Unified · Split

5 files
  1. src/cc.h +28 −0
  2. src/cvalues.c +0 −1
  3. src/overflow.h +0 −29
  4. src/slpriv.h +9 −0
  5. src/vm_jmptbl.c +0 −10
src/cc.h+28−0
@@ -112,3 +112,31 @@ typedef off_t soffset; · 111 unmodified lines
112112 #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN)
113113 #error unknown endian
114114 #endif
115+
116+#if !defined(__TINYC__) && !defined(__plan9__)
117+#define sadd_overflow __builtin_add_overflow
118+#define sadd_overflow_64 __builtin_add_overflow
119+#define smul_overflow_64 __builtin_mul_overflow
120+#else
121+/* FIXME(sigrid): s*_overflow_* can be more optimal */
122+#define sadd_overflow_64(a, b, c) ( \
123+ (b < 1) ? \
124+ ((INT64_MAX-(b) <= (a)) ? ((*(c)=(a)+(b)), 0) : 1) : \
125+ ((INT64_MAX-(b) >= (a)) ? ((*(c)=(a)+(b)), 0) : 1) \
126+)
127+#define smul_overflow_64(a, b, c) ( \
128+ ((a)>0 ? ((b)>0 ? (a)>INT64_MAX/(b) : (b)<INT64_MIN/(a)) \
129+ : ((b)>0 ? (a)<INT64_MIN/(b) : ((a)!=0 && (b)<INT64_MAX/(a)))) \
130+ ? 1 \
131+ : ((*(c)=(a)*(b)), 0) \
132+)
133+#if defined(BITS64)
134+#define sadd_overflow(a, b, c) sadd_overflow_64(a, b, c)
135+#else
136+#define sadd_overflow(a, b, c) ( \
137+ (b < 1) ? \
138+ ((INT32_MAX-(b) <= (a)) ? ((*(c)=(a)+(b)), 0) : 1) : \
139+ ((INT32_MAX-(b) >= (a)) ? ((*(c)=(a)+(b)), 0) : 1) \
140+)
141+#endif
142+#endif
src/cvalues.c+0−1
@@ -1033,7 +1033,6 @@ return_from_s64(s64int Saccum) · 1032 unmodified lines
10331033 RETURN_NUM_AS(vtomp(Saccum, nil), bignum);
10341034 }
10351035
1036−#include "overflow.h"
10371036 #define ACCUM_DEFAULT 0
10381037 #define ARITH_OP(a, b) ((a)+(b))
10391038 #define MP_OP mpadd
src/overflow.h+0−29
@@ -1,29 +0,0 @@
1−#pragma once
2−
3−#if !defined(__TINYC__) && !defined(__plan9__)
4−#define sadd_overflow __builtin_add_overflow
5−#define sadd_overflow_64 __builtin_add_overflow
6−#define smul_overflow_64 __builtin_mul_overflow
7−#else
8−/* FIXME(sigrid): s*_overflow_* can be more optimal */
9−#define sadd_overflow_64(a, b, c) ( \
10− (b < 1) ? \
11− ((INT64_MAX-(b) <= (a)) ? ((*(c)=(a)+(b)), 0) : 1) : \
12− ((INT64_MAX-(b) >= (a)) ? ((*(c)=(a)+(b)), 0) : 1) \
13−)
14−#define smul_overflow_64(a, b, c) ( \
15− ((a)>0 ? ((b)>0 ? (a)>INT64_MAX/(b) : (b)<INT64_MIN/(a)) \
16− : ((b)>0 ? (a)<INT64_MIN/(b) : ((a)!=0 && (b)<INT64_MAX/(a)))) \
17− ? 1 \
18− : ((*(c)=(a)*(b)), 0) \
19−)
20−#if defined(BITS64)
21−#define sadd_overflow(a, b, c) sadd_overflow_64(a, b, c)
22−#else
23−#define sadd_overflow(a, b, c) ( \
24− (b < 1) ? \
25− ((INT32_MAX-(b) <= (a)) ? ((*(c)=(a)+(b)), 0) : 1) : \
26− ((INT32_MAX-(b) >= (a)) ? ((*(c)=(a)+(b)), 0) : 1) \
27−)
28−#endif
29−#endif
src/slpriv.h+9−0
@@ -20,6 +20,15 @@ HTPROT(ptrhash) · 19 unmodified lines
2020 #define FIXNUM_MAX (sl_fx)(+((sl_v)1<<(FIXNUM_BITS-1))-1)
2121 #define FIXNUM_MIN (sl_fx)(-((sl_v)1<<(FIXNUM_BITS-1))-0)
2222
23+#define fixnum_neg(x) ( \
24+ i64 = -(s64int)(numval(x)), \
25+ sl_unlikely(i64 == INT64_MIN) \
26+ ? mk_bignum(uvtomp((u64int)INT64_MAX+1, nil)) \
27+ : (sl_likely(fits_fixnum(i64)) \
28+ ? fixnum(i64) \
29+ : mk_bignum(vtomp(i64, nil))) \
30+)
31+
2332 #define is_nt_sint(nt) ((1<<(nt)) & (1<<T_S8 | 1<<T_S16 | 1<<T_S32 | 1<<T_S64))
2433 #define is_nt_uint(nt) ((1<<(nt)) & (1<<T_U8 | 1<<T_U16 | 1<<T_U32 | 1<<T_U64 | 1<<T_P32 | 1<<T_P64))
2534
src/vm_jmptbl.c+0−10
@@ -2,16 +2,6 @@ · 1 unmodified line
22 #include "equal.h"
33 #include "cvalues.h"
44 #include "sl_io.h"
5−#include "overflow.h"
6−
7−#define fixnum_neg(x) ( \
8− i64 = -(s64int)(numval(x)), \
9− sl_unlikely(i64 == INT64_MIN) \
10− ? mk_bignum(uvtomp((u64int)INT64_MAX+1, nil)) \
11− : (sl_likely(fits_fixnum(i64)) \
12− ? fixnum(i64) \
13− : mk_bignum(vtomp(i64, nil))) \
14−)
155
166 #define ENTER do{ \
177 sl.stack[ipd] = (uintptr)ip; \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t