optimize pp_length for simple PVs
authorDaniel Dragan <bulk88@hotmail.com>
Tue, 23 Sep 2014 22:19:32 +0000 (18:19 -0400)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 24 Sep 2014 01:15:20 +0000 (18:15 -0700)
commit7776003ecba252f04a5359ee75d84770ad318f9a
tree9f2a41d3b2de4e7af3c02dc05192f01a6a671d92
parent0c7df90239f4c313f42964755700c2a3c78ec63c
optimize pp_length for simple PVs

Previously in pp_length, for non-magic, non-utf8 PVs, a number of
conditional branches based on bitfield testing had to execute, and finally
the length of a non-utf8 SVPV was fetched with sv_len_utf8_nomg.
sv_len_utf8_nomg checks SvUTF8, and if false, use the len from
SvPV_nomg_const call in sv_len_utf8_nomg. Note in pp_length,
SvPV_nomg_const already exists for the "use bytes" branch.

After this patch, a !SvGMAGICAL && (!SvUTF8  || use_bytes) SV will take
only 1 conditional branch and no func calls before reaching sv_setiv.
svflags is reused for the mg_get test since partially masked svflags will
already be in a register vs fetching the whole flags from SV head again.

SETS(TARG) was factored out from all the SETI/SETTARG macros. If targ is
not set/written to (the PL_sv_undef branch), do not check/call for
set magic on it, just return from the opcode. Also a putback was removed
since the operand SV is replaced inplace on Perl stack with a SV with IV
length in it.

For profiling info, profiling stats, and rejected implementations see
[perl #122835]
pod/perldelta.pod
pp.c