diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c
index ad1ecfc640..bcf796f8c3 100644
--- a/lib/pipeline/rte_swx_pipeline.c
+++ b/lib/pipeline/rte_swx_pipeline.c
@@ -1567,84 +1567,13 @@ instr_drop_translate(struct rte_swx_pipeline *p,
 	return 0;
 }
 
-static inline void
-emit_handler(struct thread *t)
-{
-	struct header_out_runtime *h0 = &t->headers_out[0];
-	struct header_out_runtime *h1 = &t->headers_out[1];
-	uint32_t offset = 0, i;
-
-	/* No header change or header decapsulation. */
-	if ((t->n_headers_out == 1) &&
-	    (h0->ptr + h0->n_bytes == t->ptr)) {
-		TRACE("Emit handler: no header change or header decap.\n");
-
-		t->pkt.offset -= h0->n_bytes;
-		t->pkt.length += h0->n_bytes;
-
-		return;
-	}
-
-	/* Header encapsulation (optionally, with prior header decasulation). */
-	if ((t->n_headers_out == 2) &&
-	    (h1->ptr + h1->n_bytes == t->ptr) &&
-	    (h0->ptr == h0->ptr0)) {
-		uint32_t offset;
-
-		TRACE("Emit handler: header encapsulation.\n");
-
-		offset = h0->n_bytes + h1->n_bytes;
-		memcpy(t->ptr - offset, h0->ptr, h0->n_bytes);
-		t->pkt.offset -= offset;
-		t->pkt.length += offset;
-
-		return;
-	}
-
-	/* Header insertion. */
-	/* TBD */
-
-	/* Header extraction. */
-	/* TBD */
-
-	/* For any other case. */
-	TRACE("Emit handler: complex case.\n");
-
-	for (i = 0; i < t->n_headers_out; i++) {
-		struct header_out_runtime *h = &t->headers_out[i];
-
-		memcpy(&t->header_out_storage[offset], h->ptr, h->n_bytes);
-		offset += h->n_bytes;
-	}
-
-	if (offset) {
-		memcpy(t->ptr - offset, t->header_out_storage, offset);
-		t->pkt.offset -= offset;
-		t->pkt.length += offset;
-	}
-}
-
-static inline void
-instr_tx_exec(struct rte_swx_pipeline *p);
-
 static inline void
 instr_tx_exec(struct rte_swx_pipeline *p)
 {
 	struct thread *t = &p->threads[p->thread_id];
 	struct instruction *ip = t->ip;
-	uint64_t port_id = METADATA_READ(t, ip->io.io.offset, ip->io.io.n_bits);
-	struct port_out_runtime *port = &p->out[port_id];
-	struct rte_swx_pkt *pkt = &t->pkt;
 
-	TRACE("[Thread %2u]: tx 1 pkt to port %u\n",
-	      p->thread_id,
-	      (uint32_t)port_id);
-
-	/* Headers. */
-	emit_handler(t);
-
-	/* Packet. */
-	port->pkt_tx(port->obj, pkt);
+	__instr_tx_exec(p, t, ip);
 
 	/* Thread. */
 	thread_ip_reset(p, t);
@@ -1656,19 +1585,8 @@ instr_tx_i_exec(struct rte_swx_pipeline *p)
 {
 	struct thread *t = &p->threads[p->thread_id];
 	struct instruction *ip = t->ip;
-	uint64_t port_id = ip->io.io.val;
-	struct port_out_runtime *port = &p->out[port_id];
-	struct rte_swx_pkt *pkt = &t->pkt;
-
-	TRACE("[Thread %2u]: tx (i) 1 pkt to port %u\n",
-	      p->thread_id,
-	      (uint32_t)port_id);
-
-	/* Headers. */
-	emit_handler(t);
 
-	/* Packet. */
-	port->pkt_tx(port->obj, pkt);
+	__instr_tx_i_exec(p, t, ip);
 
 	/* Thread. */
 	thread_ip_reset(p, t);
diff --git a/lib/pipeline/rte_swx_pipeline_internal.h b/lib/pipeline/rte_swx_pipeline_internal.h
index 9814b5685a..e9fe6632b6 100644
--- a/lib/pipeline/rte_swx_pipeline_internal.h
+++ b/lib/pipeline/rte_swx_pipeline_internal.h
@@ -1490,4 +1490,94 @@ instr_rx_exec(struct rte_swx_pipeline *p)
 	thread_yield(p);
 }
 
+/*
+ * tx.
+ */
+static inline void
+emit_handler(struct thread *t)
+{
+	struct header_out_runtime *h0 = &t->headers_out[0];
+	struct header_out_runtime *h1 = &t->headers_out[1];
+	uint32_t offset = 0, i;
+
+	/* No header change or header decapsulation. */
+	if ((t->n_headers_out == 1) &&
+	    (h0->ptr + h0->n_bytes == t->ptr)) {
+		TRACE("Emit handler: no header change or header decap.\n");
+
+		t->pkt.offset -= h0->n_bytes;
+		t->pkt.length += h0->n_bytes;
+
+		return;
+	}
+
+	/* Header encapsulation (optionally, with prior header decasulation). */
+	if ((t->n_headers_out == 2) &&
+	    (h1->ptr + h1->n_bytes == t->ptr) &&
+	    (h0->ptr == h0->ptr0)) {
+		uint32_t offset;
+
+		TRACE("Emit handler: header encapsulation.\n");
+
+		offset = h0->n_bytes + h1->n_bytes;
+		memcpy(t->ptr - offset, h0->ptr, h0->n_bytes);
+		t->pkt.offset -= offset;
+		t->pkt.length += offset;
+
+		return;
+	}
+
+	/* For any other case. */
+	TRACE("Emit handler: complex case.\n");
+
+	for (i = 0; i < t->n_headers_out; i++) {
+		struct header_out_runtime *h = &t->headers_out[i];
+
+		memcpy(&t->header_out_storage[offset], h->ptr, h->n_bytes);
+		offset += h->n_bytes;
+	}
+
+	if (offset) {
+		memcpy(t->ptr - offset, t->header_out_storage, offset);
+		t->pkt.offset -= offset;
+		t->pkt.length += offset;
+	}
+}
+
+static inline void
+__instr_tx_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)
+{
+	uint64_t port_id = METADATA_READ(t, ip->io.io.offset, ip->io.io.n_bits);
+	struct port_out_runtime *port = &p->out[port_id];
+	struct rte_swx_pkt *pkt = &t->pkt;
+
+	TRACE("[Thread %2u]: tx 1 pkt to port %u\n",
+	      p->thread_id,
+	      (uint32_t)port_id);
+
+	/* Headers. */
+	emit_handler(t);
+
+	/* Packet. */
+	port->pkt_tx(port->obj, pkt);
+}
+
+static inline void
+__instr_tx_i_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)
+{
+	uint64_t port_id = ip->io.io.val;
+	struct port_out_runtime *port = &p->out[port_id];
+	struct rte_swx_pkt *pkt = &t->pkt;
+
+	TRACE("[Thread %2u]: tx (i) 1 pkt to port %u\n",
+	      p->thread_id,
+	      (uint32_t)port_id);
+
+	/* Headers. */
+	emit_handler(t);
+
+	/* Packet. */
+	port->pkt_tx(port->obj, pkt);
+}
+
 #endif
