qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Cédric Le Goater" <clg@kaod.org>
To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Matheus Ferst" <matheus.ferst@eldorado.org.br>,
	"Cédric Le Goater" <clg@kaod.org>
Subject: [PULL 39/87] tcg/tcg-op-gvec.c: Introduce tcg_gen_gvec_4i
Date: Wed,  2 Mar 2022 12:07:15 +0100	[thread overview]
Message-ID: <20220302110803.849505-40-clg@kaod.org> (raw)
In-Reply-To: <20220302110803.849505-1-clg@kaod.org>

From: Matheus Ferst <matheus.ferst@eldorado.org.br>

Following the implementation of tcg_gen_gvec_3i, add a four-vector and
immediate operand expansion method.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
Message-Id: <20220225210936.1749575-34-matheus.ferst@eldorado.org.br>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 include/tcg/tcg-op-gvec.h |  22 ++++++
 tcg/tcg-op-gvec.c         | 146 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 168 insertions(+)

diff --git a/include/tcg/tcg-op-gvec.h b/include/tcg/tcg-op-gvec.h
index da55fed8704a..28cafbcc5ce0 100644
--- a/include/tcg/tcg-op-gvec.h
+++ b/include/tcg/tcg-op-gvec.h
@@ -218,6 +218,25 @@ typedef struct {
     bool write_aofs;
 } GVecGen4;
 
+typedef struct {
+    /*
+     * Expand inline as a 64-bit or 32-bit integer. Only one of these will be
+     * non-NULL.
+     */
+    void (*fni8)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64, int64_t);
+    void (*fni4)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32, int32_t);
+    /* Expand inline with a host vector type.  */
+    void (*fniv)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec, TCGv_vec, int64_t);
+    /* Expand out-of-line helper w/descriptor, data in descriptor.  */
+    gen_helper_gvec_4 *fno;
+    /* The optional opcodes, if any, utilized by .fniv.  */
+    const TCGOpcode *opt_opc;
+    /* The vector element size, if applicable.  */
+    uint8_t vece;
+    /* Prefer i64 to v64.  */
+    bool prefer_i64;
+} GVecGen4i;
+
 void tcg_gen_gvec_2(uint32_t dofs, uint32_t aofs,
                     uint32_t oprsz, uint32_t maxsz, const GVecGen2 *);
 void tcg_gen_gvec_2i(uint32_t dofs, uint32_t aofs, uint32_t oprsz,
@@ -231,6 +250,9 @@ void tcg_gen_gvec_3i(uint32_t dofs, uint32_t aofs, uint32_t bofs,
                      const GVecGen3i *);
 void tcg_gen_gvec_4(uint32_t dofs, uint32_t aofs, uint32_t bofs, uint32_t cofs,
                     uint32_t oprsz, uint32_t maxsz, const GVecGen4 *);
+void tcg_gen_gvec_4i(uint32_t dofs, uint32_t aofs, uint32_t bofs, uint32_t cofs,
+                     uint32_t oprsz, uint32_t maxsz, int64_t c,
+                     const GVecGen4i *);
 
 /* Expand a specific vector operation.  */
 
diff --git a/tcg/tcg-op-gvec.c b/tcg/tcg-op-gvec.c
index ffe55e908f8a..079a761b0402 100644
--- a/tcg/tcg-op-gvec.c
+++ b/tcg/tcg-op-gvec.c
@@ -836,6 +836,30 @@ static void expand_4_i32(uint32_t dofs, uint32_t aofs, uint32_t bofs,
     tcg_temp_free_i32(t0);
 }
 
+static void expand_4i_i32(uint32_t dofs, uint32_t aofs, uint32_t bofs,
+                          uint32_t cofs, uint32_t oprsz, int32_t c,
+                          void (*fni)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32,
+                                      int32_t))
+{
+    TCGv_i32 t0 = tcg_temp_new_i32();
+    TCGv_i32 t1 = tcg_temp_new_i32();
+    TCGv_i32 t2 = tcg_temp_new_i32();
+    TCGv_i32 t3 = tcg_temp_new_i32();
+    uint32_t i;
+
+    for (i = 0; i < oprsz; i += 4) {
+        tcg_gen_ld_i32(t1, cpu_env, aofs + i);
+        tcg_gen_ld_i32(t2, cpu_env, bofs + i);
+        tcg_gen_ld_i32(t3, cpu_env, cofs + i);
+        fni(t0, t1, t2, t3, c);
+        tcg_gen_st_i32(t0, cpu_env, dofs + i);
+    }
+    tcg_temp_free_i32(t3);
+    tcg_temp_free_i32(t2);
+    tcg_temp_free_i32(t1);
+    tcg_temp_free_i32(t0);
+}
+
 /* Expand OPSZ bytes worth of two-operand operations using i64 elements.  */
 static void expand_2_i64(uint32_t dofs, uint32_t aofs, uint32_t oprsz,
                          bool load_dest, void (*fni)(TCGv_i64, TCGv_i64))
@@ -971,6 +995,30 @@ static void expand_4_i64(uint32_t dofs, uint32_t aofs, uint32_t bofs,
     tcg_temp_free_i64(t0);
 }
 
+static void expand_4i_i64(uint32_t dofs, uint32_t aofs, uint32_t bofs,
+                          uint32_t cofs, uint32_t oprsz, int64_t c,
+                          void (*fni)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64,
+                                      int64_t))
+{
+    TCGv_i64 t0 = tcg_temp_new_i64();
+    TCGv_i64 t1 = tcg_temp_new_i64();
+    TCGv_i64 t2 = tcg_temp_new_i64();
+    TCGv_i64 t3 = tcg_temp_new_i64();
+    uint32_t i;
+
+    for (i = 0; i < oprsz; i += 8) {
+        tcg_gen_ld_i64(t1, cpu_env, aofs + i);
+        tcg_gen_ld_i64(t2, cpu_env, bofs + i);
+        tcg_gen_ld_i64(t3, cpu_env, cofs + i);
+        fni(t0, t1, t2, t3, c);
+        tcg_gen_st_i64(t0, cpu_env, dofs + i);
+    }
+    tcg_temp_free_i64(t3);
+    tcg_temp_free_i64(t2);
+    tcg_temp_free_i64(t1);
+    tcg_temp_free_i64(t0);
+}
+
 /* Expand OPSZ bytes worth of two-operand operations using host vectors.  */
 static void expand_2_vec(unsigned vece, uint32_t dofs, uint32_t aofs,
                          uint32_t oprsz, uint32_t tysz, TCGType type,
@@ -1121,6 +1169,35 @@ static void expand_4_vec(unsigned vece, uint32_t dofs, uint32_t aofs,
     tcg_temp_free_vec(t0);
 }
 
+/*
+ * Expand OPSZ bytes worth of four-vector operands and an immediate operand
+ * using host vectors.
+ */
+static void expand_4i_vec(unsigned vece, uint32_t dofs, uint32_t aofs,
+                          uint32_t bofs, uint32_t cofs, uint32_t oprsz,
+                          uint32_t tysz, TCGType type, int64_t c,
+                          void (*fni)(unsigned, TCGv_vec, TCGv_vec,
+                                     TCGv_vec, TCGv_vec, int64_t))
+{
+    TCGv_vec t0 = tcg_temp_new_vec(type);
+    TCGv_vec t1 = tcg_temp_new_vec(type);
+    TCGv_vec t2 = tcg_temp_new_vec(type);
+    TCGv_vec t3 = tcg_temp_new_vec(type);
+    uint32_t i;
+
+    for (i = 0; i < oprsz; i += tysz) {
+        tcg_gen_ld_vec(t1, cpu_env, aofs + i);
+        tcg_gen_ld_vec(t2, cpu_env, bofs + i);
+        tcg_gen_ld_vec(t3, cpu_env, cofs + i);
+        fni(vece, t0, t1, t2, t3, c);
+        tcg_gen_st_vec(t0, cpu_env, dofs + i);
+    }
+    tcg_temp_free_vec(t3);
+    tcg_temp_free_vec(t2);
+    tcg_temp_free_vec(t1);
+    tcg_temp_free_vec(t0);
+}
+
 /* Expand a vector two-operand operation.  */
 void tcg_gen_gvec_2(uint32_t dofs, uint32_t aofs,
                     uint32_t oprsz, uint32_t maxsz, const GVecGen2 *g)
@@ -1533,6 +1610,75 @@ void tcg_gen_gvec_4(uint32_t dofs, uint32_t aofs, uint32_t bofs, uint32_t cofs,
     }
 }
 
+/* Expand a vector four-operand operation.  */
+void tcg_gen_gvec_4i(uint32_t dofs, uint32_t aofs, uint32_t bofs, uint32_t cofs,
+                     uint32_t oprsz, uint32_t maxsz, int64_t c,
+                     const GVecGen4i *g)
+{
+    const TCGOpcode *this_list = g->opt_opc ? : vecop_list_empty;
+    const TCGOpcode *hold_list = tcg_swap_vecop_list(this_list);
+    TCGType type;
+    uint32_t some;
+
+    check_size_align(oprsz, maxsz, dofs | aofs | bofs | cofs);
+    check_overlap_4(dofs, aofs, bofs, cofs, maxsz);
+
+    type = 0;
+    if (g->fniv) {
+        type = choose_vector_type(g->opt_opc, g->vece, oprsz, g->prefer_i64);
+    }
+    switch (type) {
+    case TCG_TYPE_V256:
+        /*
+         * Recall that ARM SVE allows vector sizes that are not a
+         * power of 2, but always a multiple of 16.  The intent is
+         * that e.g. size == 80 would be expanded with 2x32 + 1x16.
+         */
+        some = QEMU_ALIGN_DOWN(oprsz, 32);
+        expand_4i_vec(g->vece, dofs, aofs, bofs, cofs, some,
+                      32, TCG_TYPE_V256, c, g->fniv);
+        if (some == oprsz) {
+            break;
+        }
+        dofs += some;
+        aofs += some;
+        bofs += some;
+        cofs += some;
+        oprsz -= some;
+        maxsz -= some;
+        /* fallthru */
+    case TCG_TYPE_V128:
+        expand_4i_vec(g->vece, dofs, aofs, bofs, cofs, oprsz,
+                       16, TCG_TYPE_V128, c, g->fniv);
+        break;
+    case TCG_TYPE_V64:
+        expand_4i_vec(g->vece, dofs, aofs, bofs, cofs, oprsz,
+                      8, TCG_TYPE_V64, c, g->fniv);
+        break;
+
+    case 0:
+        if (g->fni8 && check_size_impl(oprsz, 8)) {
+            expand_4i_i64(dofs, aofs, bofs, cofs, oprsz, c, g->fni8);
+        } else if (g->fni4 && check_size_impl(oprsz, 4)) {
+            expand_4i_i32(dofs, aofs, bofs, cofs, oprsz, c, g->fni4);
+        } else {
+            assert(g->fno != NULL);
+            tcg_gen_gvec_4_ool(dofs, aofs, bofs, cofs,
+                               oprsz, maxsz, c, g->fno);
+            oprsz = maxsz;
+        }
+        break;
+
+    default:
+        g_assert_not_reached();
+    }
+    tcg_swap_vecop_list(hold_list);
+
+    if (oprsz < maxsz) {
+        expand_clr(dofs + oprsz, maxsz - oprsz);
+    }
+}
+
 /*
  * Expand specific vector operations.
  */
-- 
2.34.1



  parent reply	other threads:[~2022-03-02 11:40 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-02 11:06 [PULL 00/87] ppc queue Cédric Le Goater
2022-03-02 11:06 ` [PULL 01/87] hw/ppc/pnv: Determine ns16550's IRQ number from QOM property Cédric Le Goater
2022-03-02 11:06 ` [PULL 02/87] ppc/pnv: fix default PHB4 QOM hierarchy Cédric Le Goater
2022-03-02 11:06 ` [PULL 03/87] target/ppc: make power8-pmu.c CONFIG_TCG only Cédric Le Goater
2022-03-02 11:06 ` [PULL 04/87] target/ppc: finalize pre-EBB PMU logic Cédric Le Goater
2022-03-02 11:06 ` [PULL 05/87] target/ppc: add PPC_INTERRUPT_EBB and EBB exceptions Cédric Le Goater
2022-03-02 11:06 ` [PULL 06/87] target/ppc: trigger PERFM EBBs from power8-pmu.c Cédric Le Goater
2022-03-02 11:06 ` [PULL 07/87] target/ppc: Introduce TRANS*FLAGS macros Cédric Le Goater
2022-03-02 11:06 ` [PULL 08/87] target/ppc: moved vector even and odd multiplication to decodetree Cédric Le Goater
2022-03-02 11:06 ` [PULL 09/87] target/ppc: Moved vector multiply high and low " Cédric Le Goater
2022-03-02 11:06 ` [PULL 10/87] target/ppc: vmulh* instructions without helpers Cédric Le Goater
2022-03-02 11:06 ` [PULL 11/87] target/ppc: Implement vmsumcud instruction Cédric Le Goater
2022-03-02 11:06 ` [PULL 12/87] target/ppc: Implement vmsumudm instruction Cédric Le Goater
2022-03-02 11:06 ` [PULL 13/87] target/ppc: Move vexts[bhw]2[wd] to decodetree Cédric Le Goater
2022-03-02 11:06 ` [PULL 14/87] target/ppc: Implement vextsd2q Cédric Le Goater
2022-03-02 11:06 ` [PULL 15/87] target/ppc: Move Vector Compare Equal/Not Equal/Greater Than to decodetree Cédric Le Goater
2022-03-02 11:06 ` [PULL 16/87] target/ppc: Move Vector Compare Not Equal or Zero " Cédric Le Goater
2022-03-02 11:06 ` [PULL 17/87] target/ppc: Implement Vector Compare Equal Quadword Cédric Le Goater
2022-03-02 11:06 ` [PULL 18/87] target/ppc: Implement Vector Compare Greater Than Quadword Cédric Le Goater
2022-03-02 11:06 ` [PULL 19/87] target/ppc: Implement Vector Compare Quadword Cédric Le Goater
2022-03-02 11:06 ` [PULL 20/87] target/ppc: implement vstri[bh][lr] Cédric Le Goater
2022-03-02 11:06 ` [PULL 21/87] target/ppc: implement vclrlb Cédric Le Goater
2022-03-02 11:06 ` [PULL 22/87] target/ppc: implement vclrrb Cédric Le Goater
2022-03-02 11:06 ` [PULL 23/87] target/ppc: implement vcntmb[bhwd] Cédric Le Goater
2022-03-02 11:07 ` [PULL 24/87] target/ppc: implement vgnb Cédric Le Goater
2022-03-02 11:07 ` [PULL 25/87] target/ppc: move vs[lr][a][bhwd] to decodetree Cédric Le Goater
2022-03-02 11:07 ` [PULL 26/87] target/ppc: implement vslq Cédric Le Goater
2022-03-02 11:07 ` [PULL 27/87] target/ppc: implement vsrq Cédric Le Goater
2022-03-02 11:07 ` [PULL 28/87] target/ppc: implement vsraq Cédric Le Goater
2022-03-02 11:07 ` [PULL 29/87] target/ppc: move vrl[bhwd] to decodetree Cédric Le Goater
2022-03-02 11:07 ` [PULL 30/87] target/ppc: move vrl[bhwd]nm/vrl[bhwd]mi " Cédric Le Goater
2022-03-02 11:07 ` [PULL 31/87] target/ppc: implement vrlq Cédric Le Goater
2022-03-02 11:07 ` [PULL 32/87] target/ppc: implement vrlqnm Cédric Le Goater
2022-03-02 11:07 ` [PULL 33/87] target/ppc: implement vrlqmi Cédric Le Goater
2022-03-02 11:07 ` [PULL 34/87] target/ppc: Move vsel and vperm/vpermr to decodetree Cédric Le Goater
2022-03-02 11:07 ` [PULL 35/87] target/ppc: Move xxsel " Cédric Le Goater
2022-03-02 11:07 ` [PULL 36/87] target/ppc: move xxperm/xxpermr " Cédric Le Goater
2022-03-02 11:07 ` [PULL 37/87] target/ppc: Move xxpermdi " Cédric Le Goater
2022-03-02 11:07 ` [PULL 38/87] target/ppc: Implement xxpermx instruction Cédric Le Goater
2022-03-02 11:07 ` Cédric Le Goater [this message]
2022-03-02 11:07 ` [PULL 40/87] target/ppc: Implement xxeval Cédric Le Goater
2022-03-02 11:07 ` [PULL 41/87] target/ppc: Implement xxgenpcv[bhwd]m instruction Cédric Le Goater
2022-03-02 11:07 ` [PULL 42/87] target/ppc: move xs[n]madd[am][ds]p/xs[n]msub[am][ds]p to decodetree Cédric Le Goater
2022-03-02 11:07 ` [PULL 43/87] target/ppc: implement xs[n]maddqp[o]/xs[n]msubqp[o] Cédric Le Goater
2022-03-02 11:07 ` [PULL 44/87] target/ppc: Implement xvtlsbb instruction Cédric Le Goater
2022-03-02 11:07 ` [PULL 45/87] target/ppc: Remove xscmpnedp instruction Cédric Le Goater
2022-03-02 11:07 ` [PULL 46/87] target/ppc: Refactor VSX_SCALAR_CMP_DP Cédric Le Goater
2022-03-02 11:07 ` [PULL 47/87] target/ppc: Implement xscmp{eq,ge,gt}qp Cédric Le Goater
2022-03-02 11:07 ` [PULL 48/87] target/ppc: Move xscmp{eq,ge,gt}dp to decodetree Cédric Le Goater
2022-03-02 11:07 ` [PULL 49/87] target/ppc: Move xs{max, min}[cj]dp to use do_helper_XX3 Cédric Le Goater
2022-03-02 11:07 ` [PULL 50/87] target/ppc: Refactor VSX_MAX_MINC helper Cédric Le Goater
2022-03-02 11:07 ` [PULL 51/87] target/ppc: Implement xs{max,min}cqp Cédric Le Goater
2022-03-02 11:07 ` [PULL 52/87] target/ppc: Implement xvcvbf16spn and xvcvspbf16 instructions Cédric Le Goater
2022-03-02 11:07 ` [PULL 53/87] target/ppc: implement plxsd/pstxsd Cédric Le Goater
2022-03-02 11:07 ` [PULL 54/87] target/ppc: implement plxssp/pstxssp Cédric Le Goater
2022-03-02 11:07 ` [PULL 55/87] target/ppc: implement lxvr[bhwd]/stxvr[bhwd]x Cédric Le Goater
2022-03-02 11:07 ` [PULL 56/87] ppc/xive2: Introduce a XIVE2 core framework Cédric Le Goater
2022-03-02 11:07 ` [PULL 57/87] ppc/xive2: Introduce a presenter matching routine Cédric Le Goater
2022-03-02 11:07 ` [PULL 58/87] ppc/pnv: Add a XIVE2 controller to the POWER10 chip Cédric Le Goater
2022-03-02 11:07 ` [PULL 59/87] ppc/pnv: Add a OCC model for POWER10 Cédric Le Goater
2022-03-02 11:07 ` [PULL 60/87] ppc/pnv: Add POWER10 quads Cédric Le Goater
2022-03-02 11:07 ` [PULL 61/87] ppc/pnv: Add model for POWER10 PHB5 PCIe Host bridge Cédric Le Goater
2022-03-02 11:07 ` [PULL 62/87] ppc/pnv: Add a HOMER model to POWER10 Cédric Le Goater
2022-03-02 11:07 ` [PULL 63/87] ppc/psi: Add support for StoreEOI and 64k ESB pages (POWER10) Cédric Le Goater
2022-03-02 11:07 ` [PULL 64/87] ppc/xive2: Add support for notification injection on ESB pages Cédric Le Goater
2022-03-02 11:07 ` [PULL 65/87] ppc/xive: Add support for PQ state bits offload Cédric Le Goater
2022-03-02 11:07 ` [PULL 66/87] ppc/pnv: Add support for PQ offload on PHB5 Cédric Le Goater
2022-03-02 11:07 ` [PULL 67/87] ppc/pnv: Add support for PHB5 "Address-based trigger" mode Cédric Le Goater
2022-03-02 11:07 ` [PULL 68/87] pnv/xive2: Introduce new capability bits Cédric Le Goater
2022-03-02 11:07 ` [PULL 69/87] ppc/pnv: add XIVE Gen2 TIMA support Cédric Le Goater
2022-03-02 11:07 ` [PULL 70/87] pnv/xive2: Add support XIVE2 P9-compat mode (or Gen1) Cédric Le Goater
2022-03-02 11:07 ` [PULL 71/87] xive2: Add a get_config() handler for the router configuration Cédric Le Goater
2022-03-02 11:07 ` [PULL 72/87] pnv/xive2: Add support for automatic save&restore Cédric Le Goater
2022-03-02 11:07 ` [PULL 73/87] pnv/xive2: Add support for 8bits thread id Cédric Le Goater
2022-03-02 11:07 ` [PULL 74/87] hw/ppc/spapr.c: use g_autofree in spapr_dt_chosen() Cédric Le Goater
2022-03-02 11:07 ` [PULL 75/87] hw/ppc/spapr.c: fail early if no firmware found in machine_init() Cédric Le Goater
2022-03-02 11:07 ` [PULL 76/87] hw/ppc/spapr_caps.c: use g_autofree in spapr_cap_set_string() Cédric Le Goater
2022-03-02 11:07 ` [PULL 77/87] hw/ppc/spapr_caps.c: use g_autofree in spapr_cap_get_string() Cédric Le Goater
2022-03-02 11:07 ` [PULL 78/87] hw/ppc/spapr_caps.c: use g_autofree in spapr_caps_add_properties() Cédric Le Goater
2022-03-02 11:07 ` [PULL 79/87] hw/ppc/spapr_drc.c: use g_auto in spapr_dt_drc() Cédric Le Goater
2022-03-02 11:07 ` [PULL 80/87] hw/ppc/spapr_drc.c: use g_autofree in drc_realize() Cédric Le Goater
2022-03-02 11:07 ` [PULL 81/87] hw/ppc/spapr_drc.c: use g_autofree in drc_unrealize() Cédric Le Goater
2022-03-02 11:07 ` [PULL 82/87] hw/ppc/spapr_drc.c: use g_autofree in spapr_dr_connector_new() Cédric Le Goater
2022-03-02 11:07 ` [PULL 83/87] hw/ppc/spapr_drc.c: use g_autofree in spapr_drc_by_index() Cédric Le Goater
2022-03-02 11:08 ` [PULL 84/87] hw/ppc/spapr_numa.c: simplify spapr_numa_write_assoc_lookup_arrays() Cédric Le Goater
2022-03-02 11:08 ` [PULL 85/87] spapr_pci_nvlink2.c: use g_autofree in spapr_phb_nvgpu_ram_populate_dt() Cédric Le Goater
2022-03-02 11:08 ` [PULL 86/87] hw/ppc/spapr_rtas.c: use g_autofree in rtas_ibm_get_system_parameter() Cédric Le Goater
2022-03-02 11:08 ` [PULL 87/87] hw/ppc/spapr_vio.c: use g_autofree in spapr_dt_vdevice() Cédric Le Goater
2022-03-02 16:58 ` [PULL 00/87] ppc queue Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220302110803.849505-40-clg@kaod.org \
    --to=clg@kaod.org \
    --cc=matheus.ferst@eldorado.org.br \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).