tweak PERL_TRACE_OPS for usability, add PERL_TRACE_OPS_PAD

Currently with -DPERL_TRACE_OPS builds, a histogram of all optypes
executed is always printed at END.  This is too noisy, so make the
print depend on comand-line option -D.  And dont print 0 values, which
dramatically reduces output for one-liner scripts.

Currently, the trace-ops histogram array (PL_op_exec_cnt[]) has 1
extra slot for counting exec-things (ie for hacking), name it
PERL_TRACE_OPS_PAD, change its default to 10, and implement
following exec-counts:

 - count total ops (in OP-max slot, reported as op-freed)
 - count odd/even op_types
 - count OPs with op_spare set
 - count OPs with "modified" op_ppaddr field
dump.c: runloop debug (skip this)

add DEBUG_U print when o->op_ppaddr != PL_ppaddr[o->op_type]

This is the case for mapstart, which is why dispatching
(*PL_ppaddr[o->op_type])(aTHX) directly would result in a
"panic:..unimplemented_op.." message.

When mismatch is seen, we do a cheesy search for another OP_TYPE with
that op_ppaddr.  This found MAPSTART using GREPSTART, but for truly
custom pp-functions it counts down to -1, and displays a sentinel
op-desc.  Its useful for next patch, further extended patch after it.
dump.c: dispatch pp-code from PL_ppaddr[] directly (skip this)

Dispatch most OPs using (*PL_ppaddr[PL_op->op_type])(aTHX) directly.

DO NOT APPLY

It would be nice if op_ppaddr was an optimization detail, not a
requirement to allow patching in new behavior.  Then we could test to
see what gains the op_ppaddr pointer confers upon execution.  Fully
eliminating op_ppaddr is hard, (and we're likely to just confirm the
pointer is good, even considering its cost), so we cheat here.

This patch does indirect dispatch for most optypes, ie:
  PL_op = (*PL_ppaddr[PL_op->op_type])(aTHX);
but some ops are "bad", and dispatched directly, ie:
  PL_op = PL_op->op_ppaddr(aTHX);

The "bad" ones are those OPs whose type is "modified"
(o->op_ppaddr != PL_ppaddr[o->op_type]), so we
blacklist OPs which panic the indirect way.

This is fundamentally broken; as b82b06b "Reimplement $[ as a module"
shows, practically all OP_s can be modified, we just blacklist those
that currently are modified by one or more tests.

But for research purposes, it does help us determine (eventually) the
slowdown of direct PL_ppaddr[optype], as follows:

- run time make test (etc, etc, etc) on blead vs this branch,
  if no measurable differences then stop, reexamine tests, etc.

- with -DPERL_TRACE_OPS, ++PL_op_exec_cnt[PL_op->op_type] will profile
  the ops run during a test.  From that, we can compute that say 95%
  of X-million OP_s deref'd PL_ppaddr[], causing any measured slowdown.

TODO:

develop a good benchmarking scenario. (ya, just like that ;-)
- need make test under perf
- perlbench - real runtimes, less overhead than core tests.

build a branch with extra op_junk pointer in OP, benchmark it to get
costs (cache, footprint) of extra pointer, and infer from that
(caveats apply) the savings by eliminating op_ppaddr.

collect and analyse a lot of data.

BLUE-SKY:

Actually eliminating op_ppaddr is possible:
- define op_custpp flag in OP
  setOpAddr, setOpType manage the flag
- setOpAddr inserts "modified" ppaddrs into PL_custom_ops (or similar)
- runops loop checks op_custpp flag, query PL_custom_ops for dispatch.
  probly expensive, so want low population of them.

dvar for added check
op.c: set op_spare/op_cust in LINKLIST under -DPERL_TRACE_OPS

In Perl_linklist, when (o->op_ppaddr != PL_ppaddr[o->op_type]), set
op_spare/op_cust bit, and increment last DPERL_TRACE_OPS_PAD slot
(extra.9 below).  This counts the OPs that have been modified by the
time theyre LINKED.

This appears to work - it finds same count of modified ops as 2
execution time tests previously added to Perl_runops_debug(): op-spare
bit set (extra.2,3), and the postcondition above (extra.4,5).

 $ ./perl -Ilib -D0 ext/arybase/t/splice.t
  extra.0: 40430
  extra.1: 68126
  extra.2: 108543
  extra.3: 13
  extra.4: 108543
  extra.5: 13
  extra.9: 13

TBD: extra.9 == extra.5 probably requires no loops over modified OPs.