From ec053d5d171fab9fd00e74ff1caada7791847379 Mon Sep 17 00:00:00 2001 From: nietras Date: Tue, 11 Nov 2025 13:59:06 +0100 Subject: [PATCH 1/4] Sep 0.12.0 - Add net10.0 target and use cross-platform VectorXY.NarrowWithSaturation --- _posts/2025-11-12-sep-0.12.0.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 _posts/2025-11-12-sep-0.12.0.md diff --git a/_posts/2025-11-12-sep-0.12.0.md b/_posts/2025-11-12-sep-0.12.0.md new file mode 100644 index 0000000..909d98d --- /dev/null +++ b/_posts/2025-11-12-sep-0.12.0.md @@ -0,0 +1,17 @@ +--- +layout: post +title: Sep 0.12.0 - Add net10.0 target and use cross-platform VectorXY.NarrowWithSaturation +--- + +[Sep 0.12.0 was released November 12th, +2025](https://github.com/nietras/Sep/releases/tag/v0.12.0) with a minor update +to target `net10.0` and use the newly available `VectorXY.NarrowWithSaturation`. + +There are no other functional changes in this release and .NET 10 does not +improve upon Sep's already world class CSV performance. So... + +That's all! 😁 + +PS: There have been a few 0.11.x release with some minor feature additions. +Check out [releases](https://github.com/nietras/Sep/releases) on GitHub for +notes on this. Most of it is GitHub chore, though. \ No newline at end of file From fa5ed725adf8c5813fa2755dae43e5a74c80b15a Mon Sep 17 00:00:00 2001 From: nietras Date: Tue, 11 Nov 2025 14:01:04 +0100 Subject: [PATCH 2/4] link --- _posts/2025-11-12-sep-0.12.0.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_posts/2025-11-12-sep-0.12.0.md b/_posts/2025-11-12-sep-0.12.0.md index 909d98d..0784497 100644 --- a/_posts/2025-11-12-sep-0.12.0.md +++ b/_posts/2025-11-12-sep-0.12.0.md @@ -5,7 +5,8 @@ title: Sep 0.12.0 - Add net10.0 target and use cross-platform VectorXY.NarrowWit [Sep 0.12.0 was released November 12th, 2025](https://github.com/nietras/Sep/releases/tag/v0.12.0) with a minor update -to target `net10.0` and use the newly available `VectorXY.NarrowWithSaturation`. +to target `net10.0` and use the newly available +[VectorXY.NarrowWithSaturation](https://learn.microsoft.com/da-dk/dotnet/api/system.numerics.vector.narrowwithsaturation?view=net-10.0&viewFallbackFrom=net-9.0). There are no other functional changes in this release and .NET 10 does not improve upon Sep's already world class CSV performance. So... From 6f80312b0658759f093d17dff89b054f3f64a1d4 Mon Sep 17 00:00:00 2001 From: nietras Date: Tue, 11 Nov 2025 14:11:32 +0100 Subject: [PATCH 3/4] revise --- _posts/2025-11-12-sep-0.12.0.md | 7 ++++++- .../parsers-benchmarks-dotnet-10.png | Bin 0 -> 43130 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 images/2025-11-sep-0.12.0/parsers-benchmarks-dotnet-10.png diff --git a/_posts/2025-11-12-sep-0.12.0.md b/_posts/2025-11-12-sep-0.12.0.md index 0784497..067187a 100644 --- a/_posts/2025-11-12-sep-0.12.0.md +++ b/_posts/2025-11-12-sep-0.12.0.md @@ -9,7 +9,12 @@ to target `net10.0` and use the newly available [VectorXY.NarrowWithSaturation](https://learn.microsoft.com/da-dk/dotnet/api/system.numerics.vector.narrowwithsaturation?view=net-10.0&viewFallbackFrom=net-9.0). There are no other functional changes in this release and .NET 10 does not -improve upon Sep's already world class CSV performance. So... +improve upon Sep's already world class CSV performance. Cross-platform + `Vector256` parser is within performance of AVX-2 specific parser, as seen + below. So... + +![Parsers Benchmarks .NET 10]({{ site.baseurl +}}/images/2025-11-sep-0.12.0/parsers-benchmarks-dotnet-10.png) That's all! 😁 diff --git a/images/2025-11-sep-0.12.0/parsers-benchmarks-dotnet-10.png b/images/2025-11-sep-0.12.0/parsers-benchmarks-dotnet-10.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaf55899e4801c9eba348b55d35e2fec8e7ca53 GIT binary patch literal 43130 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 z zOMDb4kqob4g-^U~>2;-A61n{Tl8SCG3QV5pxL;*!oW?)Ir`UiHOCLGW9Ut?*?wXQ? zS0%4fzDnO1Xza3JcS#WdY98O!t}a>$qK-b(e5zXC?8o*$BdHq!&AZ>Z5(?d3{FN-^ zFG2tx%C{A+`iR*-I8g9wi!g%rR&>z``<6Ha z32alDQD8UnH8NOFH6`QB2CzYTgB<%`c<>XVLN>7Tq)GWwjH5P~)j{>Ummp0_CyAPu z1zx49UC`hP2S|TDCe6*>!&S>``iWbtTh$fK&$v-9TcQ=5jc_Qnp5<*t=bu_N(JY8B zd^S%>)vZYK^NaxA%QlVZnAZI)lOx6HFMZYQdLBG2q13ylo9sG#+X@CUE-M@~2&YAy zWA8V5wd~LM1bcI}v}Z?~gN@(u1TLsOzQtv9>5vW*UQh77b&Ck|=@>LQUJ74vW?Aj}%rs~Vi%aFErKNa0TGqt?6}{`EGI3(*WY z%FvH!=1HuA#8e46iUA=EdJ68v9Lc>GvgnFk(&|4Ch9vUpWNR=W&cDQBZ{#jPab`5I zcmKZQy%6YW7jTb=1-KXc0CLm~pLr2c1^w)%_wg%yat$&|zG}q>8-2)2sPh#2kG-+7 zBZhuwWh%gLq8SYmo?u5W;Hea<+pU$m2OO3aJu^VtTH2p-6~=#5FOjHAm|4F)9bQV) zi%L-$BDz1c{OT#}NS3!`l}{OYw#^bL>6mLMGEyLje8MM4m#e9LRrJOJ0*$P~P?f9n2P}cTH3tjG^Gc%((;(Ht5n7im!tE33NJkqY1 zBDmW{+I8hSr?^%o*=iro=W}S=@2pO0*PrDtz_J*7&4kg6clWd*p3n zViI3U1T5$ph18LC9k^)Mb+Tni0WeK#dHGkR`z;hBo)BD8Q$j2*oO^z{@~KR)mnEzt zaQ}E~HHlo;{kji?s=+Q`s#(%vIbBA(cJ-n%^KF+e-r{_hP`C4|IA}qkD`tim+4ZZ$ zH*DGh1@fie(G1&giYJ!Y2Lngsh%UEe`DekK>i*Gp?XpNv;pgr_j%oH3U*xMzMZsUS z?|aLFQnZizS3Xk5%@UZK3;Oe>EK2unbW8O6xfN*3gzeVybL7R)H_9W~1r(70at*|o zX`EnQz{mmxUgV_K)PAORptI>w4x;#)u2WFtp9_6a*!?t$03KN7cSsQ+aG#eGL>-Ga z7B&=bj(&WduZ66;#A+2;(xqC|e8A%k1Wd&FG;vuFJb zx{X|*@Xd<1;M{X>18K&e`M8WP0DP$W^eHJsbd4|T{+3c%e2~PQY1*CkJcco3BbmRB z?3mI_JKP#<4<$73j^`spP3zeiep(MMd1cZgq`LiNUB@QJk z6g*OJ5T4vc70r)wXr1*3L>CrTw&kmzeQ@GTVaoj8_*rPcu8vxAC1Ut?FmuXNk0?>k z+wb}Bd|{(lTIVI+o0XQ71&QY$`|kLq)lT)Xb>B%>eOOlft;T!Ot&SV|X)Hx-wsbuF z=Xa>j!Lykb%?KMwX|U$cZi#Q><0LjEs7`8(0|#*9fvY0f*~8;Du3$;6{%z0SIOpEHI06%%GLQbNzZ-%k&+v*z=a;hmal#0a*B}X{|L4 zT-4B-=P}~Ph*GL&$DbbVo8^5vxH0egq34nLuCJGXI78+_zvhy@Llm(FN7mRS z$JVH(&uJTZ`mKpR_u@+}G&tsj=@|P~3^hXuu}mtqNbK8iL>f8!iE z?OK@+c>88BkW3ip7hi>vH`0k31Z;kM+jHP_{h*0w_MVTl*7noC?Ak{Auia-Qh_(f1 zZ#<@r*56eg%k_FVecquUd3&L)lWyiJ|EnLFbyw}DR5d%UsmQvdDWP~vh|B44;pv}S z>NtOlmM9zwbOYY}N%Vm(abt61IR5HW={?I_bIGUn--Z8Z>N=u_$&sKeAX({!jA0ExgF6r-cmBo&Lmc< z!2-u{6vq)g6A|dDd&}8&@Q3j!2YVct6?W12)YNPazjtc6YKFXO6_pj{tP>zG+w6l8 z+&VUnk&aI=wS&q{ku)2q25$Noi#8RMn(bLDe&(TwM-V$Vw?=zOXW^o}lGMMXen?AM z_sQ8mUX(uoN1dvs$dRCG(N8zc!s2g#dCK2t zbI)L>Fn3;}Wwb<|zJ_ccIlEbd;2lUBM>?gRhI8-Cqp6I(VGG;OG@({$1XFvD=#hdu zNap|~NHsx1yqq30?}o2!a_f4HQ3!Jiaa3zF^>c0w{>W3O9YW9u618Cj%dcw< zMozsYE(ClXj~*VC1{5;I(&8h?vSube%C^qi(pzfrAnb}CQ5 zM|mbI57WOfa#E+!baVI!a#G8}W-arI)<<~uNx9GB2Z6O~AT-I6jdVQq*Ud?s86`Zh zo(sKE$F;k%vsxJ3wRZV<7)4dbmk|iFJ;mJ4jq9JV>kzOs#OP36wAAQDOD&seoQZ() z1$`zSN%f>pr%n(3L4P+TWwj)EsG>uakn5PbtNkm&AEH-T$#^mANY+f~2) zS9k9ei^8<^eaS385I$Tqu9z$u?S7;vP8CohoAtz&A%-5)LpUE=KC9p{;SrB;G9wVZ zj9_Prs#flr0D67xsr0;Z$>8*+l;c~ws9a!laNr#+eaHspG<+{lu)UV^x$jW;GKT1D zb~I#S_JE{sWFD&exhQ(5TQj-;OFGIM$N$F+%N(%AXe+9*ekt>=^cO+f&l5YPY@T=3 zTn|1otgRU9+h3&C755O^1+ZLw{qc>r01AwG)3~z=TBpuVB7jHW9~X&S3qM~8Jx$)g zfq#b4BWMpOfw5F+M20<@54(Z8hKYHU&bM_6%595;*hW&50hbuZ+Xpk`(H;_H=*vJn zrj>Am*+tR6b1!?qZb7j5jyIoiIkzG*NwuS8#KJ)vtxzuwimJ-6ZJ>YMXa4qDgOJ*| z`K~yy^8X9?4GIjYTD#lKAegrW(&pZejqfZnXxe{ua8-zuo$o{|BpxE%@(Z${arA!F_D0NnM@738KD`iz5 zokFtYv<$d%OZRD2TwG6GcMpz}`>1;tNfvhy=-`qE!f#p<6(oWk<5CnP7%ae-bFjeg zlTQMG)!rsxF{jQ>B8;03(omHG2XhphKG+A}m6cV3UY*j5?XU9LRm$f{Y&z5k8L zr^J0oll#;A=d}KPFW8v4TLxf6FSgN@@%YFO{tt%Y)dk`{n%1eizGlodg!66P(wtDN zd$jei$irV!&vSX?1Zdgfak~fACJ*AFB+uV_K4FfBj#<(ig_m|(^6yFal?;-8aV_nC z$~WYdTyk&i>Zr5q^3o?nw8h3!42*@rqgFr(=QXcRXy=IcEtowfZN0xq zF>J5Xq>4LEeHUu=y+*kB#>uqNDj`ZezPme6fFjnH>}`x5oqFHFFS!&0!`AF8w27(W z1i!NHG7OE=ov@+(H#)QBK6@jQ>T6EQBeu>p!Tk3NAtWI0p$FHZ6xJ{hpDDq{RS8_^ zc(F|^F{}+1shdnFQw5z3Sg{;u>=Tr~jfv}VWNUqOF$`$;rO*q6*Qry_zuh+8&gjB^ z9e;OQ^s9j*InAi2F(i*o@vZ9FIX%c+B!>X5Ia=c86CoLAbmfOdg7K9dq>yBh<;6R* zKgRoM)1#fpNiEBjD@eyoYy$C@292W~R+DYw^U6hscL$dS_qiR8Ysk^vk|$X%j{-1b zOJ0!qXyTzbC-Gq~+8bb)dhzq7FEFN2F8tu&47urvO3#z&R=R;OR8)DP&wx1S6=j}g zzvhv$-&lu4eo{QvHxFia= z?%krV%Qhn?H|OV;_*2KLM8UrHt5G|4Fw)54KV+ zEO}_Mg^u1ggA|YqM}I1OK7TJpPBXd=1a9mBHc~hjNR>uibglHsVCOXe#(7}MfWw-5 z9aa8BrQqj^aT~%X8DrLWjnB$(Y_#o1YL~^*5}={dM;UQ6q;iWr%?8&s>Akems#!>V z@3{^T3}4QGc4fS_PS_kaI{m6}M{0=&e8afrAbShL=nsk-M12&4n^pgQdmLpP`BUUk9XZvSE(xoFk2rm8xD4ThXSD` z(Aj2SLNvWvzC}ljigoD9j8c=2cam>3O(<2qIqaTb=oW!{)~&#u>vW#ICRH{b6HvVeqv1MAoSglWGnHO|#O^RqU~;=BGDEYyY1 zH516ZX%$OY;24~qoLV4uFlpc=Xh8e1IH{GIo(Tas9UceU5$G1-qp>q-G(@6bOzzCb z;DB4fplIos#5Z>3w2}2}i9&nZQ~cuP zc2qm`xVK{+x-+A4M-XqIXm@^nE_}E#Z-dC)7p~liCUi-Bu7ueHAf?w+6%Q_ZnryYP zq3;h>x3H0An>;Hd%+~6}ZQdVBD(Ssr*D7|b8UK6MbOctu2^<|igM+gd(Szu$Ww+w8 z$*Y=Y)$e_diY6(CwhCZ(B*krAb`T_}&&H`TZA6)lCa@0p6{1glC!8$ftVUeE8ck9` znDmWR;%owdChIr1xhK)^8?hDOC`!)3qeYRV;%6TmkEeuo6=mhNcfNixq2}_y0=m%h z7_ToBfX{GOJI<&4uRALdeF|wjBRMp=40&`4Gg~F>ImI-B5knI+ zkb(`;P3kqIglWp z6rtQO*=zu;1!98iROA@?!-5^XZ*}AI?&8J7L&s);F+`RoP& z(SS)%9sx{(Z(Bz*<_a(nDo_7Am96%U@9IYI$xFGNw!)m!hxtBEoT-2is20n)&c;48 z`W_-(BpzYkDW(9N3`#@Ib-#t{+w*_`o?^3hGP{X3QvDSU$LAc4Wzqw|#CR-AvF&qE z^%0)VPl}pd<1vDU{M?aXcQWR(_Ws7j)4(4D*Og^>wiu#+ka=*=@()nkd`YiCcCCug zph8pa{$RhZ1Fw|p9vtYy8_DRl6lol1fS#o%o?eS!Do58hu!v{ zX`THn7ep`IPxtA{Ec$2n9a}gUT1v)2*aaVS47{{{eoDAog`r9T7_+J5U0?Kg;tnkZ zz|mcC|I5*lqoygsF9tY zY^D?emltvTzr$}m_1J{Ed!2YZ<#Lskv!m7@n%_Jq^?h71|55ruW0F)M>E>n+OVHR3 zmJWtZnd8k&sf|tMHXj=Hz_b?bg^XUONwsR4cAu}U`Wm^vQ%k!8f{^YIVhfrz?L<^! zsu7ZP%%C0l?^O`VSFUNhKG4&v_vjx{QdvH6Ju7e+NiU;bCBd!D{i$Lh`DHBKdpZ%2 za9P|QEbgGiY7T!;<8*v&^28lfZvVC@i3lyRh55h-SA6~*xT9$IXmwHzrxDk zZ`Vt9YUT9-=~gu0d|ZJ(Ly{BZLPc0kmoL~!_5G;!tc5=eqyC;*j@{Rq{Mfl<(C@Jp z4oac1IfQ0DVl|$=ChViOmEbtq765GT{!hSWc#!3CwC}O@-0rorPx7M`mRWm^?blt5 zxDea1t7Z<{BSfdyUNLK&ViqdD&YrW%nx$7F@x;O;k2+dj17_@9Bo?ct*)RAh2;%am8SzTyeeYqagA=lEOj;IWE(_ug7kLsW5>^ zl9i&X6B!@yQIMPO>$2Z80iaZC)1cck0`U#bS|`z#(ryXbUd^iaGOwq8HCuBbY0sBY zJzjzWVCbjPczwNyR;@AVG&13vy?1e#cx_IiznMIJqt#l|h}~14dJ1IUMCpmn9dAK! z-0f#ph7yCTsI35I5RQ72npt}ibzY!cW4uB-fiP=i-u@N!2zC7=QMi?+`+{>D%cT}K2$A{tc;fPl z#%!^EkztzPDC#H?t4|jQPEFx=(O3j$!u1=$g#l_Tozo|*8XE(su@lybfEqg%;3f^) z`B0sioIIsBN%Hvl02{?i+m}tTuf*p8{j1ST_4MV8w%MIyr^(lz1YkmpBGcPo0lQ6? z#ea#hQ&LK6;k3);wR5$wqz2~uLJw{^!b6-tUuE-A4nK=vG8@=Wa}=fV!Yz~bs9N2M z$$g{&&IX9$u>w;k?Nls;%W1+wI0`!@lj?XZgo6Pdtcf3Jy3#t9uGU$=NMX7D{Eh_S zet;Vvh*}v3B|hSMt6I{}7MzT6N-!Uk@rAj%Ag|Up&Rfg0gZF2DPt@%fVwuE1LiW3* zt@b$QaaqVJBmM~zFZ`n>`Q1V?BUDL#-X>C?`V&=|vjqp_OcXGe^`G2GV+ z4EIl&a!?-wBpzb^L!(1KUCq?S%1p``STrua&fyWYp1+9XF6C?|urcv`gLV1vBkw+c z3UGvR234V__4aMjc=W+OX_s;p;>DW90JcpCJp67@J>#K)J8H>w;EQuzAP|A%=~nd69~mjhTzRfTapi!m?v<0Z1kZ668xi6vGI!r`%ZQ3q;QsrmhJaaUBE$s2zA0JA*XA4;zNQG zUQ5%E&Wjgpr5zFxG_|FHm)Y)BpR5hQA~}f4e^(Z;VFRZEhIX`VZjgj1dY)+ z_DnhxTA-AFa-?Wn&MpHC(X`n1a)1ddVjOMADxFK{wGN1`*M7L0r#L<^KI`=VPFv>X z`S|VpWcI*F9-D^&k>rnosJhW53u1xkbueD6f_sJ=5G8zZaTWrSXrmd##;802p&$x+N^CW2!P)fA$W_MO?n9 z$q{)e;u6=-UDL~|A*Lq=kZ|S~qqAQMI&O%Y9s1fGe@6;tp4Mynd&=O^--A*85}Gw_ zZ|gO_Ssx!A7PRRh)ioTZ0L#_$!W(rF`lGh~(*3Kp4#s}_7nY+0upH0UZYCo|{aDn# zI{drv(qwY!^!s&Rk5s>kY|&V14eBcbqN2l?OrTo^Wu3!ji|Mw(nh z+5@hD9^-ADZxUjMrbtKu`#0ihX1Oasg9dJ8_FQ4XKSKHKT98}I6{BG$Q8*mkNP^l` ziBZ8ctkydGs*hSsud8PNoyLg&yRs;Z^o&okBOtg+3W!k~PW(o0*q{D#0+!%jNaFlB zpt>&Rk7W^GGSVlSX?mAu9G5cs2mI}wroK^-_%~qt2f6*{jSqS&KckkrVmo!?*x*{I z#wEL6Oczt0u&+(gr;`(lh{R&%j~ZLRD`Ckt$i&axOo`Vc?aqpnG|T!|X)QGqLjdF1TE0AW=S_Nq`2Y09VF;)YzN5q7C?~E&!VoL=mHijpixRneqWW%mO9xqF#uY)nV z9OE?L+)7+Iwg_FC_|eidu_QQ~^se6Xr2Nv*onVT`N44SFkN-gVa(yIH5$`ATO({1vTEy2}~JAF~P^ZP}0lNF+X-mHGI}HSSXW*!YdB zcr1DO%7om%E&)(2NQIMh_0}Vm(}FX|(D3TqR{*qLXs3Z)Ai!s6Y61RgexaSZheM^V zJ9^TpnT+sIG`?(N&i_U`h}{1Kjb935h&J?63v9gBZ}EnOcx<5$dh!T_;FbRH)AbE^ zFMk)w)2u0+_wjIC!TY9*u7Mx@Kx(X*b8|@eKq3`FG7WF68_-O7Z5J2;LXA!+&BpJG z_dcPpkKl`*L3PqS&Mf}748&5Cl%k|JEwNgu%O#z6l^q{UZW)iA&DqHz;a-v}jn6g1 zNMTaOtpJH~AKBh__{gi`SL{hepxxW* zwQF*A8L;xT5n7S`M(90^6$PQegdZGm;xEm%l3~Ew5V--!$<3iS!_i+jHOYpMNa_W9 zevs0L57-hW&`PKCnXe)9KJ3AAneTft)G>_>ssT0jRJnB6`o+XMZFBxKem3$81D)gp ztbuNFBKiGzk@zFF2 zOcA?n^W_~5>8P6Ds7jMn0^Rw7T9x|Dv2zTg$%gB?%0cW7fT%*E9vyGEj?c{cwtd(H zpq__Cn&MbkU9v#SV;}toaTbid;$m{r<-4SE#AQLbB&gjN5RLJ}fq0vDUFrA%Zg1Ht zTcBeLOQsFpM<`-lNA7l6_z};A;jNel<8yCrO7lg%H(_~(Li}lUm78}{&C-nZU*_y5 zwBx$#S7P|S1>2EXH|dBv={B$iB&9;L(_*bW4dsH4&&=bX4X3{H>C^Lod-lx=HL%dHm#X2R@mC4HRu~?`jtv9D5z+ z$ld<3IQi?KfFxgzo^)u>Z|YU2JOef2O&tWF|8s5rwA_DOPMq-`W20PogB*2l>sZni zO@N!aWoR!Bp1<_!?)oF%i+Y5ovQ6$5{0~P4*xD{QGDiieFIwZj=7sF0h zl@MqY@+Gq3)@jc_Yj+HG?e5ef-ra^wB=>I1-z^;20e`s19x@r>i&AsNbmNuXc(PX( zlcT+jYYfZxyI{qLYi-Z+jl{Kt_U@)n#GI=J*X1hA7bq{+{s4F+^mj^VNkr+^KFN&- z2V?0;z^P|9tWq1WtVI#}vV-zXEYwSszaEq}QEXp5>!Gen?s!nR-Tp3M|3vMYc3ibT z;-T4Mu%oC+-NB^9tQY#1n=Q7fz}^yixi>PQYfoVv(T$t8PLr~bG{4mGjJXV*Hf?wQ zgA7x=X|(jkv`=k}wSwesahR#WJFSqhnwcRPwNPc>KXx^W=kHH~F5L}!8#49E-@C&^ zeNyMU8^_*ipny*c@3ZoV)Gmh@CoquiyI4B>FcFdpY)6XVD^wYiwFXpJn;M(%WJMj_TT>aZ!+u`>9YC-=z{{FZ}AuB3(Q-2)0)-sD1*FRD9Z!@bj113Q_)UA#U#T*9^8nxcf(>iD$AEBY%rkZtNGl>o z`HKnyjkoeNdQ=!Dmv=*lRo~DLAwzPUT_w4A!{KA^ z?r9D1`bbgdM(0$atP5>a7}S}fQZYrScBe4RA|!oj$nISEuFJ9XTAr(-4syBB1=_A3 zN+){5BAfY~An)#3NmTl*nvLJd?c?3sxcssV2nGQ_Z z$R}M2COxBEc<_$?-VE6G)Ft)cKZ2zJ-QB)}tw8?JeH-?hHzeN8tyLxXGmS3hva-&l ze&{&+bfjW&OT$mj?^Iz*b(NrR9virL2zi|PM3oB6Zy^NeFv=E(F1q-OS+yyTnNUfmy=8-I4LfWA7(0L|vF57~#V!@E_ktE7@ z?nKlB970D+*HxZ$m9%zSt-@08BCWi^VFR>!j{0~?{o10C2K4D9vUllbM+I7xxogYw zS)qG)o#1<>n_V~z5I)ee!yr;hTu9Hq5)2P3ka+uHn!eQVy-UECK5F`PM3hoB#0L~K zw#?5gFC=#%nt0jP(!f_X34%+Gl#ki2bP*%)%-I;J_o(IvS3mJz`aS_7#Eh`f`z%svvP*0NlO}sAH`g{ zQfR*c%wx^1<^F+-!Y`HnWI`c(v#Ukb|-QOloI0e3TLK!BWQC^e0b=dq>2f69P3KE5BNgK_}WKx zALoo4wwb%O5Zb;BY}Z+5NK-Y59&N%Q|kWi~$o8-u^*ocgZ5sCkfprW)PL z@QoGoWp5r->7vX=kLOW~TXU_1wM@TKWh{qztQ4MQ|FPK)fGYGcr_8w?51-io2`n5t zXzZyMTMS+8pxVwVZAhlI0=)l$0(L*>e;f+h^ss+mKYJiM^>PsaJlKhllDASCMyS#S zHwho*!UY=T^DLCD$4>m!K1q~npvuN%nOg^`>my_5$>Ls<%RCIcEY$)^l5=nVi78OO zkPR;mQH1#jBoFH_HU7|iTg$6DZB^UrONiP9jM>Mu68yI${(8mz3b;smC{y3d4qZeQ zoOa@@+J^r|6)=OpqY7bv$^`->zddO>8+i#$%q@+>^p@jDj_${$w9&kwo`PlxSU1|$ zD9FF*v0zR4*)ypuep~HU%{4GFn_)C&qbwCE}J41TT znDH-;(olu72aN>o0Dilmcx@u#mA=n9_}wIfoD1sj+miwdU%2#{kl)BPiUlr%@$M*h zJOQs@Xid=v*swwAk;n`@HdGab9oSV;urD7a^AD1{ao!sh*IV$7aT0M+(fF(bN1~t+ z9C(e&F-hM4#3`nJ6vZp`Xj8BOR=&xXw>$*j{M9j-vLn2rfyW$^}r_G1N*OxYX!vlQgbudQXaMv}Kp zxha6N_5U(u@32f63}DKF#7xNn=6ajz3B{bSj0=FDoMf1TOPT3#Z%3QYTTEmU0FBs_ z!FJ(I69x6;{fi@W1UNE*8b+HJRQ~s>-^CGE+wO=TkZwD4&9HDzHTQ_ZmrLa1|H*HB z@1`t?74ijOJ`ucOAoa9(eCxqOZgXPy5}$>a+xWnFO2Dq9WAGn$8n%`Q!EiS(u%$`C zC{|bmCWLrE2@!6T(O-TH%=#bvnAgaIytw7;CK8EYQoY`QNy^v^sF{AV#eq7|SLy2i zC6(aC!3FAk4AyH4J;f4aqZb4jCjAdVHcb?cd)0IRQm~DAX_VPR0N=0Z5E$P@rbXex zfoTeCS2*ytmd_cKfZExORXYK`%~-bY7NB<0yZuo+e_PWo)Xs=Tz0>AaDZs<;H_?99 z*e!M4C1rD{FoAmsZ^f(ZlATLRi2-Ea)A_m}ab@8P2V+OP!Re*dmvo~W!T-9TTgtS{ z9;YR+Gv-O1g{Tlnf!8~`g)5@dXJ@jXqpF=&=0ECT%q-=-*RPosiLz4BjhaSr0>};t z_Lc_BX+xJJE_U8AV8J<(>grwCy5i}F2eh7^Z49>c76+!&L)5By{&A+wMzo2%4_MPq zNZqXkp>#1%J|;0uAw5Jn_q4|*A4#wiOLGuaq3_s}L7pYOg+MfQ701sy9_9ELyMj824TtR|2bKLf66uFKtn0so4uhxG16A?D=N^tUoL5)v(91yB55wMM>L`f zA1K_cgGJ*sfDSEaOD7jImq8hvp5iyraA8cPTnzWk=PfA zC~A6l=I0OKyx%;Tv#BjtS@lKwU>p1M%+It3NCilASMdfr_Uc!tlhMpz#ZG0c*txW( zwxRCTfE7Dw{y&MGyjK4|#m>{$nI6VG4m1j9ywAi$t&I3?9IzME%NgeN0iTzW zr>o?RLIT)!rV8TY|dI)N21xJpETLvs1lYF-z+MZRf#8ZO@5x zgz72}mgE=F*$fV2IqpBhq-dRu85#*@^jSr0kBgp+8@hSj_Iw(+`EY)RTawZV=WBi? zxjWsPzOa(QWJq>+rVi9-B{4fnRu z=Yx|7e2%UhJK4g=2bJGBYpE^CbHkiA7qd4h0LVA6eDjXxBV)cB)18DL-iiK{KRhu! zC{k|EVWbV&jopJPc;uC7fA6KfV+ZzIqIi&7D54O5;Zysz#?AnuDGsBeoYpHbIaepRom$93v;9%Dyg4tl!Q6^XtIoUmV6SwZ^ugp1}}GDXJe4Byt;xpO>i z82DfnJ-b7`@ro;o2i-1;nPs1pnNRggA%lpf7>x*1B0QuAR5_41a2U(!4D;5ffG*X%xntbMfJ9s^jR834bn*F6u{CWrb5 z_u1DhW-H696A`tcCZ9fkN=Jxb+JuHqZUlP%lgtn|DorCAMFl7y3ZMqR-; zJlKJv2zm)Mbk9B|K6PxZ0=bZ+Vgq}K0E0^F#xJR|j;Ja-A^>r4S#KdmaIvYn# zcI=B^xhOtkPiaJOXdToMU3(&N_)i!?{%X*G4X+zL+1-5gqT_cX-GS}d#}{FQY;L=L;Us^jt$5N{bX@vEl}7$Cdv{J*0J@8qL$MC7Xp?#o{` zYnI`gOG)lX-PnCoKRpt)Ld>_z^xu;R$JU!>?eT3~xG&;Lstow%tK*%#ai z|3OksEv68^BaeyIsaa8xC3rTZUz|lex*M>V(3OkoZzb% zIeYN=#&;G4CY&4OrG%&+tfS5Ja|#KHxoQI@z`)kz(a`)V?foO1N7H^qqinO}pBPdAZ4Zgww?>`Twem3Xi_k@sE@F{=?J66jud&kN# zAtdcFdv1@pK}KiUI5U~Gcl^k6$(#;@Aw4b4orM*x|B9jhJBYAF(g;j%yRss}UnEs0 z*FY;_4p8MGW7-U;l(##9Z;k?|*cHOS62{LX+>o3Nf(s}A9xo@*Mz=rboZ|n!ru`j(8)UAM+}cNGKg3qFI{pV0Bbig7+vlGGEwvo=w?mZ`qq%dGyBiuh~dv7 zk{$YONniC(j&dhHL^d(A*D2~jr92h6!$>!xcd_x)Q0dpNsUC0N`7!zFG~>P74Y`-c z2pP$AwN;PZhU+^!S){58KGGI$!6Q`wOE)_|IbHGj5nW>VZqid##}sUy!-jd(J&PTF z0+X}d_aO!;ouMEF)qOxZtJLV*Fxntbx3QY4KUwOP1d)iP{l@nnO@>kWzRmW50xonw z^ptfzbT8|axrzX8!ZwniQWax#)`4?%j<{Wn1o+~FZ|xG%&;6DlfU?^;u3c$D-oCh{ zV)j8}aR1}I`(DNbGkHEj-+C_TF2Y_Oj`X*;Z`C4lB%)C z#}U8sc5xY!XAz=(gO`#oHAwxkNXuK>B@4j5k(`fPOfEn-^hn%+(c1f(ugg!%fJ08& zn+j(3U*0sM;!Mdg&XQG*Fvp?Lunvai3}uc&!Y5vQZ!IOpC;${u$4v$L5zz+{rC&G2 z@m@mYAeF$rDhLFETcX%44NyCX2wndo7Ebg<`qcYB(x?A#&bHDY(V8RvNFk7Z9p8D~ z8hm;KAm>)(h%WzsLVM~1&x}vBjo)uqcWqx?RT~8Y43aQUCD&|+udZ<^O$Bdu-r>LF zO%?*>T(EmaiHtOATebJ6ctQ*w?{Ct=s2#@!V;-7(8VnI}K&#y^^ya-^(VUu>r0FaS z%K7--Ee<%VU@rH`IlkJ~0TKv8aq-A+IUm_KDlbXD%D=^N7IxUZC5DwoH&W=c?RIXx z95D}g>AX5B6hanQA_=6oblbsi2ET+uOjxwms=h~?q2Da1 z-4X&opW`B0rT6xvx)J(76x6hx`e59hbG)|{5VKlp(W z7PR@$FrzGqJ9-RqGRT(sz{omC;OiL>O1J=f*iZr;?%H=8RQ)*13dP51Agmo33gj}T z9;$ihULMnuV#6EOVQ}f1a|IW7;!w^5K{j&WZ0>z_gm=8wk(?kR$_faniB!uRTJ^?! ztJPo-TK0^$_Sps4v;R-9heI_O33d2?Dm(LdsQ!PC6EPx2gv1~*C?S!ujS#{hEw=1S z_B~|Zh3sotlRb>RtTpzf6jEPfn~Z&z-O&Av>VErvANM|f_x|G_9*_CVImhR`&ue*} z)+nzB?_>`-3wm~xMFtiQ@NwH!14)+k4Mb3lD6SZx$S<3l_+W(di}oR&s#GjjU&D9? z<=tUs>&J60mizIw2YMlMxp|1Wv?kRDKmF8)zNckj{6kYNj;Qtux*}zr0A1eiu7aDID4+FPBtXKaglmTdZagSt$*E}1_`7zx*3Fz80QzT1$FTOr zHN8=!wPdA%p#Eql3Q?0vaAfaY)d1(DlZ`|!!K7^{%*Yse)6fPw2JVVu-q!r6-==Er zZz{=eQ}u{S@^JJ@HwTT?mw1JQIpdh2z_X*8A58n^Ev`kk154EFB)aWN%%}U^b=9iX&M6|GzPw-b`NydW>=B?f^s`&sp z`e!qYQdugv3iNh|Cm2s{+VdSW2)hAcFO>!@jqyl)F5cbhdTN&wT=pM`}AD^OSv7bO%HbhI<<6@c9&Pt2-|OXZ`kmG!?WN{v)Q z&W+6Z&{0a(`w1oAcq^Y!UglC}u-DjtjMujA{q8L+$%a_EKg@eDza)#=$p1Ke@@Ch5 z7ynM_g#kZ`Z@{wCpO^9@(5}p=a-PzZ~t9?Nb#^&A0R4-s=_gTYaK;MpMiQTFH9b z#g)kO;VMGG^$);~)8)8{DHS@l)=_qXdDkkp+vW`ZDg2$}RS5w!Vu zkBe#xg$Kp_R^?k?dw+FKx6m{Oi_9ogb;wD}aPsoSpXbX&5*nxZ zQh+cbR|W*h2WFbDscHY1^196bw0`NNA67bYH6xNoS3PR=no1>j0Q}QKp_de z;15%?^m9;x=CK4+u|*HFu9}j7t`F{@$wx0UBL#Cb=UI*Xt8q%<@~d&G-(;_vBIETDFE}|D&1I`gBMMZ$d+Y*FZySvQ z%!fR@XNl}Z1L}@bE!8zC8d#`5d={CaH`#v7=sk8r$D0@5w0TrgNSE<<*h)w3?;%qh zC(chUw2p1j1fm|dfpI`%JvDh{7z}xLN^4FQ7>}jaBRs>-C}M%2nvU;POl_e4w#j7p zlI5%UTNgg4xkQI56w)#ax(i)KWUoX3|71{m$J$?T+ZQPZ8|`k31wrYZeIgD8-61Er z;)ZU{p`*GfK#82XAeJF^hJXAGw~9Cg+U3R`GtIP|u-8?@P7LU-vJfWDxV{E;9|Q=l z=AFb>VJWI*#71CISAFC`I-&&`AZX?z4bglEo{A+>6{>z5IkS$|znxk1TpsVRxr@hD}d%2=>;?5I(0T80HO8t+X5Y^ znFa{r1gOw^32|T(G{y-FB(U{Ikz*YvF4GfbvP!8(0WmTr z-i~m7;}jrZt4+t!p~EsU0yMt>BYTgV2!IjPKL8_-)`O4?r^h(v$YEnL)E@Mwxw3Gv z7wawd6@-`W`9QZRJe_XUX4o*47!Txle~zLN)p#j3PgZ8{%ZBUdsc*KPYrZ4~Dw=&! z6M(p*1RWAXt=y7D?=<^-o!g}bvk~Z;IkJH-a1OWcQTThnOL2Re+WMg~8~uqrrHTw9 z?8dR>(4cguqu9;?vY@_BvXHz zl5uZfHCt#?_k!7%mvD9MOrLP>$g}bJ z0G1V(LS~ws;piG9UwRyvR^7-OFWv#T5#ks^X_j8Z$0X{}DPRE16{Ab+ds%1e$brsSg^}!@xJ3fTs)U*gUwQpS@m+o&>Y7+nAaS1 zuSimOuc|lVZu_++r8z;(b9(=F$;VplPo2Q(?PrxRAKw*vS(+p|+x5=e2L#e>Az}QK z-V7izHuzn><<^Ds1dNE|#w%#i%s2lbG&0p`8fm<*hbwSG@3rD^zssXq zpgdaF_4>iJ%o5l9r)d%O7SC(=X9cDPGIl$hZjBFFQXpy@eYqbJnh75!h4wxSF3ioR zPxy(S=2148zIq%yDm=3B);q?1ksK|T1KJ6euH_qEE1PQSqb)U9li}reJyxu#Xc||x zIDeD@e{KUkXo|jVt4yBb8}h}9aR=h0%Z%|Du+8$T~F>WO~YZuD>jXTZM$5o z{LoAN{0f30GUcZ+Yu4J(yg_%6A1ulnKZaiXQaL2GFl2Uu*eL5Zuvc5lhc(`|tr=2j z*8s5^e1Vvzn)fzPouxTuV!6W+2HfZP2KCxFF@ z*{mMeJO?aRt+dKmX4aL{P`myF!wP{5+IJM_iAbZe0)$P`{8+ddbSMR7)%6HIwRIvg z_#qUjW1H&Ttq5K2yIN}t`?1Z^QYn+N)w>nUQAw#4*Rgz-2EE703kjVWjN+GZZ@vQg zuGx9V@|CL&hnv}8igIBO3AV_xJ<%&F!F>N*k6f+A%Nl_7P|aakcW3vCuhUprFa$v9 zH}xd@6?xAKZcbpsMK{&D7Y!CEGGtOjrg1r~Bw^xSR8d-V`lBmn%XTak_qSzsPLZLj zo(>*iJ`|^PBC(*_iN6Ff7{yu`zAD}RPB^XYeu5FD^Ad2#{;n!HIx?G8x2Zrhp9nk8 zU7JOPT-wqhJ|pr0q2%hQZa9TFFj$zU9ghMOG?Y=CLC%KP9Q9&xfY_y=m)U*WE)@k6 zI{hT62F=RTB1XtM3sOP?ZGuI2b|8JZR)N9go8Hk(wA(|=NWUbyO!XGw10tH4V2C8?*;Q+PEBO2H-dzJ)!oeybWOq~e=(mp;p2my)wM>c;a(yp9SJjjZe z5oAcX_hm!lcx@(0gz7d4qd8%D#0&oWbES6y?nM8#ECfA(yy`6F>dc-9u;_9uWTG2SrumMNE14wg0?eJqsZ4)J<-J3XT;rBWtf!RCxrHH3MkOe zM{aOJ;$M7eoS6a_nr-tRa+XFyVBA8{uG!PXiUOXomdJG%Rd)cwk^vQri?x6u1{gHi z9x*)GDhG24d;$s+oM=+CQ{(uT7U=^Jvysk(>(FsaCM&m{HIe4TRJ|uPio~+}@@8)J zZU=|SLfe_8+#{Pb*n8L5fAB*?Bq=RAOd{oagz}uqg5tv6NHv?RvjUEHt1}J$L9fKQjn)+L_UrzNJMbZ<_};R5iguH zD4$r})B6o~Z$0;6*Atc0qIZ2rGOT6#Q_qVAwUfC8$cj1`{Kw@fg7X-HCmPvHJi`}l zJG>(=^!DTl$z=+Y$NN3S^LNB!n5<@scILdRE?3yJY zwfU725Y3XZjuLz|?|I0t48Bv);tB1>MI1%?McAzMXBvryK$g{sMM%IZ2z2smD;O-( zWqgQQO`}Ju2{;{Q38P(;s?Hn?oh%m~3VX~7l=Xd4evqglzRAk20st3awfWiQ zC2fybTYJFqAtddycO=hQQ&qf?Ur;?@*g~TB29FdtjzRsr zNRJjsj{PwA#3+rE|1(`yBMZ%N`BL$#WFj;#7WCflIq{J-!g#u9r2_k@JVGpW`X=PU1YUc&>1~v`y z9H)>!42%WAIFMfpZxoo@oc8i25j;F#*E4w|^`Eo#8zukG2?NgjYrhSubR=d)-S)q>8|7y|PfJtS4mbck&*^Iit8NKAt`f*@$g2 zOw+~7JU;$ct=k!*NRHCymy_3HO}n>^G2*Ee5}|%vE2F3@5W14FBjl}N;ofUR<%yf; zp_`bKY0nTlFPLqh3?Cw{n~1BhSIg|=N-Mh7^n<52{Ju;|XdQuBHnFCp!w-MS3imyi zm0++u4-CNxM8Gu6QNaJS^Or43;AbNje*m2z(I)w14*q*InhiG!U@{>X~ zj!#N}NtskS#30bYFIvNNO4;|V$6op3*-XjP9n0DpH~t;J-v;q}du4#MjUolbn!~*a z2^}3-#(b-bf#rK7Q-WvvL6X>>wQR!IyR_^~a<^cvWMla=%kctMR#4_w5doGsFhJ(3vbNQmJB?Dp zhR*WerMV{6x0>O(9(MTwQJgfa|41?FPUhUY^JRaRlY|Is{LE`2`MOIP2DvX3dtfOH ztAEckwsXi={(;qIKr5+*e1rVS)B&dBQ3n%>-h7|-7?jlVzPd^I`%)MXF?h1dx%*u3kAE413Q4R$GNPw! z;|@R(h4ZjCH)u6)czUFpS2Qslq{DhuZx&EgsqTHogc{DNWmlgytYdRdl=Zz^_Igd> z$QOjye4ODFxVla3N1$CG#BWJiGH0grHXfFiDlF%%f*_ul#ck#Lv*E{h_7uT^S3Ly9 zNv3agT+X~~N_k%G_eP`|ORkp^t-c$16#p=D)&0&xxwq;oqm(y{K`cz*uEyW7uuqJn z@UB3dC!!;oBSABRRKHE`{V9Z&*T!adGe~(IyCDjInx!W?FYKMO)s!q+@%6s{%M}b( zKDQIS6!qGJZ4H{K2-QCcRIZpgpV@dVwi+JdDxZ*AE}PaQAQq)g}*sg@FK!S8?CfP3;Nx(h1xh)t?>_5n zOo#2hA+0vSoh_!Vvsm+S9%vabUmSTyYJ?LSG%#hZGbZx)o&}dfmoy{cDIv7GXIHUe z>U;d8x>q@iqw2b$T|jjs-W^Vq!}yB8z0fuxa4#G#cefmIFQB558T~}qIQCagv*0y` z^fFp0@1(t{0ETvQPlls}D~gB>`^`MI=@>eqzSw+b-=ndMVjB5t<1L`JV}{%fYP zEW+8Haq@ymFq5dgO-E6nSI!Q1bdeB01h~r=@5B5fpZ=EXy z23|tTADD|@U@}*s{)d{t4UBPePwpxsQ}gujg8Ga`(Y%&=V*Wu5iRdvXr5F$m5ImXO z)E;>46P52tsML8fBax@&W?lqcAc5^;RJ^@gdrqVvl)566n^(ZKjhNnBE^u;WB9jIk z$x(*6Jn3EaWSv&mCjd_d9h%tqT88}<e7V7Ma04>+LiyBfUnDzGdZQ0*>es-0TPnFal&;Rbt z+5MpS`SoN@)BBzCW^lDxQw^+Sw)E;MHP}xeye(l8r`)$~emu+@?WXxAWu%7W{qotI zEhu-1EV}up38+Bp`+zacZzK801hnOZ6t67S_X`S6m-TCOerE(2uP3zyUG}XEYfoZU zrgHD?e!GVdzuDBTHaVM4FQP9ED~euF&C#vohnmA$7T@^bT*x1k6Ul>pP=@I+Kw72D zoyTM_f}>QH+x7SklTt$8*L&@b0@u}Cp#ZG=6LUdG_7@uTQDA;1`$@9-GO4PaTZ%p7 z@`|Kx)$3BiaWSD3z{elUknU4)vi2#abZXE{lzL9G ZTf};29tY{kDhCsOuOyF@E4^VD@Lv;`c*6hy literal 0 HcmV?d00001 From eb6efd63cc319387660537c5274f10dfd88223f0 Mon Sep 17 00:00:00 2001 From: nietras Date: Fri, 14 Nov 2025 15:05:44 +0100 Subject: [PATCH 4/4] add sneaky assembly --- _posts/2025-11-12-sep-0.12.0.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/_posts/2025-11-12-sep-0.12.0.md b/_posts/2025-11-12-sep-0.12.0.md index 067187a..d0d54b0 100644 --- a/_posts/2025-11-12-sep-0.12.0.md +++ b/_posts/2025-11-12-sep-0.12.0.md @@ -20,4 +20,13 @@ That's all! 😁 PS: There have been a few 0.11.x release with some minor feature additions. Check out [releases](https://github.com/nietras/Sep/releases) on GitHub for -notes on this. Most of it is GitHub chore, though. \ No newline at end of file +notes on this. Most of it is GitHub chore, though. + +sneaky `Sep_nietras_SeparatedValues_SepParserVector256NrwCmpExtMsbTzcnt__Parse` +uses AVX-512 VBMI2 instructions for narrowing with saturation: +``` + 000000014007DF72: C5 FE 6F 27 vmovdqu ymm4,ymmword ptr [rdi] + 000000014007DF76: 62 F3 5D 48 3A 67 vinserti32x8 zmm4,zmm4,ymmword ptr [rdi+20h],1 + 01 01 + 000000014007DF7E: 62 F2 7E 48 10 E4 vpmovuswb ymm4,zmm4 +``` \ No newline at end of file