[DTrace-devel] [PATCH 08/13] Add code for avg() aggregation function

eugene.loh at oracle.com eugene.loh at oracle.com
Wed Dec 2 10:54:53 PST 2020


From: Eugene Loh <eugene.loh at oracle.com>

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_cg.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 6fa49bbc..43edb363 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -3071,6 +3071,35 @@ dt_cg_agg_opt_incr(dt_node_t *dnp, dt_node_t *lastarg, const char *fn,
 	return incr;
 }
 
+static void
+dt_cg_agg_avg_impl(dt_irlist_t *dlp, dt_regset_t *drp, int dreg, int vreg)
+{
+	TRACE_REGSET("            Impl: Begin");
+
+	/*
+	 * uint64_t dst[2], val;
+	 * char *dreg = dst, *vreg = &val;
+	 *				//     (%rd = dreg -- agg data ptr)
+	 *				//     (%rv = vreg -- value)
+	 *	uint64_t *dst = dreg;
+	 *
+	 *	dst[0]++;		// mov %r0, 1
+	 *				// xadd [%rd + 0], %r0
+	 *	dst[1] += vreg;		// xadd [%rd + 8], %rv
+	 */
+
+	/* dst[0]++ */
+	dt_regset_xalloc(drp, BPF_REG_0);
+	emit(dlp, BPF_MOV_IMM(BPF_REG_0, 1));
+	emit(dlp, BPF_XADD_REG(BPF_DW, dreg, 0, BPF_REG_0));
+	dt_regset_free(drp, BPF_REG_0);
+
+	/* dst[1] += val */
+	emit(dlp, BPF_XADD_REG(BPF_DW, dreg, 8, vreg));
+
+	TRACE_REGSET("            Impl: End  ");
+}
+
 static void
 dt_cg_agg_avg(dt_pcb_t *pcb, dt_ident_t *aid, dt_node_t *dnp,
 	      dt_irlist_t *dlp, dt_regset_t *drp)
@@ -3079,6 +3108,16 @@ dt_cg_agg_avg(dt_pcb_t *pcb, dt_ident_t *aid, dt_node_t *dnp,
 
 	if (aid->di_offset == -1)
 		aid->di_offset = DT_CG_AGG_OFFSET(pcb, sz);
+
+	TRACE_REGSET("    AggAvg: Begin");
+
+	dt_cg_node(dnp->dn_aggfun->dn_args, dlp, drp);
+
+	DT_CG_AGG_IMPL(aid, sz, dlp, drp, dt_cg_agg_avg_impl,
+		       dnp->dn_aggfun->dn_args->dn_reg);
+	dt_regset_free(drp, dnp->dn_aggfun->dn_args->dn_reg);
+
+	TRACE_REGSET("    AggAvg: End  ");
 }
 
 static void
-- 
2.18.4




More information about the DTrace-devel mailing list