get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/98614/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 98614,
    "url": "http://patches.dpdk.org/api/patches/98614/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210910123003.85448-14-cristian.dumitrescu@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210910123003.85448-14-cristian.dumitrescu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210910123003.85448-14-cristian.dumitrescu@intel.com",
    "date": "2021-09-10T12:29:53",
    "name": "[14/24] pipeline: create inline functions for meter instructions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "31be144d0d7398622a0706d2173058113d12b461",
    "submitter": {
        "id": 19,
        "url": "http://patches.dpdk.org/api/people/19/?format=api",
        "name": "Cristian Dumitrescu",
        "email": "cristian.dumitrescu@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210910123003.85448-14-cristian.dumitrescu@intel.com/mbox/",
    "series": [
        {
            "id": 18838,
            "url": "http://patches.dpdk.org/api/series/18838/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=18838",
            "date": "2021-09-10T12:29:44",
            "name": "[01/24] pipeline: move data structures to internal header file",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/18838/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/98614/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/98614/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BFA0BA0547;\n\tFri, 10 Sep 2021 14:31:47 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5D15F41177;\n\tFri, 10 Sep 2021 14:30:36 +0200 (CEST)",
            "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n by mails.dpdk.org (Postfix) with ESMTP id 3CA7C40DF4\n for <dev@dpdk.org>; Fri, 10 Sep 2021 14:30:23 +0200 (CEST)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 10 Sep 2021 05:30:18 -0700",
            "from silpixa00400573.ir.intel.com (HELO\n silpixa00400573.ger.corp.intel.com) ([10.237.223.107])\n by orsmga001.jf.intel.com with ESMTP; 10 Sep 2021 05:30:17 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10102\"; a=\"243386298\"",
            "E=Sophos;i=\"5.85,282,1624345200\"; d=\"scan'208\";a=\"243386298\"",
            "E=Sophos;i=\"5.85,282,1624345200\"; d=\"scan'208\";a=\"514279775\""
        ],
        "X-ExtLoop1": "1",
        "From": "Cristian Dumitrescu <cristian.dumitrescu@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Fri, 10 Sep 2021 13:29:53 +0100",
        "Message-Id": "<20210910123003.85448-14-cristian.dumitrescu@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210910123003.85448-1-cristian.dumitrescu@intel.com>",
        "References": "<20210910123003.85448-1-cristian.dumitrescu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH 14/24] pipeline: create inline functions for\n meter instructions",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>\n---\n lib/pipeline/rte_swx_pipeline.c          | 457 +------------------\n lib/pipeline/rte_swx_pipeline_internal.h | 541 +++++++++++++++++++++++\n 2 files changed, 558 insertions(+), 440 deletions(-)",
    "diff": "diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c\nindex c7117bb6da..8b64c57652 100644\n--- a/lib/pipeline/rte_swx_pipeline.c\n+++ b/lib/pipeline/rte_swx_pipeline.c\n@@ -4470,119 +4470,14 @@ instr_meter_translate(struct rte_swx_pipeline *p,\n \tCHECK(0, EINVAL);\n }\n \n-static inline struct meter *\n-instr_meter_idx_hbo(struct rte_swx_pipeline *p, struct thread *t, struct instruction *ip)\n-{\n-\tstruct metarray_runtime *r = &p->metarray_runtime[ip->meter.metarray_id];\n-\n-\tuint8_t *idx_struct = t->structs[ip->meter.idx.struct_id];\n-\tuint64_t *idx64_ptr = (uint64_t *)&idx_struct[ip->meter.idx.offset];\n-\tuint64_t idx64 = *idx64_ptr;\n-\tuint64_t idx64_mask = UINT64_MAX >> (64 - (ip)->meter.idx.n_bits);\n-\tuint64_t idx = idx64 & idx64_mask & r->size_mask;\n-\n-\treturn &r->metarray[idx];\n-}\n-\n-#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN\n-\n-static inline struct meter *\n-instr_meter_idx_nbo(struct rte_swx_pipeline *p, struct thread *t, struct instruction *ip)\n-{\n-\tstruct metarray_runtime *r = &p->metarray_runtime[ip->meter.metarray_id];\n-\n-\tuint8_t *idx_struct = t->structs[ip->meter.idx.struct_id];\n-\tuint64_t *idx64_ptr = (uint64_t *)&idx_struct[ip->meter.idx.offset];\n-\tuint64_t idx64 = *idx64_ptr;\n-\tuint64_t idx = (ntoh64(idx64) >> (64 - ip->meter.idx.n_bits)) & r->size_mask;\n-\n-\treturn &r->metarray[idx];\n-}\n-\n-#else\n-\n-#define instr_meter_idx_nbo instr_meter_idx_hbo\n-\n-#endif\n-\n-static inline struct meter *\n-instr_meter_idx_imm(struct rte_swx_pipeline *p, struct instruction *ip)\n-{\n-\tstruct metarray_runtime *r = &p->metarray_runtime[ip->meter.metarray_id];\n-\n-\tuint64_t idx =  ip->meter.idx_val & r->size_mask;\n-\n-\treturn &r->metarray[idx];\n-}\n-\n-static inline uint32_t\n-instr_meter_length_hbo(struct thread *t, struct instruction *ip)\n-{\n-\tuint8_t *src_struct = t->structs[ip->meter.length.struct_id];\n-\tuint64_t *src64_ptr = (uint64_t *)&src_struct[ip->meter.length.offset];\n-\tuint64_t src64 = *src64_ptr;\n-\tuint64_t src64_mask = UINT64_MAX >> (64 - (ip)->meter.length.n_bits);\n-\tuint64_t src = src64 & src64_mask;\n-\n-\treturn (uint32_t)src;\n-}\n-\n-#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN\n-\n-static inline uint32_t\n-instr_meter_length_nbo(struct thread *t, struct instruction *ip)\n-{\n-\tuint8_t *src_struct = t->structs[ip->meter.length.struct_id];\n-\tuint64_t *src64_ptr = (uint64_t *)&src_struct[ip->meter.length.offset];\n-\tuint64_t src64 = *src64_ptr;\n-\tuint64_t src = ntoh64(src64) >> (64 - ip->meter.length.n_bits);\n-\n-\treturn (uint32_t)src;\n-}\n-\n-#else\n-\n-#define instr_meter_length_nbo instr_meter_length_hbo\n-\n-#endif\n-\n-static inline enum rte_color\n-instr_meter_color_in_hbo(struct thread *t, struct instruction *ip)\n-{\n-\tuint8_t *src_struct = t->structs[ip->meter.color_in.struct_id];\n-\tuint64_t *src64_ptr = (uint64_t *)&src_struct[ip->meter.color_in.offset];\n-\tuint64_t src64 = *src64_ptr;\n-\tuint64_t src64_mask = UINT64_MAX >> (64 - ip->meter.color_in.n_bits);\n-\tuint64_t src = src64 & src64_mask;\n-\n-\treturn (enum rte_color)src;\n-}\n-\n-static inline void\n-instr_meter_color_out_hbo_set(struct thread *t, struct instruction *ip, enum rte_color color_out)\n-{\n-\tuint8_t *dst_struct = t->structs[ip->meter.color_out.struct_id];\n-\tuint64_t *dst64_ptr = (uint64_t *)&dst_struct[ip->meter.color_out.offset];\n-\tuint64_t dst64 = *dst64_ptr;\n-\tuint64_t dst64_mask = UINT64_MAX >> (64 - ip->meter.color_out.n_bits);\n-\n-\tuint64_t src = (uint64_t)color_out;\n-\n-\t*dst64_ptr = (dst64 & ~dst64_mask) | (src & dst64_mask);\n-}\n-\n static inline void\n instr_metprefetch_h_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\n-\tTRACE(\"[Thread %2u] metprefetch (h)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_nbo(p, t, ip);\n-\trte_prefetch0(m);\n+\t__instr_metprefetch_h_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4593,13 +4488,9 @@ instr_metprefetch_m_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\n-\tTRACE(\"[Thread %2u] metprefetch (m)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_hbo(p, t, ip);\n-\trte_prefetch0(m);\n+\t__instr_metprefetch_m_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4610,13 +4501,9 @@ instr_metprefetch_i_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\n-\tTRACE(\"[Thread %2u] metprefetch (i)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_imm(p, ip);\n-\trte_prefetch0(m);\n+\t__instr_metprefetch_i_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4627,35 +4514,9 @@ instr_meter_hhm_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (hhm)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_nbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_nbo(t, ip);\n-\tcolor_in = instr_meter_color_in_hbo(t, ip);\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_hhm_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4666,35 +4527,9 @@ instr_meter_hhi_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (hhi)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_nbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_nbo(t, ip);\n-\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_hhi_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4705,73 +4540,22 @@ instr_meter_hmm_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (hmm)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_nbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_hbo(t, ip);\n-\tcolor_in = instr_meter_color_in_hbo(t, ip);\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_hmm_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n }\n+\n static inline void\n instr_meter_hmi_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (hmi)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_nbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_hbo(t, ip);\n-\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_hmi_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4782,35 +4566,9 @@ instr_meter_mhm_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (mhm)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_hbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_nbo(t, ip);\n-\tcolor_in = instr_meter_color_in_hbo(t, ip);\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_mhm_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4821,35 +4579,9 @@ instr_meter_mhi_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (mhi)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_hbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_nbo(t, ip);\n-\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_mhi_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4860,35 +4592,9 @@ instr_meter_mmm_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (mmm)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_hbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_hbo(t, ip);\n-\tcolor_in = instr_meter_color_in_hbo(t, ip);\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_mmm_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4899,35 +4605,9 @@ instr_meter_mmi_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (mmi)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_hbo(p, t, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_hbo(t, ip);\n-\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_mmi_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4938,35 +4618,9 @@ instr_meter_ihm_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (ihm)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_imm(p, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_nbo(t, ip);\n-\tcolor_in = instr_meter_color_in_hbo(t, ip);\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_ihm_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -4977,35 +4631,9 @@ instr_meter_ihi_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (ihi)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_imm(p, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_nbo(t, ip);\n-\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_ihi_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n@@ -5016,73 +4644,22 @@ instr_meter_imm_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (imm)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_imm(p, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_hbo(t, ip);\n-\tcolor_in = instr_meter_color_in_hbo(t, ip);\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_imm_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\n }\n+\n static inline void\n instr_meter_imi_exec(struct rte_swx_pipeline *p)\n {\n \tstruct thread *t = &p->threads[p->thread_id];\n \tstruct instruction *ip = t->ip;\n-\tstruct meter *m;\n-\tuint64_t time, n_pkts, n_bytes;\n-\tuint32_t length;\n-\tenum rte_color color_in, color_out;\n-\n-\tTRACE(\"[Thread %2u] meter (imi)\\n\", p->thread_id);\n \n \t/* Structs. */\n-\tm = instr_meter_idx_imm(p, ip);\n-\trte_prefetch0(m->n_pkts);\n-\ttime = rte_get_tsc_cycles();\n-\tlength = instr_meter_length_hbo(t, ip);\n-\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n-\n-\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n-\t\t&m->profile->profile,\n-\t\ttime,\n-\t\tlength,\n-\t\tcolor_in);\n-\n-\tcolor_out &= m->color_mask;\n-\n-\tn_pkts = m->n_pkts[color_out];\n-\tn_bytes = m->n_bytes[color_out];\n-\n-\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n-\n-\tm->n_pkts[color_out] = n_pkts + 1;\n-\tm->n_bytes[color_out] = n_bytes + length;\n+\t__instr_meter_imi_exec(p, t, ip);\n \n \t/* Thread. */\n \tthread_ip_inc(p);\ndiff --git a/lib/pipeline/rte_swx_pipeline_internal.h b/lib/pipeline/rte_swx_pipeline_internal.h\nindex 2526c2f4c7..791adfb471 100644\n--- a/lib/pipeline/rte_swx_pipeline_internal.h\n+++ b/lib/pipeline/rte_swx_pipeline_internal.h\n@@ -3302,4 +3302,545 @@ __instr_regadd_rii_exec(struct rte_swx_pipeline *p,\n \tregarray[idx] += src;\n }\n \n+/*\n+ * metarray.\n+ */\n+static inline struct meter *\n+instr_meter_idx_hbo(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct metarray_runtime *r = &p->metarray_runtime[ip->meter.metarray_id];\n+\n+\tuint8_t *idx_struct = t->structs[ip->meter.idx.struct_id];\n+\tuint64_t *idx64_ptr = (uint64_t *)&idx_struct[ip->meter.idx.offset];\n+\tuint64_t idx64 = *idx64_ptr;\n+\tuint64_t idx64_mask = UINT64_MAX >> (64 - (ip)->meter.idx.n_bits);\n+\tuint64_t idx = idx64 & idx64_mask & r->size_mask;\n+\n+\treturn &r->metarray[idx];\n+}\n+\n+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN\n+\n+static inline struct meter *\n+instr_meter_idx_nbo(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct metarray_runtime *r = &p->metarray_runtime[ip->meter.metarray_id];\n+\n+\tuint8_t *idx_struct = t->structs[ip->meter.idx.struct_id];\n+\tuint64_t *idx64_ptr = (uint64_t *)&idx_struct[ip->meter.idx.offset];\n+\tuint64_t idx64 = *idx64_ptr;\n+\tuint64_t idx = (ntoh64(idx64) >> (64 - ip->meter.idx.n_bits)) & r->size_mask;\n+\n+\treturn &r->metarray[idx];\n+}\n+\n+#else\n+\n+#define instr_meter_idx_nbo instr_meter_idx_hbo\n+\n+#endif\n+\n+static inline struct meter *\n+instr_meter_idx_imm(struct rte_swx_pipeline *p, const struct instruction *ip)\n+{\n+\tstruct metarray_runtime *r = &p->metarray_runtime[ip->meter.metarray_id];\n+\n+\tuint64_t idx =  ip->meter.idx_val & r->size_mask;\n+\n+\treturn &r->metarray[idx];\n+}\n+\n+static inline uint32_t\n+instr_meter_length_hbo(struct thread *t, const struct instruction *ip)\n+{\n+\tuint8_t *src_struct = t->structs[ip->meter.length.struct_id];\n+\tuint64_t *src64_ptr = (uint64_t *)&src_struct[ip->meter.length.offset];\n+\tuint64_t src64 = *src64_ptr;\n+\tuint64_t src64_mask = UINT64_MAX >> (64 - (ip)->meter.length.n_bits);\n+\tuint64_t src = src64 & src64_mask;\n+\n+\treturn (uint32_t)src;\n+}\n+\n+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN\n+\n+static inline uint32_t\n+instr_meter_length_nbo(struct thread *t, const struct instruction *ip)\n+{\n+\tuint8_t *src_struct = t->structs[ip->meter.length.struct_id];\n+\tuint64_t *src64_ptr = (uint64_t *)&src_struct[ip->meter.length.offset];\n+\tuint64_t src64 = *src64_ptr;\n+\tuint64_t src = ntoh64(src64) >> (64 - ip->meter.length.n_bits);\n+\n+\treturn (uint32_t)src;\n+}\n+\n+#else\n+\n+#define instr_meter_length_nbo instr_meter_length_hbo\n+\n+#endif\n+\n+static inline enum rte_color\n+instr_meter_color_in_hbo(struct thread *t, const struct instruction *ip)\n+{\n+\tuint8_t *src_struct = t->structs[ip->meter.color_in.struct_id];\n+\tuint64_t *src64_ptr = (uint64_t *)&src_struct[ip->meter.color_in.offset];\n+\tuint64_t src64 = *src64_ptr;\n+\tuint64_t src64_mask = UINT64_MAX >> (64 - ip->meter.color_in.n_bits);\n+\tuint64_t src = src64 & src64_mask;\n+\n+\treturn (enum rte_color)src;\n+}\n+\n+static inline void\n+instr_meter_color_out_hbo_set(struct thread *t,\n+\t\t\t      const struct instruction *ip,\n+\t\t\t      enum rte_color color_out)\n+{\n+\tuint8_t *dst_struct = t->structs[ip->meter.color_out.struct_id];\n+\tuint64_t *dst64_ptr = (uint64_t *)&dst_struct[ip->meter.color_out.offset];\n+\tuint64_t dst64 = *dst64_ptr;\n+\tuint64_t dst64_mask = UINT64_MAX >> (64 - ip->meter.color_out.n_bits);\n+\n+\tuint64_t src = (uint64_t)color_out;\n+\n+\t*dst64_ptr = (dst64 & ~dst64_mask) | (src & dst64_mask);\n+}\n+\n+static inline void\n+__instr_metprefetch_h_exec(struct rte_swx_pipeline *p,\n+\t\t\t   struct thread *t,\n+\t\t\t   const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\n+\tTRACE(\"[Thread %2u] metprefetch (h)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_nbo(p, t, ip);\n+\trte_prefetch0(m);\n+}\n+\n+static inline void\n+__instr_metprefetch_m_exec(struct rte_swx_pipeline *p,\n+\t\t\t   struct thread *t,\n+\t\t\t   const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\n+\tTRACE(\"[Thread %2u] metprefetch (m)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_hbo(p, t, ip);\n+\trte_prefetch0(m);\n+}\n+\n+static inline void\n+__instr_metprefetch_i_exec(struct rte_swx_pipeline *p,\n+\t\t\t   struct thread *t __rte_unused,\n+\t\t\t   const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\n+\tTRACE(\"[Thread %2u] metprefetch (i)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_imm(p, ip);\n+\trte_prefetch0(m);\n+}\n+\n+static inline void\n+__instr_meter_hhm_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (hhm)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_nbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_nbo(t, ip);\n+\tcolor_in = instr_meter_color_in_hbo(t, ip);\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_hhi_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (hhi)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_nbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_nbo(t, ip);\n+\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_hmm_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (hmm)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_nbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_hbo(t, ip);\n+\tcolor_in = instr_meter_color_in_hbo(t, ip);\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_hmi_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (hmi)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_nbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_hbo(t, ip);\n+\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_mhm_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (mhm)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_hbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_nbo(t, ip);\n+\tcolor_in = instr_meter_color_in_hbo(t, ip);\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_mhi_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (mhi)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_hbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_nbo(t, ip);\n+\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_mmm_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (mmm)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_hbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_hbo(t, ip);\n+\tcolor_in = instr_meter_color_in_hbo(t, ip);\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_mmi_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (mmi)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_hbo(p, t, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_hbo(t, ip);\n+\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_ihm_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (ihm)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_imm(p, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_nbo(t, ip);\n+\tcolor_in = instr_meter_color_in_hbo(t, ip);\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_ihi_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (ihi)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_imm(p, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_nbo(t, ip);\n+\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_imm_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (imm)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_imm(p, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_hbo(t, ip);\n+\tcolor_in = instr_meter_color_in_hbo(t, ip);\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n+static inline void\n+__instr_meter_imi_exec(struct rte_swx_pipeline *p, struct thread *t, const struct instruction *ip)\n+{\n+\tstruct meter *m;\n+\tuint64_t time, n_pkts, n_bytes;\n+\tuint32_t length;\n+\tenum rte_color color_in, color_out;\n+\n+\tTRACE(\"[Thread %2u] meter (imi)\\n\", p->thread_id);\n+\n+\tm = instr_meter_idx_imm(p, ip);\n+\trte_prefetch0(m->n_pkts);\n+\ttime = rte_get_tsc_cycles();\n+\tlength = instr_meter_length_hbo(t, ip);\n+\tcolor_in = (enum rte_color)ip->meter.color_in_val;\n+\n+\tcolor_out = rte_meter_trtcm_color_aware_check(&m->m,\n+\t\t&m->profile->profile,\n+\t\ttime,\n+\t\tlength,\n+\t\tcolor_in);\n+\n+\tcolor_out &= m->color_mask;\n+\n+\tn_pkts = m->n_pkts[color_out];\n+\tn_bytes = m->n_bytes[color_out];\n+\n+\tinstr_meter_color_out_hbo_set(t, ip, color_out);\n+\n+\tm->n_pkts[color_out] = n_pkts + 1;\n+\tm->n_bytes[color_out] = n_bytes + length;\n+}\n+\n #endif\n",
    "prefixes": [
        "14/24"
    ]
}