unify implementations of m_vec1 and m_unit

This commit is contained in:
dzaima 2023-04-29 15:51:13 +03:00
parent 3b580cbd0c
commit a0d384060a

View File

@ -170,49 +170,40 @@ NOINLINE B m_funit(B x) {
r->a[0] = x;
return taga(r);
}
NOINLINE B m_fvec1(B x) {
Arr* ra = arr_shVec(m_fillarrp(1));
fillarr_ptr(ra)[0] = x;
fillarr_setFill(ra, m_f64(0));
NOGC_E;
fillarr_setFill(ra, asFill(inc(x)));
return taga(ra);
}
NOINLINE B m_unit(B x) {
FORCE_INLINE B m_oneItemArr(B x, ur rr) {
assert(rr<=1);
u64 data; assert(sizeof(f64)<=8);
u8 t; u64 sz;
if (isNum(x)) {
if (isF64(x)) {
i32 xi = (i32)x.f;
if (RARE(xi!=x.f)) { f64 v=x.f; memcpy(&data, &v, sz=sizeof(v)); t=t_f64arr; }
else if (q_ibit(xi)) { u64 v=bitx(x); memcpy(&data, &v, sz=sizeof(v)); t=t_bitarr; }
else if (xi==(i8 )xi) { i8 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_i8arr; }
else if (xi==(i16)xi) { i16 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_i16arr; }
else { i32 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_i32arr; }
if (RARE(xi!=x.f)) { f64 v=x.f; memcpy(&data, &v, sz=sizeof(v)); t=t_f64arr; }
else if (q_ibit(xi)) { u64 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_bitarr; }
else if (xi==(i8 )xi) { i8 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_i8arr; }
else if (xi==(i16)xi) { i16 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_i16arr; }
else { i32 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_i32arr; }
} else if (isC32(x)) {
u32 xi = o2cG(x);
if (xi==(u8 )xi) { u8 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_c8arr; }
else if (xi==(u16)xi) { u16 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_c16arr; }
else { u32 v=xi; memcpy(&data, &v, sz=sizeof(v)); t=t_c32arr; }
} else return m_funit(x);
} else {
return rr==0? m_funit(x) : m_fvec1(x);
}
TyArr* r = m_arr(offsetof(TyArr,a) + sizeof(u64), t, 1);
*((u64*)r->a) = data;
FINISH_OVERALLOC(r, offsetof(TyArr,a)+sz, offsetof(TyArr,a)+sizeof(u64));
arr_shAtm((Arr*)r);
arr_rnk01((Arr*)r, rr);
return taga(r);
}
NOINLINE B m_vec1(B a) {
if (isF64(a)) {
i32 i = (i32)a.f;
if (RARE(a.f != i)) { f64* rp; B r = m_f64arrv(&rp, 1); rp[0] = a.f; return r; }
else if (q_ibit(i)) { u64* rp; B r = m_bitarrv(&rp, 1); rp[0] = i; return r; }
else if (i == (i8 )i) { i8* rp; B r = m_i8arrv (&rp, 1); rp[0] = i; return r; }
else if (i == (i16)i) { i16* rp; B r = m_i16arrv(&rp, 1); rp[0] = i; return r; }
else { i32* rp; B r = m_i32arrv(&rp, 1); rp[0] = i; return r; }
}
if (isC32(a)) {
u32 c = o2cG(a);
if (LIKELY(c<U8_MAX )) { u8* rp; B r = m_c8arrv (&rp, 1); rp[0] = c; return r; }
else if (LIKELY(c<U16_MAX)) { u16* rp; B r = m_c16arrv(&rp, 1); rp[0] = c; return r; }
else { u32* rp; B r = m_c32arrv(&rp, 1); rp[0] = c; return r; }
}
Arr* ra = arr_shVec(m_fillarrp(1));
fillarr_ptr(ra)[0] = a;
fillarr_setFill(ra, m_f64(0));
NOGC_E;
fillarr_setFill(ra, asFill(inc(a)));
return taga(ra);
}
NOINLINE B m_unit(B x) { return m_oneItemArr(x, 0); }
NOINLINE B m_vec1(B x) { return m_oneItemArr(x, 1); }