[DTrace-devel] [PATCH 3/4] clean up dt_cg_typecast(): use single instruction to load shift amount
Kris Van Hees
kris.van.hees at oracle.com
Mon Aug 24 06:59:16 PDT 2020
Eugene,
Can you do a patch with the alternative change I mentioned in my earlier reply,
and then it can go in along with the patch to handle the shift by 0 fix?
Thanks,
Kris
On Tue, Aug 11, 2020 at 08:56:42PM -0400, Kris Van Hees wrote:
> On Tue, Aug 11, 2020 at 06:11:11PM -0400, eugene.loh at oracle.com wrote:
> > From: Eugene Loh <eugene.loh at oracle.com>
> >
> > If a typecast is required, it is effected with a left then right shift.
> > The shift amount is necessarily at most 64. It is loaded into a
> > register with a two-instruction lddw. This is unnecessary; a
> > single-instruction IMM move suffices. This optimization already
> > appears in DT_TOK_INT:
> >
> > if (dnp->dn_value > UINT32_MAX)
> > dt_cg_setx(dlp, dnp->dn_reg, dnp->dn_value);
> > else {
> > instr = BPF_MOV_IMM(dnp->dn_reg, dnp->dn_value);
> > dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> > }
> >
> > For the dt_cg_typecast() shift amount, no test is needed; we already
> > know the shift amount fits in 32 bits.
>
> This fix is not necessary becausae a different patch needs to be done ere:
> the shift instruction should use an immediate-based shift rather than getting
> the value from a register...
>
> BPF_ALU64_REG(BPF_LSH, dst->dn_reg, reg);
>
> should be:
>
> BPF_ALU64_IMM(BPF_LSH, dst->dn_reg, n);
>
> and
>
> BPF_ALU64_REG((dst->dn_flags & DT_NF_SIGNED) ?
> BPF_ARSH : BPF_RSH, dst->dn_reg, reg);
>
> should be:
>
> BPF_ALU64_IMM((dst->dn_flags & DT_NF_SIGNED) ?
> BPF_ARSH : BPF_RSH, dst->dn_reg, n);
>
> and the use of 'reg' should be eliminated (no dt_cg_setx or BPF_MOV_IMM
> needed). This is valid because we know that the shift amount is a constant
> at the moment of generating the code.
>
> > Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> > ---
> > libdtrace/dt_cg.c | 5 +++--
> > 1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> > index 6ba779d1..b3b3d3a7 100644
> > --- a/libdtrace/dt_cg.c
> > +++ b/libdtrace/dt_cg.c
> > @@ -1142,15 +1142,16 @@ dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
> > if ((reg = dt_regset_alloc(drp)) == -1)
> > longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> >
> > - dt_cg_setx(dlp, reg, n);
> > + instr = BPF_MOV_IMM(reg, n);
> > + dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> >
> > instr = BPF_ALU64_REG(BPF_LSH, dst->dn_reg, reg);
> > dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> >
> > instr = BPF_ALU64_REG((dst->dn_flags & DT_NF_SIGNED) ?
> > BPF_ARSH : BPF_RSH, dst->dn_reg, reg);
> > -
> > dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> > +
> > dt_regset_free(drp, reg);
> > }
> > }
> > --
> > 2.18.4
> >
> >
> > _______________________________________________
> > DTrace-devel mailing list
> > DTrace-devel at oss.oracle.com
> > https://oss.oracle.com/mailman/listinfo/dtrace-devel
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list