diff --git a/src/core/fillarr.c b/src/core/fillarr.c index 923304c1..23e2aa0f 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -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