From f27ba6d5690c0e8a994f0560712e143de660fa7d Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 30 Jun 2022 16:24:37 +0300 Subject: [PATCH] even more microoptimization --- src/builtins/squeeze.c | 42 ++++++++++++++++++++++++++---------------- src/h.h | 7 +++++-- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/builtins/squeeze.c b/src/builtins/squeeze.c index b0a210c4..c3fd4c16 100644 --- a/src/builtins/squeeze.c +++ b/src/builtins/squeeze.c @@ -12,20 +12,25 @@ NOINLINE B num_squeezeF(B x, usz ia) { u32 or = 0; SGetU(x) + Arr* a; for (usz i = 0; i < ia; i++) { B cr = GetU(x,i); if (RARE(!q_i32(cr))) { - while (i>31); } + a = or==0? (Arr*)cpyBitArr(x) + : or<=(u32)I8_MAX? (Arr*)cpyI8Arr (x) + : or<=(u32)I16_MAX? (Arr*)cpyI16Arr(x) + : (Arr*)cpyI32Arr(x); - if (or==0) return taga(cpyBitArr(x)); - else if (or<=(u32)I8_MAX ) return taga(cpyI8Arr (x)); - else if (or<=(u32)I16_MAX) return taga(cpyI16Arr(x)); - else return taga(cpyI32Arr(x)); + retn: + FLV_SET(a, fl_squoze); + return taga(a); } B num_squeeze(B x) { usz ia = a(x)->ia; @@ -86,15 +91,20 @@ B num_squeeze(B x) { mostI8: if(or>0 ) goto r_i8; mostBit: goto r_bit; - B res; - r_f: res = num_squeezeF(x,ia); goto retn; - r_x: res = x; goto retn; - r_f64: res = taga(cpyF64Arr(x)); goto retn; - r_i32: res = taga(cpyI32Arr(x)); goto retn; - r_i16: res = taga(cpyI16Arr(x)); goto retn; - r_i8: res = taga(cpyI8Arr (x)); goto retn; - r_bit: res = taga(cpyBitArr(x)); goto retn; - retn: return FL_SET(res, fl_squoze); + B rb; Arr* ra; + r_f: return num_squeezeF(x, ia); // rb = num_squeezeF(x,ia); goto retn; + r_x: ra = a(x); rb = x; goto retn; + r_f64: ra = (Arr*)cpyF64Arr(x); goto tag; + r_i32: ra = (Arr*)cpyI32Arr(x); goto tag; + r_i16: ra = (Arr*)cpyI16Arr(x); goto tag; + r_i8: ra = (Arr*)cpyI8Arr (x); goto tag; + r_bit: ra = (Arr*)cpyBitArr(x); goto tag; + + tag: + rb = taga(ra); + retn: + FLV_SET(ra, fl_squoze); + return rb; } B chr_squeeze(B x) { usz ia = a(x)->ia; @@ -151,7 +161,7 @@ B chr_squeeze(B x) { } if (or<=U8_MAX ) r_c8: return FL_SET(toC8Any(x), fl_squoze); else if (or<=U16_MAX) r_c16: return FL_SET(toC16Any(x), fl_squoze); - else goto r_c32; r_c32: return FL_SET(toC32Any(x), fl_squoze); + else { goto r_c32; } r_c32: return FL_SET(toC32Any(x), fl_squoze); /*when known typed:*/ r_x: return FL_SET(x, fl_squoze); } diff --git a/src/h.h b/src/h.h index ed934d45..c48186e9 100644 --- a/src/h.h +++ b/src/h.h @@ -534,9 +534,12 @@ enum Flags { fl_asc=2, // sorted ascending (non-descending) fl_dsc=4, // sorted descending (non-ascending) }; -#define FL_SET(X,F) ({ B x_ = (X); v(x_)->flags|= (F); x_; }) -#define FL_KEEP(X,F) ({ B x_ = (X); v(x_)->flags&= (F); x_; }) +#define FL_SET(X,F) ({ B x_ = (X); v(x_)->flags|= (F); x_; }) +#define FLV_SET(X,F) ({ AUTO x_ = (X); x_->flags|= (F); x_; }) +#define FL_KEEP(X,F) ({ B x_ = (X); v(x_)->flags&= (F); x_; }) +#define FLV_KEEP(X,F) ({ AUTO x_ = (X); x_->flags&= (F); x_; }) #define FL_HAS(X,F) ((v(X)->flags&(F)) != 0) +#define FLV_HAS(X,F) (((X)->flags&(F)) != 0) // refcount stuff static bool reusable(B x) { return v(x)->refc==1; }