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
112#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN)112#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN)
113#error unknown endian113#error unknown endian
114#endif114#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
1033 RETURN_NUM_AS(vtomp(Saccum, nil), bignum);1033 RETURN_NUM_AS(vtomp(Saccum, nil), bignum);
1034}1034}
1035 1035
1036#include "overflow.h"
1037#define ACCUM_DEFAULT 01036#define ACCUM_DEFAULT 0
1038#define ARITH_OP(a, b) ((a)+(b))1037#define ARITH_OP(a, b) ((a)+(b))
1039#define MP_OP mpadd1038#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
20#define FIXNUM_MAX (sl_fx)(+((sl_v)1<<(FIXNUM_BITS-1))-1)20#define FIXNUM_MAX (sl_fx)(+((sl_v)1<<(FIXNUM_BITS-1))-1)
21#define FIXNUM_MIN (sl_fx)(-((sl_v)1<<(FIXNUM_BITS-1))-0)21#define FIXNUM_MIN (sl_fx)(-((sl_v)1<<(FIXNUM_BITS-1))-0)
22 22
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
23#define is_nt_sint(nt) ((1<<(nt)) & (1<<T_S8 | 1<<T_S16 | 1<<T_S32 | 1<<T_S64))32#define is_nt_sint(nt) ((1<<(nt)) & (1<<T_S8 | 1<<T_S16 | 1<<T_S32 | 1<<T_S64))
24#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))33#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))
25 34
src/vm_jmptbl.c+0−10
@@ -2,16 +2,6 @@ · 1 unmodified line
2#include "equal.h"2#include "equal.h"
3#include "cvalues.h"3#include "cvalues.h"
4#include "sl_io.h"4#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)
15 5
16#define ENTER do{ \6#define ENTER do{ \
17 sl.stack[ipd] = (uintptr)ip; \7 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