ref: 6f3899bca697d26c7986c8c7f3b49baa4b5aff89
parent: d5715fb848737d39f465381c60ddc2a81b8b34c5
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Apr 1 21:27:44 EDT 2025
cvalues: mk_*: try to fit an unboxed version regardless of the underlying type size References: https://todo.sr.ht/~ft/sl/46
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -206,23 +206,19 @@
{ \
ctype n; \
USED(type); \
- if(isfixnum(a)) \
+ if(isfixnum(a)){ \
n = (ctype)numval(a); \
- else if(isunboxednum(a)){ \
- uintptr v; \
- void *p = &v; \
- if(isunboxedunum(a)) \
- v = unboxednumuval(a); \
- else \
- v = unboxednumsval(a); \
- n = (ctype)conv_to_##cnvt(p, unboxednumtype(a)); \
+ }else if(isunboxedunum(a)){ \
+ uintptr v = unboxednumuval(a); \
+ n = (ctype)conv_to_##cnvt(&v, unboxednumtype(a)); \
+ }else if(isunboxedsnum(a)){ \
+ intptr v = unboxednumsval(a); \
+ n = (ctype)conv_to_##cnvt(&v, unboxednumtype(a)); \
}else if(iscprim(a)){ \
sl_cprim *cp = ptr(a); \
- void *p = cp_data(cp); \
- n = (ctype)conv_to_##cnvt(p, cp_numtype(cp)); \
+ n = (ctype)conv_to_##cnvt(cp_data(cp), cp_numtype(cp)); \
}else if(ismp(a)){ \
- void *p = cv_data(ptr(a)); \
- n = (ctype)conv_to_##cnvt(p, T_MP); \
+ n = (ctype)conv_to_##cnvt(cv_data(ptr(a)), T_MP); \
}else \
type_error("num", a); \
*((ctype*)dest) = n; \
@@ -261,14 +257,12 @@
args = sl.sp-1; \
} \
sl_v v; \
- if(tag < T_UNBOXED_NUM && sizeof(ctype) < sizeof(sl_v) && sl_##typenam##type != sl_runetype){ \
+ if(tag < T_UNBOXED_NUM && \
+ sl_##typenam##type != sl_runetype && \
+ sizeof(ctype) < sizeof(sl_v)){ \
ctype u; \
cvalue_##ctype##_init(sl_##typenam##type, args[0], &u); \
- if(tag & 1) \
- v = (uintptr)u; \
- else \
- v = (intptr)u; \
- v = v<<8 | tag<<4 | TAG_UNBOXED; \
+ v = (sl_v)u<<8 | tag<<4 | TAG_UNBOXED; \
}else{ \
v = cprim(sl_##typenam##type, sizeof(ctype)); \
cvalue_##ctype##_init(sl_##typenam##type, args[0], cp_data(ptr(v))); \
@@ -277,7 +271,8 @@
}
#define num_ctor_ctor(typenam, ctype, tag) \
- sl_v mk_##typenam(ctype n) \
+ sl_v \
+ mk_##typenam(ctype n) \
{ \
sl_v v = cprim(sl_##typenam##type, sizeof(n)); \
*(ctype*)cp_data(ptr(v)) = n; \
@@ -284,11 +279,16 @@
return v; \
}
+#define UNBOXED_NUM_BITS (FIXNUM_BITS+TAG_BITS-8)
+
#define num_ctor_ctor_unboxed(typenam, ctype, tag) \
- sl_v mk_##typenam(ctype n) \
+ sl_v \
+ mk_##typenam(ctype n) \
{ \
sl_v v; \
- if(tag < T_UNBOXED_NUM && sizeof(n) < sizeof(sl_v) && sl_##typenam##type != sl_runetype){ \
+ if(tag < T_UNBOXED_NUM && \
+ sl_##typenam##type != sl_runetype && \
+ (sizeof(n) < sizeof(sl_v) || fits_bits(n, UNBOXED_NUM_BITS))){ \
v = n<<8 | tag<<4 | TAG_UNBOXED; \
}else{ \
v = cprim(sl_##typenam##type, sizeof(n)); \