From: Trevor Saunders <[email protected]>

gen_<name> still returns the pattern, or an rtx_insn * when the expand
emits a sequence.  gen_insn_<name> builds the uninserted insn with
make_*_insn_raw.


This originally started  with trying to return rtx_insn * from gen_*
only when it was generating a sequence of instructions so would be a
trivial return type change. However since plenty of target code
interchanges function pointers to gen_foo that generates a sequence with
one that only generates a pattern, I ended up creating a new set of
gen_insn_foo as well that returns the same sequence, or for a pattern
also generates the appropriate insn/call_insn/jump_insn wrapper for it,
that ay gen_insn_foo consistently returns rtx_insn * in a state that can
be passed to emit_*. ultimately I tend to think it may make sense to
switch more to the gen_insn_foo form on the theory its slightly faster
if the insn type is statically computed rather than emit_* calling
classify_insn at compile time. However I'm not sure if there is
general agreement with that direction, or other ideas? As can be seen in
the s390.cc changes this removes a few as_a casts and once more fully
converted to gen_insn_* helps more with that?

bootstrapped and regtested on ppc64le-linux-gnu, and run through
config-list.mk with the following patch, ok?

Thanks

Trev

gcc/ChangeLog:

        * emit-rtl.cc (make_insn_raw, make_debug_insn_raw,
        make_jump_insn_raw, make_call_insn_raw): Clear the next and
        previous links.  Export the jump and call makers.
        * genemit.cc (start_gen_insn): Take return_pat.
        (gen_insn_wrapper): New function.
        (gen_insn, gen_expand): Emit a gen_insn_NAME wrapper.
        * genflags.cc (gen_proto): Declare gen_insn_NAME, stub an elided
        pattern, and return rtx_insn * from a sequence expand.
        * gensupport.cc (get_make_insn_function): Rename from
        get_emit_function.  Return make_*_insn_raw.
        * gensupport.h (get_make_insn_function): Declare.
        * rtl.cc (classify_insn_vec, predicate_is_always_insn): New
        functions.
        (classify_insn): Classify PARALLEL and MATCH_PARALLEL from their
        elements.  Treat a const_int match_operand as an insn.
        * rtl.h (make_jump_insn_raw, make_call_insn_raw): Declare.
        * config/i386/i386-expand.cc: Use an rtx_insn * generator.
        * config/aarch64/aarch64-builtins.cc
        (aarch64_expand_builtin_rsqrt): Use an rtx_insn * generator.
        * config/arm/arm.cc (arm_block_set_unaligned_vect): Likewise.
        * config/avr/avr-passes.cc: Likewise.
        * config/avr/avr-protos.h (avr_emit3_fix_outputs): Likewise.
        * config/avr/avr.cc (avr_emit3_fix_outputs): Likewise.
        * config/i386/i386-protos.h (ix86_expand_reduc): Likewise.
        * config/i386/i386.md: Likewise.
        * config/i386/mmx.md: Likewise.
        * config/i386/sse.md: Likewise.
        * config/i386/sync.md: Likewise.
        * config/ia64/ia64.cc: Likewise.
        * config/loongarch/lasx.md: Likewise.
        * config/loongarch/loongarch-protos.h: Likewise.
        * config/loongarch/loongarch.cc: Likewise.
        * config/mips/loongson-mmi.md: Likewise.
        * config/mips/mips-protos.h: Likewise.
        * config/mips/mips.cc: Likewise.
        * config/rl78/rl78-protos.h: Likewise.
        * config/rl78/rl78.cc: Likewise.
        * config/rs6000/rs6000-string.cc: Likewise.
        * config/rs6000/rs6000.cc: Likewise.

Signed-off-by: Trevor Saunders <[email protected]>
---
 gcc/config/aarch64/aarch64-builtins.cc  |   2 +-
 gcc/config/arm/arm.cc                   |   2 +-
 gcc/config/avr/avr-passes.cc            |   5 +-
 gcc/config/avr/avr-protos.h             |   3 +-
 gcc/config/avr/avr.cc                   |   2 +-
 gcc/config/i386/i386-expand.cc          | 150 ++++++++++++------------
 gcc/config/i386/i386-protos.h           |   2 +-
 gcc/config/i386/i386.md                 |  14 +--
 gcc/config/i386/mmx.md                  |  14 +--
 gcc/config/i386/sse.md                  |  78 ++++++------
 gcc/config/i386/sync.md                 |   6 +-
 gcc/config/ia64/ia64.cc                 |  27 +++--
 gcc/config/loongarch/lasx.md            |   8 +-
 gcc/config/loongarch/loongarch-protos.h |   2 +-
 gcc/config/loongarch/loongarch.cc       |   7 +-
 gcc/config/mips/loongson-mmi.md         |  10 +-
 gcc/config/mips/mips-protos.h           |   4 +-
 gcc/config/mips/mips.cc                 |  14 ++-
 gcc/config/rl78/rl78-protos.h           |   4 +-
 gcc/config/rl78/rl78.cc                 |   4 +-
 gcc/config/rs6000/rs6000-string.cc      |  10 +-
 gcc/config/rs6000/rs6000.cc             |  42 +++----
 gcc/config/s390/s390.cc                 |   8 +-
 gcc/emit-rtl.cc                         |  12 +-
 gcc/genemit.cc                          |  57 +++++++--
 gcc/genflags.cc                         |  65 +++++++++-
 gcc/gensupport.cc                       |  13 +-
 gcc/gensupport.h                        |   2 +-
 gcc/rtl.cc                              |  97 +++++++++++----
 gcc/rtl.h                               |   2 +
 30 files changed, 413 insertions(+), 253 deletions(-)

diff --git a/gcc/config/aarch64/aarch64-builtins.cc 
b/gcc/config/aarch64/aarch64-builtins.cc
index 1d8baaef5c4..3df9d48c63f 100644
--- a/gcc/config/aarch64/aarch64-builtins.cc
+++ b/gcc/config/aarch64/aarch64-builtins.cc
@@ -3202,7 +3202,7 @@ aarch64_expand_builtin_rsqrt (int fcode, tree exp, rtx 
target)
   tree arg0 = CALL_EXPR_ARG (exp, 0);
   rtx op0 = expand_normal (arg0);
 
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
 
   switch (fcode)
     {
diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index 1b4f56ce4ee..6a525b65e60 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -31716,7 +31716,7 @@ arm_block_set_unaligned_vect (rtx dstbase,
   unsigned int i, nelt_v16, nelt_v8, nelt_mode;
   rtx dst, mem;
   rtx val_vec, reg;
-  rtx (*gen_func) (rtx, rtx);
+  rtx_insn *(*gen_func) (rtx, rtx);
   machine_mode mode;
   unsigned HOST_WIDE_INT v = value;
   unsigned int offset = 0;
diff --git a/gcc/config/avr/avr-passes.cc b/gcc/config/avr/avr-passes.cc
index d2b2d8421e0..403f57bf292 100644
--- a/gcc/config/avr/avr-passes.cc
+++ b/gcc/config/avr/avr-passes.cc
@@ -4132,8 +4132,9 @@ avr_optimize_casesi (rtx_insn *insns[5], rtx *xop)
 
   rtx reg = copy_to_mode_reg (mode, xop[11]);
 
-  rtx (*gen_add)(rtx,rtx,rtx) = QImode == mode ? gen_addqi3 : gen_addhi3;
-  rtx (*gen_cbranch)(rtx,rtx,rtx,rtx)
+  rtx_insn *(*gen_add) (rtx, rtx, rtx)
+    = QImode == mode ? gen_insn_addqi3 : gen_addhi3;
+  rtx_insn *(*gen_cbranch)(rtx,rtx,rtx,rtx)
     = QImode == mode ? gen_cbranchqi4 : gen_cbranchhi4;
 
   emit_insn (gen_add (reg, reg, gen_int_mode (-low_idx, mode)));
diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h
index 8a971c0813e..b2774bee9b8 100644
--- a/gcc/config/avr/avr-protos.h
+++ b/gcc/config/avr/avr-protos.h
@@ -166,7 +166,8 @@ regmask (machine_mode mode, unsigned regno)
 }
 
 extern void avr_fix_inputs (rtx*, unsigned, unsigned);
-extern bool avr_emit3_fix_outputs (rtx (*)(rtx,rtx,rtx), rtx*, unsigned, 
unsigned);
+extern bool avr_emit3_fix_outputs (rtx_insn *(*)(rtx, rtx, rtx),
+                                  rtx *, unsigned, unsigned);
 extern rtx avr_add_ccclobber (rtx_insn *);
 #define DONE_ADD_CCC emit (avr_add_ccclobber (curr_insn)); DONE;
 
diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index 2d0f9a8f31f..9108365e65f 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -15694,7 +15694,7 @@ avr_move_fixed_operands (rtx *op, rtx *hreg, unsigned 
mask)
    move the contents of respective pseudos to their hard regs.  */
 
 bool
-avr_emit3_fix_outputs (rtx (*gen)(rtx,rtx,rtx), rtx *op,
+avr_emit3_fix_outputs (rtx_insn *(*gen)(rtx,rtx,rtx), rtx *op,
                       unsigned opmask, unsigned rmask)
 {
   const int n = 3;
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 4980a04fdaf..7f8557145d8 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -806,7 +806,7 @@ static void
 ix86_avx256_split_vector_move_misalign (rtx op0, rtx op1)
 {
   rtx m;
-  rtx (*extract) (rtx, rtx, rtx);
+  rtx_insn *(*extract) (rtx, rtx, rtx);
   machine_mode mode;
 
   if ((MEM_P (op1) && !TARGET_AVX256_SPLIT_UNALIGNED_LOAD)
@@ -5136,7 +5136,7 @@ ix86_expand_int_sse_cmp (rtx dest, enum rtx_code code, 
rtx cop0, rtx cop1,
                  || !vector_all_ones_operand (optrue, data_mode)
                  || opfalse != CONST0_RTX (data_mode))))
        {
-         rtx (*gen) (rtx, rtx, rtx) = NULL;
+         rtx_insn *(*gen) (rtx, rtx, rtx) = NULL;
 
          switch (mode)
            {
@@ -5176,21 +5176,21 @@ ix86_expand_int_sse_cmp (rtx dest, enum rtx_code code, 
rtx cop0, rtx cop1,
              break;
            case E_V8QImode:
              if (code == GTU && TARGET_SSE2)
-               gen = gen_uminv8qi3;
+               gen = gen_insn_uminv8qi3;
              else if (code == GT && TARGET_SSE4_1)
-               gen = gen_sminv8qi3;
+               gen = gen_insn_sminv8qi3;
              break;
            case E_V4QImode:
              if (code == GTU && TARGET_SSE2)
-               gen = gen_uminv4qi3;
+               gen = gen_insn_uminv4qi3;
              else if (code == GT && TARGET_SSE4_1)
-               gen = gen_sminv4qi3;
+               gen = gen_insn_sminv4qi3;
              break;
            case E_V2QImode:
              if (code == GTU && TARGET_SSE2)
-               gen = gen_uminv2qi3;
+               gen = gen_insn_uminv2qi3;
              else if (code == GT && TARGET_SSE4_1)
-               gen = gen_sminv2qi3;
+               gen = gen_insn_sminv2qi3;
              break;
            case E_V8HImode:
              if (code == GTU && TARGET_SSE4_1)
@@ -5200,15 +5200,15 @@ ix86_expand_int_sse_cmp (rtx dest, enum rtx_code code, 
rtx cop0, rtx cop1,
              break;
            case E_V4HImode:
              if (code == GTU && TARGET_SSE4_1)
-               gen = gen_uminv4hi3;
+               gen = gen_insn_uminv4hi3;
              else if (code == GT && TARGET_SSE2)
-               gen = gen_sminv4hi3;
+               gen = gen_insn_sminv4hi3;
              break;
            case E_V2HImode:
              if (code == GTU && TARGET_SSE4_1)
-               gen = gen_uminv2hi3;
+               gen = gen_insn_uminv2hi3;
              else if (code == GT && TARGET_SSE2)
-               gen = gen_sminv2hi3;
+               gen = gen_insn_sminv2hi3;
              break;
            case E_V4SImode:
              if (TARGET_SSE4_1)
@@ -5216,7 +5216,7 @@ ix86_expand_int_sse_cmp (rtx dest, enum rtx_code code, 
rtx cop0, rtx cop1,
              break;
            case E_V2SImode:
              if (TARGET_SSE4_1)
-               gen = (code == GTU) ? gen_uminv2si3 : gen_sminv2si3;
+               gen = (code == GTU) ? gen_insn_uminv2si3 : gen_insn_sminv2si3;
              break;
            case E_V2DImode:
              if (TARGET_AVX512VL)
@@ -6709,7 +6709,7 @@ ix86_expand_ashl_const (rtx operand, int count, 
machine_mode mode)
     }
   else
     {
-      rtx (*insn)(rtx, rtx, rtx);
+      rtx_insn *(*insn)(rtx, rtx, rtx);
 
       insn = mode == DImode ? gen_ashlsi3 : gen_ashldi3;
       emit_insn (insn (operand, operand, GEN_INT (count)));
@@ -6719,7 +6719,7 @@ ix86_expand_ashl_const (rtx operand, int count, 
machine_mode mode)
 void
 ix86_split_ashl (rtx *operands, rtx scratch, machine_mode mode)
 {
-  rtx (*gen_ashl3)(rtx, rtx, rtx);
+  rtx_insn *(*gen_ashl3)(rtx, rtx, rtx);
   rtx (*gen_shld)(rtx, rtx, rtx);
   int half_width = GET_MODE_BITSIZE (mode) >> 1;
   machine_mode half_mode;
@@ -6800,9 +6800,9 @@ ix86_split_ashl (rtx *operands, rtx scratch, machine_mode 
mode)
         pentium4 a bit; no one else seems to care much either way.  */
       else
        {
-         rtx (*gen_lshr3)(rtx, rtx, rtx);
-         rtx (*gen_and3)(rtx, rtx, rtx);
-         rtx (*gen_xor3)(rtx, rtx, rtx);
+         rtx_insn *(*gen_lshr3)(rtx, rtx, rtx);
+         rtx_insn *(*gen_and3)(rtx, rtx, rtx);
+         rtx_insn *(*gen_xor3)(rtx, rtx, rtx);
          HOST_WIDE_INT bits;
          rtx x;
 
@@ -6874,7 +6874,7 @@ ix86_split_ashl (rtx *operands, rtx scratch, machine_mode 
mode)
 void
 ix86_split_ashr (rtx *operands, rtx scratch, machine_mode mode)
 {
-  rtx (*gen_ashr3)(rtx, rtx, rtx)
+  rtx_insn *(*gen_ashr3)(rtx, rtx, rtx)
     = mode == DImode ? gen_ashrsi3 : gen_ashrdi3;
   rtx (*gen_shrd)(rtx, rtx, rtx);
   int half_width = GET_MODE_BITSIZE (mode) >> 1;
@@ -6965,7 +6965,7 @@ ix86_split_ashr (rtx *operands, rtx scratch, machine_mode 
mode)
 void
 ix86_split_lshr (rtx *operands, rtx scratch, machine_mode mode)
 {
-  rtx (*gen_lshr3)(rtx, rtx, rtx)
+  rtx_insn *(*gen_lshr3)(rtx, rtx, rtx)
     = mode == DImode ? gen_lshrsi3 : gen_lshrdi3;
   rtx (*gen_shrd)(rtx, rtx, rtx);
   int half_width = GET_MODE_BITSIZE (mode) >> 1;
@@ -7110,7 +7110,7 @@ ix86_split_rshift_ndd (enum rtx_code code, rtx *operands, 
rtx scratch)
   gcc_assert (TARGET_APX_NDD);
   int half_width = GET_MODE_BITSIZE (TImode) >> 1;
   bool ashr_p = code == ASHIFTRT;
-  rtx (*gen_shr)(rtx, rtx, rtx) = ashr_p ? gen_ashrdi3
+  rtx_insn *(*gen_shr)(rtx, rtx, rtx) = ashr_p ? gen_ashrdi3
                                         : gen_lshrdi3;
 
   rtx low[2], high[2];
@@ -7221,7 +7221,7 @@ ix86_expand_v1ti_shift (enum rtx_code code, rtx 
operands[])
     {
       rtx tmp1 = ix86_expand_v1ti_to_ti (op1);
       rtx tmp2 = gen_reg_rtx (TImode);
-      rtx (*shift) (rtx, rtx, rtx)
+      rtx_insn *(*shift) (rtx, rtx, rtx)
            = (code == ASHIFT) ? gen_ashlti3 : gen_lshrti3;
       emit_insn (shift (tmp2, tmp1, operands[2]));
       rtx tmp3 = ix86_expand_ti_to_v1ti (tmp2);
@@ -7302,7 +7302,7 @@ ix86_expand_v1ti_rotate (enum rtx_code code, rtx 
operands[])
     {
       rtx tmp1 = ix86_expand_v1ti_to_ti (op1);
       rtx tmp2 = gen_reg_rtx (TImode);
-      rtx (*rotate) (rtx, rtx, rtx)
+      rtx_insn *(*rotate) (rtx, rtx, rtx)
            = (code == ROTATE) ? gen_rotlti3 : gen_rotrti3;
       emit_insn (rotate (tmp2, tmp1, operands[2]));
       rtx tmp3 = ix86_expand_ti_to_v1ti (tmp2);
@@ -18979,14 +18979,14 @@ ix86_expand_vector_init_interleave (machine_mode mode,
   machine_mode first_imode, second_imode, third_imode, inner_mode;
   int i, j;
   rtx op, op0, op1;
-  rtx (*gen_load_even) (rtx, rtx, rtx);
+  rtx_insn *(*gen_load_even) (rtx, rtx, rtx);
   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
 
   switch (mode)
     {
     case E_V8HFmode:
-      gen_load_even = gen_vec_interleave_lowv8hf;
+      gen_load_even = gen_insn_vec_interleave_lowv8hf;
       gen_interleave_first_low = gen_vec_interleave_lowv4si;
       gen_interleave_second_low = gen_vec_interleave_lowv2di;
       inner_mode = HFmode;
@@ -18995,7 +18995,7 @@ ix86_expand_vector_init_interleave (machine_mode mode,
       third_imode = VOIDmode;
       break;
     case E_V8BFmode:
-      gen_load_even = gen_vec_interleave_lowv8bf;
+      gen_load_even = gen_insn_vec_interleave_lowv8bf;
       gen_interleave_first_low = gen_vec_interleave_lowv4si;
       gen_interleave_second_low = gen_vec_interleave_lowv2di;
       inner_mode = BFmode;
@@ -21215,7 +21215,7 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx 
val, int elt)
       };
   int i, j, n;
   machine_mode mmode = VOIDmode;
-  rtx (*gen_blendm) (rtx, rtx, rtx, rtx);
+  rtx_insn *(*gen_blendm) (rtx, rtx, rtx, rtx);
 
   if (!IN_RANGE (elt, 0, GET_MODE_NUNITS (mode)))
     {
@@ -21500,7 +21500,7 @@ half:
       if (TARGET_AVX512F)
        {
          mmode = QImode;
-         gen_blendm = gen_avx512f_blendmv8df;
+         gen_blendm = gen_insn_avx512f_blendmv8df;
        }
       break;
 
@@ -21508,7 +21508,7 @@ half:
       if (TARGET_AVX512F)
        {
          mmode = QImode;
-         gen_blendm = gen_avx512f_blendmv8di;
+         gen_blendm = gen_insn_avx512f_blendmv8di;
        }
       break;
 
@@ -21516,7 +21516,7 @@ half:
       if (TARGET_AVX512F)
        {
          mmode = HImode;
-         gen_blendm = gen_avx512f_blendmv16sf;
+         gen_blendm = gen_insn_avx512f_blendmv16sf;
        }
       break;
 
@@ -21524,7 +21524,7 @@ half:
       if (TARGET_AVX512F)
        {
          mmode = HImode;
-         gen_blendm = gen_avx512f_blendmv16si;
+         gen_blendm = gen_insn_avx512f_blendmv16si;
        }
       break;
 
@@ -21532,21 +21532,21 @@ half:
       if (TARGET_AVX512BW)
        {
          mmode = SImode;
-         gen_blendm = gen_avx512bw_blendmv32hf;
+         gen_blendm = gen_insn_avx512bw_blendmv32hf;
        }
       break;
     case E_V32BFmode:
       if (TARGET_AVX512BW)
        {
          mmode = SImode;
-         gen_blendm = gen_avx512bw_blendmv32bf;
+         gen_blendm = gen_insn_avx512bw_blendmv32bf;
        }
       break;
     case E_V32HImode:
       if (TARGET_AVX512BW)
        {
          mmode = SImode;
-         gen_blendm = gen_avx512bw_blendmv32hi;
+         gen_blendm = gen_insn_avx512bw_blendmv32hi;
        }
       else if (TARGET_AVX512F)
        {
@@ -21560,7 +21560,7 @@ half:
       if (TARGET_AVX512BW)
        {
          mmode = DImode;
-         gen_blendm = gen_avx512bw_blendmv64qi;
+         gen_blendm = gen_insn_avx512bw_blendmv64qi;
        }
       else if (TARGET_AVX512F)
        {
@@ -22153,7 +22153,7 @@ emit_reduc_half (rtx dest, rtx src, int i)
    DEST is the destination; IN is the input vector.  */
 
 void
-ix86_expand_reduc (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
+ix86_expand_reduc (rtx_insn *(*fn) (rtx, rtx, rtx), rtx dest, rtx in)
 {
   rtx half, dst, vec = in;
   machine_mode mode = GET_MODE (in);
@@ -22539,7 +22539,7 @@ ix86_emit_i387_round (rtx op0, rtx op1)
   rtx res = gen_reg_rtx (outmode);
   rtx_code_label *jump_label = gen_label_rtx ();
   rtx (*floor_insn) (rtx, rtx);
-  rtx (*neg_insn) (rtx, rtx);
+  rtx_insn *(*neg_insn) (rtx, rtx);
   rtx_insn *insn;
   rtx tmp;
 
@@ -23520,7 +23520,7 @@ ix86_expand_round_sse4 (rtx op0, rtx op1)
   rtx e1, e2, res, half;
   const struct real_format *fmt;
   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
-  rtx (*gen_copysign) (rtx, rtx, rtx);
+  rtx_insn *(*gen_copysign) (rtx, rtx, rtx);
   rtx (*gen_round) (rtx, rtx, rtx);
 
   switch (mode)
@@ -25759,7 +25759,7 @@ static bool
 expand_vec_perm_interleave3 (struct expand_vec_perm_d *d)
 {
   unsigned i, nelt;
-  rtx (*gen) (rtx, rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx, rtx);
 
   if (d->one_operand_p)
     return false;
@@ -26141,7 +26141,7 @@ expand_vec_perm_psrlw_psllw_por (struct 
expand_vec_perm_d *d)
   unsigned i;
   rtx (*gen_shr) (rtx, rtx, rtx);
   rtx (*gen_shl) (rtx, rtx, rtx);
-  rtx (*gen_or) (rtx, rtx, rtx);
+  rtx_insn *(*gen_or) (rtx, rtx, rtx);
   machine_mode mode = VOIDmode;
 
   if (!TARGET_SSE2 || !d->one_operand_p)
@@ -26155,7 +26155,7 @@ expand_vec_perm_psrlw_psllw_por (struct 
expand_vec_perm_d *d)
       mode = V4HImode;
       gen_shr = gen_lshrv4hi3;
       gen_shl = gen_ashlv4hi3;
-      gen_or = gen_iorv4hi3;
+      gen_or = gen_insn_iorv4hi3;
       break;
     case E_V16QImode:
       mode = V8HImode;
@@ -26637,8 +26637,8 @@ expand_vec_perm_pslldq_psrldq_por (struct 
expand_vec_perm_d *d, bool pandn)
   bool clear_op0, clear_op1;
   unsigned inner_size;
   rtx op0, op1, dop1;
-  rtx (*gen_vec_shr) (rtx, rtx, rtx);
-  rtx (*gen_vec_shl) (rtx, rtx, rtx);
+  rtx_insn *(*gen_vec_shr) (rtx, rtx, rtx);
+  rtx_insn *(*gen_vec_shl) (rtx, rtx, rtx);
 
   /* pshufd can be used for V4SI/V2DI under TARGET_SSE2.  */
   if (!TARGET_SSE2 || (vmode != E_V16QImode && vmode != E_V8HImode))
@@ -26733,7 +26733,7 @@ expand_vec_perm_even_odd_pack (struct expand_vec_perm_d 
*d)
   int pblendw_i = 0;
   bool end_perm = false;
   machine_mode half_mode;
-  rtx (*gen_and) (rtx, rtx, rtx);
+  rtx_insn *(*gen_and) (rtx, rtx, rtx);
   rtx (*gen_pack) (rtx, rtx, rtx);
   rtx (*gen_shift) (rtx, rtx, rtx);
 
@@ -26749,7 +26749,7 @@ expand_vec_perm_even_odd_pack (struct expand_vec_perm_d 
*d)
       c = 0xffff;
       s = 16;
       half_mode = V2SImode;
-      gen_and = gen_andv2si3;
+      gen_and = gen_insn_andv2si3;
       gen_pack = gen_mmx_packusdw;
       gen_shift = gen_lshrv2si3;
       pblendw_i = 0x5;
@@ -26771,7 +26771,7 @@ expand_vec_perm_even_odd_pack (struct expand_vec_perm_d 
*d)
       c = 0xff;
       s = 8;
       half_mode = V4HImode;
-      gen_and = gen_andv4hi3;
+      gen_and = gen_insn_andv4hi3;
       gen_pack = gen_mmx_packuswb;
       gen_shift = gen_lshrv4hi3;
       break;
@@ -28069,9 +28069,9 @@ ix86_expand_vec_shift_qihi_constant (enum rtx_code code,
   rtx vec_const_and, vec_const_xor;
   rtx tmp, op1_subreg;
   rtx (*gen_shift) (rtx, rtx, rtx);
-  rtx (*gen_and) (rtx, rtx, rtx);
-  rtx (*gen_xor) (rtx, rtx, rtx);
-  rtx (*gen_sub) (rtx, rtx, rtx);
+  rtx_insn *(*gen_and) (rtx, rtx, rtx);
+  rtx_insn *(*gen_xor) (rtx, rtx, rtx);
+  rtx_insn *(*gen_sub) (rtx, rtx, rtx);
 
   /* Only optimize shift by constant.  */
   if (!CONST_INT_P (op2))
@@ -28327,7 +28327,7 @@ ix86_expand_vecop_qihi2 (enum rtx_code code, rtx dest, 
rtx op1, rtx op2)
   machine_mode himode, qimode = GET_MODE (dest);
   machine_mode wqimode;
   rtx qop1, qop2, hop1, hop2, hdest;
-  rtx (*gen_truncate)(rtx, rtx) = NULL;
+  rtx_insn *(*gen_truncate) (rtx, rtx) = NULL;
   bool op2vec = GET_MODE_CLASS (GET_MODE (op2)) == MODE_VECTOR_INT;
   bool uns_p = code != ASHIFTRT;
 
@@ -28355,7 +28355,7 @@ ix86_expand_vecop_qihi2 (enum rtx_code code, rtx dest, 
rtx op1, rtx op2)
       break;
     case E_V32QImode:
       himode = V32HImode;
-      gen_truncate = gen_truncv32hiv32qi2;
+      gen_truncate = gen_insn_truncv32hiv32qi2;
       break;
     default:
       gcc_unreachable ();
@@ -28405,8 +28405,8 @@ ix86_expand_vecop_qihi (enum rtx_code code, rtx dest, 
rtx op1, rtx op2)
 {
   machine_mode qimode = GET_MODE (dest);
   machine_mode himode;
-  rtx (*gen_il) (rtx, rtx, rtx);
-  rtx (*gen_ih) (rtx, rtx, rtx);
+  rtx_insn *(*gen_il) (rtx, rtx, rtx);
+  rtx_insn *(*gen_ih) (rtx, rtx, rtx);
   rtx op1_l, op1_h, op2_l, op2_h, res_l, res_h;
   bool op2vec = GET_MODE_CLASS (GET_MODE (op2)) == MODE_VECTOR_INT;
   struct expand_vec_perm_d d;
@@ -28449,17 +28449,17 @@ ix86_expand_vecop_qihi (enum rtx_code code, rtx dest, 
rtx op1, rtx op2)
       switch (qimode)
        {
        case E_V16QImode:
-         gen_il = gen_vec_interleave_lowv16qi;
-         gen_ih = gen_vec_interleave_highv16qi;
+         gen_il = gen_insn_vec_interleave_lowv16qi;
+         gen_ih = gen_insn_vec_interleave_highv16qi;
          break;
        case E_V32QImode:
-         gen_il = gen_avx2_interleave_lowv32qi;
-         gen_ih = gen_avx2_interleave_highv32qi;
+         gen_il = gen_insn_avx2_interleave_lowv32qi;
+         gen_ih = gen_insn_avx2_interleave_highv32qi;
          full_interleave = false;
          break;
        case E_V64QImode:
-         gen_il = gen_avx512bw_interleave_lowv64qi;
-         gen_ih = gen_avx512bw_interleave_highv64qi;
+         gen_il = gen_insn_avx512bw_interleave_lowv64qi;
+         gen_ih = gen_insn_avx512bw_interleave_highv64qi;
          full_interleave = false;
          break;
        default:
@@ -28848,7 +28848,7 @@ ix86_expand_sse2_mulvxdi3 (rtx op0, rtx op1, rtx op2)
   else
     {
       machine_mode nmode;
-      rtx (*umul) (rtx, rtx, rtx);
+      rtx_insn *(*umul) (rtx, rtx, rtx);
 
       if (mode == V2DImode)
        {
@@ -28901,7 +28901,7 @@ ix86_expand_umulvndi_highpart (rtx op0, rtx op1, rtx 
op2)
 {
   /* The following sequence can be used with SSE2.  */
   machine_mode mode = GET_MODE (op0);
-  rtx (*umul) (rtx, rtx, rtx);
+  rtx_insn *(*umul) (rtx, rtx, rtx);
   machine_mode nmode;
   if (mode == V2DImode)
     {
@@ -29213,7 +29213,7 @@ ix86_expand_pinsr (rtx *operands)
     case E_V1TImode:
       {
        machine_mode srcmode, dstmode;
-       rtx (*pinsr)(rtx, rtx, rtx, rtx);
+       rtx_insn *(*pinsr)(rtx, rtx, rtx, rtx);
        rtx d;
 
        if (!int_mode_for_size (size, 0).exists (&srcmode))
@@ -29225,21 +29225,21 @@ ix86_expand_pinsr (rtx *operands)
            if (!TARGET_SSE4_1)
              return false;
            dstmode = V16QImode;
-           pinsr = gen_sse4_1_pinsrb;
+           pinsr = gen_insn_sse4_1_pinsrb;
            break;
 
          case E_HImode:
            if (!TARGET_SSE2)
              return false;
            dstmode = V8HImode;
-           pinsr = gen_sse2_pinsrw;
+           pinsr = gen_insn_sse2_pinsrw;
            break;
 
          case E_SImode:
            if (!TARGET_SSE4_1)
              return false;
            dstmode = V4SImode;
-           pinsr = gen_sse4_1_pinsrd;
+           pinsr = gen_insn_sse4_1_pinsrd;
            break;
 
          case E_DImode:
@@ -29247,7 +29247,7 @@ ix86_expand_pinsr (rtx *operands)
            if (!TARGET_SSE4_1)
              return false;
            dstmode = V2DImode;
-           pinsr = gen_sse4_1_pinsrq;
+           pinsr = gen_insn_sse4_1_pinsrq;
            break;
 
          default:
@@ -29403,8 +29403,8 @@ ix86_expand_cmpxchg_loop (rtx *ptarget_bool, rtx 
target_val,
   rtx_code_label *cmp_label = NULL;
   rtx_code_label *done_label = NULL;
   rtx target_bool = NULL_RTX, new_mem = NULL_RTX;
-  rtx (*gen) (rtx, rtx, rtx, rtx, rtx) = NULL;
-  rtx (*gendw) (rtx, rtx, rtx, rtx, rtx, rtx) = NULL;
+  rtx_insn *(*gen) (rtx, rtx, rtx, rtx, rtx) = NULL;
+  rtx_insn *(*gendw) (rtx, rtx, rtx, rtx, rtx, rtx) = NULL;
   machine_mode mode = GET_MODE (target_val), hmode = mode;
 
   if (*ptarget_bool == NULL)
@@ -29422,26 +29422,26 @@ ix86_expand_cmpxchg_loop (rtx *ptarget_bool, rtx 
target_val,
   switch (mode)
     {
     case E_TImode:
-      gendw = gen_atomic_compare_and_swapti_doubleword;
+      gendw = gen_insn_atomic_compare_and_swapti_doubleword;
       hmode = DImode;
       break;
     case E_DImode:
       if (doubleword)
        {
-         gendw = gen_atomic_compare_and_swapdi_doubleword;
+         gendw = gen_insn_atomic_compare_and_swapdi_doubleword;
          hmode = SImode;
        }
       else
-       gen = gen_atomic_compare_and_swapdi_1;
+       gen = gen_insn_atomic_compare_and_swapdi_1;
       break;
     case E_SImode:
-      gen = gen_atomic_compare_and_swapsi_1;
+      gen = gen_insn_atomic_compare_and_swapsi_1;
       break;
     case E_HImode:
-      gen = gen_atomic_compare_and_swaphi_1;
+      gen = gen_insn_atomic_compare_and_swaphi_1;
       break;
     case E_QImode:
-      gen = gen_atomic_compare_and_swapqi_1;
+      gen = gen_insn_atomic_compare_and_swapqi_1;
       break;
     default:
       gcc_unreachable ();
@@ -30666,7 +30666,7 @@ ix86_expand_bitreverse (rtx dest, rtx src)
        }
       rtx temp4 = gen_reg_rtx (GET_MODE (target));
       rtx temp5 = gen_reg_rtx (GET_MODE (target));
-      rtx (*gen_bswap) (rtx, rtx)
+      rtx_insn *(*gen_bswap) (rtx, rtx)
        = mode == TImode ? gen_bswapdi2 : gen_bswapsi2;
       emit_insn (gen_bswap (temp4, target));
       emit_insn (gen_bswap (temp5, temp1));
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 8ac329a716a..377514eb585 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -303,7 +303,7 @@ extern void ix86_expand_vector_init (bool, rtx, rtx);
 extern void ix86_expand_vector_set (bool, rtx, rtx, int);
 extern void ix86_expand_vector_set_var (rtx, rtx, rtx);
 extern void ix86_expand_vector_extract (bool, rtx, rtx, int);
-extern void ix86_expand_reduc (rtx (*)(rtx, rtx, rtx), rtx, rtx);
+extern void ix86_expand_reduc (rtx_insn *(*)(rtx, rtx, rtx), rtx, rtx);
 
 extern void ix86_expand_vec_extract_even_odd (rtx, rtx, rtx, unsigned);
 extern bool ix86_expand_pextr (rtx *);
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 2d2e620713f..ab3cb9134aa 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -19124,7 +19124,7 @@
 
   operands[4] = gen_reg_rtx (QImode);
 
-  rtx (*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
+  rtx_insn *(*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
   emit_insn (insn (operands[4], operands[2]));
 }
   [(set_attr "isa" "*,bmi2")])
@@ -19154,7 +19154,7 @@
 
   operands[4] = gen_reg_rtx (QImode);
 
-  rtx (*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
+  rtx_insn *(*insn)(rtx, rtx) = (cnt == 0) ? gen_negqi2 : gen_one_cmplqi2;
   emit_insn (insn (operands[4], operands[2]));
 }
   [(set_attr "isa" "*,bmi2")])
@@ -19265,8 +19265,8 @@
       rtx tmp_hi = gen_reg_rtx (DImode);
       emit_move_insn (tmp_lo, src_lo);
       emit_move_insn (tmp_hi, src_hi);
-      rtx (*shiftd) (rtx, rtx, rtx)
-           = (<CODE> == ROTATE) ? gen_x86_64_shld : gen_x86_64_shrd;
+      rtx_insn *(*shiftd) (rtx, rtx, rtx)
+           = (<CODE> == ROTATE) ? gen_insn_x86_64_shld : gen_insn_x86_64_shrd;
       emit_insn (shiftd (tmp_lo, src_hi, amount));
       emit_insn (shiftd (tmp_hi, src_lo, amount));
       rtx dst_lo = gen_lowpart (DImode, operands[0]);
@@ -25291,7 +25291,7 @@
    (use (match_operand:MODEF 2 "general_operand"))]
   "TARGET_USE_FANCY_MATH_387"
 {
-  rtx (*gen_truncxf) (rtx, rtx);
+  rtx_insn *(*gen_truncxf) (rtx, rtx);
 
   rtx_code_label *label = gen_label_rtx ();
 
@@ -25310,9 +25310,9 @@
   /* Truncate the result properly for strict SSE math.  */
   if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
       && !TARGET_MIX_SSE_I387)
-    gen_truncxf = gen_truncxf<mode>2;
+    gen_truncxf = gen_insn_truncxf<mode>2;
   else
-    gen_truncxf = gen_truncxf<mode>2_i387_noop_unspec;
+    gen_truncxf = gen_insn_truncxf<mode>2_i387_noop_unspec;
 
   emit_insn (gen_truncxf (operands[0], op1));
   DONE;
diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
index 96e173efaa5..7dce82eecfd 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -3050,7 +3050,7 @@
   rtx op1 = gen_reg_rtx (V8HImode);
   rtx op0 = gen_reg_rtx (V8HFmode);
 
-  rtx (*gen_movd_sse) (rtx, rtx)
+  rtx_insn *(*gen_movd_sse) (rtx, rtx)
     = gen_mov<mov_to_sse_suffix>_<mmxintvecmodelower>_to_sse;
   emit_insn (gen_movd_sse (op1, operands[1]));
 
@@ -6570,7 +6570,7 @@
  "TARGET_MMX_WITH_SSE"
 {
   rtx tmp = gen_reg_rtx (<MODE>mode);
-  ix86_expand_reduc (gen_<code><mode>3, tmp, operands[1]);
+  ix86_expand_reduc (gen_insn_<code><mode>3, tmp, operands[1]);
   emit_insn (gen_vec_extract<mode><mmxscalarmodelower> (operands[0],
                                                       tmp, const0_rtx));
   DONE;
@@ -6610,7 +6610,7 @@
  "TARGET_MMX_WITH_SSE"
 {
   rtx tmp = gen_reg_rtx (V4HImode);
-  ix86_expand_reduc (gen_addv4hi3, tmp, operands[1]);
+  ix86_expand_reduc (gen_insn_addv4hi3, tmp, operands[1]);
   emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
   DONE;
 })
@@ -6622,7 +6622,7 @@
   "TARGET_MMX_WITH_SSE"
 {
   rtx tmp = gen_reg_rtx (V4HImode);
-  ix86_expand_reduc (gen_<code>v4hi3, tmp, operands[1]);
+  ix86_expand_reduc (gen_insn_<code>v4hi3, tmp, operands[1]);
   emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
   DONE;
 })
@@ -6634,7 +6634,7 @@
   "TARGET_SSE4_1"
 {
   rtx tmp = gen_reg_rtx (V4QImode);
-  ix86_expand_reduc (gen_<code>v4qi3, tmp, operands[1]);
+  ix86_expand_reduc (gen_insn_<code>v4qi3, tmp, operands[1]);
   emit_insn (gen_vec_extractv4qiqi (operands[0], tmp, const0_rtx));
   DONE;
 })
@@ -6646,7 +6646,7 @@
   "TARGET_MMX_WITH_SSE && TARGET_SSE4_1"
 {
   rtx tmp = gen_reg_rtx (V4HImode);
-  ix86_expand_reduc (gen_<code>v4hi3, tmp, operands[1]);
+  ix86_expand_reduc (gen_insn_<code>v4hi3, tmp, operands[1]);
   emit_insn (gen_vec_extractv4hihi (operands[0], tmp, const0_rtx));
   DONE;
 })
@@ -6658,7 +6658,7 @@
   "TARGET_SSE4_1"
 {
   rtx tmp = gen_reg_rtx (V4QImode);
-  ix86_expand_reduc (gen_<code>v4qi3, tmp, operands[1]);
+  ix86_expand_reduc (gen_insn_<code>v4qi3, tmp, operands[1]);
   emit_insn (gen_vec_extractv4qiqi (operands[0], tmp, const0_rtx));
   DONE;
 })
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 3a445c9746d..853ecddb359 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -7965,7 +7965,7 @@
   ""
 {
   rtx tem;
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
   if (<MODE>mode != V8HFmode)
     {
       tem = gen_reg_rtx (<ssehalfvecmode>mode);
@@ -7977,7 +7977,7 @@
     {
       tem = force_reg (V8HFmode, operands[1]);
       tem = lowpart_subreg (V4HFmode, tem, V8HFmode);
-      gen = gen_extendv4hfv4sf2;
+      gen = gen_insn_extendv4hfv4sf2;
     }
 
   emit_insn (gen (operands[0], tem));
@@ -7990,7 +7990,7 @@
   ""
 {
   rtx tem;
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
   if (<MODE>mode != V8HFmode)
     {
       tem = gen_reg_rtx (<ssehalfvecmode>mode);
@@ -8009,7 +8009,7 @@
       emit_move_insn (tem,
                      gen_rtx_VEC_SELECT (V8HFmode, operands[1], selector));
       tem = lowpart_subreg (V4HFmode, tem, V8HFmode);
-      gen = gen_extendv4hfv4sf2;
+      gen = gen_insn_extendv4hfv4sf2;
     }
 
   emit_insn (gen (operands[0], tem));
@@ -10002,12 +10002,12 @@
 {
   rtx r1 = gen_reg_rtx (<vpckfloat_temp_mode>mode);
   rtx r2 = gen_reg_rtx (<vpckfloat_temp_mode>mode);
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
 
   if (<MODE>mode == V2DImode)
     gen = gen_avx512dq_float<floatunssuffix>v2div2sf2;
   else
-    gen = gen_float<floatunssuffix><mode><vpckfloat_op_mode>2;
+    gen = gen_insn_float<floatunssuffix><mode><vpckfloat_op_mode>2;
   emit_insn (gen (r1, operands[1]));
   emit_insn (gen (r2, operands[2]));
   if (<MODE>mode == V2DImode)
@@ -10027,12 +10027,12 @@
 {
   rtx r1 = gen_reg_rtx (<vpckfloat_temp_mode>mode);
   rtx r2 = gen_reg_rtx (<vpckfloat_temp_mode>mode);
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
 
   if (<MODE>mode == V4SImode)
     gen = gen_avx512fp16_float<floatunssuffix>v4siv4hf2;
   else
-    gen = gen_float<floatunssuffix><mode><vpckfloat_op_mode>2;
+    gen = gen_insn_float<floatunssuffix><mode><vpckfloat_op_mode>2;
   emit_insn (gen (r1, operands[1]));
   emit_insn (gen (r2, operands[2]));
   if (<MODE>mode == V4SImode)
@@ -10559,17 +10559,17 @@
   "TARGET_AVX512DQ"
 {
   rtx tem = operands[1];
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
 
   if (<MODE>mode != V4SFmode)
     {
       tem = gen_reg_rtx (<ssehalfvecmode>mode);
       emit_insn (gen_vec_extract_lo_<vunpckfixt_extract_mode> (tem,
                                                               operands[1]));
-      gen = 
gen_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
+gen = gen_insn_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
     }
   else
-    gen = gen_avx512dq_fix<fixunssuffix>_truncv2sfv2di2;
+    gen = gen_insn_avx512dq_fix<fixunssuffix>_truncv2sfv2di2;
 
   emit_insn (gen (operands[0], tem));
   DONE;
@@ -10582,20 +10582,20 @@
   "TARGET_AVX512DQ"
 {
   rtx tem;
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
 
   if (<MODE>mode != V4SFmode)
     {
       tem = gen_reg_rtx (<ssehalfvecmode>mode);
       emit_insn (gen_vec_extract_hi_<vunpckfixt_extract_mode> (tem,
                                                               operands[1]));
-      gen = 
gen_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
+gen = gen_insn_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
     }
   else
     {
       tem = gen_reg_rtx (V4SFmode);
       emit_insn (gen_avx_vpermilv4sf (tem, operands[1], GEN_INT (0x4e)));
-      gen = gen_avx512dq_fix<fixunssuffix>_truncv2sfv2di2;
+      gen = gen_insn_avx512dq_fix<fixunssuffix>_truncv2sfv2di2;
     }
 
   emit_insn (gen (operands[0], tem));
@@ -10609,16 +10609,16 @@
   "TARGET_AVX512FP16"
 {
   rtx tem = operands[1];
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
   if (<MODE>mode != V8HFmode)
     {
       tem = gen_reg_rtx (<ssehalfvecmode>mode);
       emit_insn (gen_vec_extract_lo_<vunpckfixt_extract_mode> (tem,
                                                               operands[1]));
-      gen = 
gen_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
+gen = gen_insn_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
     }
   else
-    gen = gen_avx512fp16_fix<fixunssuffix>_trunc<vunpckfixt_model>2;
+    gen = gen_insn_avx512fp16_fix<fixunssuffix>_trunc<vunpckfixt_model>2;
 
   emit_insn (gen (operands[0], tem));
   DONE;
@@ -10631,13 +10631,13 @@
   "TARGET_AVX512FP16"
 {
   rtx tem = operands[1];
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
   if (<MODE>mode != V8HFmode)
     {
       tem = gen_reg_rtx (<ssehalfvecmode>mode);
       emit_insn (gen_vec_extract_hi_<vunpckfixt_extract_mode> (tem,
                                                               operands[1]));
-      gen = 
gen_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
+gen = gen_insn_fix<fixunssuffix>_trunc<ssehalfvecmodelower><vunpckfixt_model>2;
     }
   else
     {
@@ -10649,7 +10649,7 @@
       rtx selector = gen_rtx_PARALLEL (VOIDmode, tmp);
       emit_move_insn (tem,
                     gen_rtx_VEC_SELECT (V8HFmode, operands[1], selector));
-      gen = gen_avx512fp16_fix<fixunssuffix>_trunc<vunpckfixt_model>2;
+      gen = gen_insn_avx512fp16_fix<fixunssuffix>_trunc<vunpckfixt_model>2;
     }
 
   emit_insn (gen (operands[0], tem));
@@ -11550,7 +11550,7 @@
 {
   rtx r1 = gen_reg_rtx (<vpckfloat_temp_mode>mode);
   rtx r2 = gen_reg_rtx (<vpckfloat_temp_mode>mode);
-  rtx (*gen) (rtx, rtx);
+  rtx_insn *(*gen) (rtx, rtx);
 
   if (<MODE>mode == V4SFmode)
     gen = gen_f16c_truncv4sfv8hf2;
@@ -13533,7 +13533,7 @@
    (match_operand:QI 4 "register_operand")]
   "TARGET_AVX512F"
 {
-  rtx (*insn)(rtx, rtx, rtx, rtx);
+  rtx_insn *(*insn)(rtx, rtx, rtx, rtx);
   rtx dest = operands[0];
 
   if (MEM_P (dest) && !rtx_equal_p (dest, operands[3]))
@@ -13542,10 +13542,10 @@
   switch (INTVAL (operands[2]))
     {
     case 0:
-      insn = gen_vec_extract_lo_<mode>_mask;
+      insn = gen_insn_vec_extract_lo_<mode>_mask;
       break;
     case 1:
-      insn = gen_vec_extract_hi_<mode>_mask;
+      insn = gen_insn_vec_extract_hi_<mode>_mask;
       break;
     default:
       gcc_unreachable ();
@@ -13685,7 +13685,7 @@
    (match_operand:QI 4 "register_operand")]
   "TARGET_AVX512VL"
 {
-  rtx (*insn)(rtx, rtx, rtx, rtx);
+  rtx_insn *(*insn)(rtx, rtx, rtx, rtx);
   rtx dest = operands[0];
 
   if (MEM_P (dest)
@@ -13702,10 +13702,10 @@
   switch (INTVAL (operands[2]))
     {
     case 0:
-      insn = gen_vec_extract_lo_<mode>_mask;
+      insn = gen_insn_vec_extract_lo_<mode>_mask;
       break;
     case 1:
-      insn = gen_vec_extract_hi_<mode>_mask;
+      insn = gen_insn_vec_extract_hi_<mode>_mask;
       break;
     default:
       gcc_unreachable ();
@@ -13723,15 +13723,15 @@
    (match_operand:SI 2 "const_0_to_1_operand")]
   "TARGET_AVX"
 {
-  rtx (*insn)(rtx, rtx);
+  rtx_insn *(*insn)(rtx, rtx);
 
   switch (INTVAL (operands[2]))
     {
     case 0:
-      insn = gen_vec_extract_lo_<mode>;
+      insn = gen_insn_vec_extract_lo_<mode>;
       break;
     case 1:
-      insn = gen_vec_extract_hi_<mode>;
+      insn = gen_insn_vec_extract_hi_<mode>;
       break;
     default:
       gcc_unreachable ();
@@ -28141,7 +28141,7 @@
   if (TARGET_XOP && <MODE>mode == V16QImode)
     {
       bool negate = false;
-      rtx (*gen) (rtx, rtx, rtx);
+      rtx_insn *(*gen) (rtx, rtx, rtx);
       rtx tmp, par;
       int i;
 
@@ -28163,7 +28163,9 @@
       if (negate)
         emit_insn (gen_negv16qi2 (tmp, tmp));
 
-      gen = (<CODE> == LSHIFTRT ? gen_xop_shlv16qi3 : gen_xop_shav16qi3);
+      gen = ((<CODE> == LSHIFTRT)
+            ? gen_insn_xop_shlv16qi3
+            : gen_insn_xop_shav16qi3);
       emit_insn (gen (operands[0], operands[1], tmp));
     }
   else if (TARGET_GFNI && CONST_INT_P (operands[2])
@@ -29732,15 +29734,15 @@
    (match_operand:<avx512fmaskmode> 5 "register_operand")]
   "TARGET_AVX512VL"
 {
-  rtx (*insn)(rtx, rtx, rtx, rtx, rtx);
+  rtx_insn *(*insn)(rtx, rtx, rtx, rtx, rtx);
 
   switch (INTVAL (operands[3]))
     {
     case 0:
-      insn = gen_vec_set_lo_<mode>_mask;
+      insn = gen_insn_vec_set_lo_<mode>_mask;
       break;
     case 1:
-      insn = gen_vec_set_hi_<mode>_mask;
+      insn = gen_insn_vec_set_hi_<mode>_mask;
       break;
     default:
       gcc_unreachable ();
@@ -29758,15 +29760,15 @@
    (match_operand:SI 3 "const_0_to_1_operand")]
   "TARGET_AVX"
 {
-  rtx (*insn)(rtx, rtx, rtx);
+  rtx_insn *(*insn)(rtx, rtx, rtx);
 
   switch (INTVAL (operands[3]))
     {
     case 0:
-      insn = gen_vec_set_lo_<mode>;
+      insn = gen_insn_vec_set_lo_<mode>;
       break;
     case 1:
-      insn = gen_vec_set_hi_<mode>;
+      insn = gen_insn_vec_set_hi_<mode>;
       break;
     default:
       gcc_unreachable ();
diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md
index 19bf1757aee..dce2a308f64 100644
--- a/gcc/config/i386/sync.md
+++ b/gcc/config/i386/sync.md
@@ -125,15 +125,15 @@
      enough not to require barriers of any kind.  */
   if (is_mm_seq_cst (model))
     {
-      rtx (*mfence_insn)(rtx);
+      rtx_insn *(*mfence_insn)(rtx);
       rtx mem;
 
       if ((TARGET_64BIT || TARGET_SSE2)
          && (optimize_function_for_size_p (cfun)
              || !TARGET_AVOID_MFENCE))
-       mfence_insn = gen_mfence_sse2;
+       mfence_insn = gen_insn_mfence_sse2;
       else
-       mfence_insn = gen_mfence_nosse;
+       mfence_insn = gen_insn_mfence_nosse;
 
       mem = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
       MEM_VOLATILE_P (mem) = 1;
diff --git a/gcc/config/ia64/ia64.cc b/gcc/config/ia64/ia64.cc
index 221388c43c8..cba2b4ec6cd 100644
--- a/gcc/config/ia64/ia64.cc
+++ b/gcc/config/ia64/ia64.cc
@@ -189,11 +189,11 @@ static void ia64_compute_frame_size (HOST_WIDE_INT);
 static void setup_spill_pointers (int, rtx, HOST_WIDE_INT);
 static void finish_spill_pointers (void);
 static rtx spill_restore_mem (rtx, HOST_WIDE_INT);
-static void do_spill (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT, rtx);
-static void do_restore (rtx (*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT);
-static rtx gen_movdi_x (rtx, rtx, rtx);
-static rtx gen_fr_spill_x (rtx, rtx, rtx);
-static rtx gen_fr_restore_x (rtx, rtx, rtx);
+static void do_spill (rtx_insn *(*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT, rtx);
+static void do_restore (rtx_insn *(*)(rtx, rtx, rtx), rtx, HOST_WIDE_INT);
+static rtx_insn *gen_movdi_x (rtx, rtx, rtx);
+static rtx_insn *gen_fr_spill_x (rtx, rtx, rtx);
+static rtx_insn *gen_fr_restore_x (rtx, rtx, rtx);
 
 static void ia64_option_override (void);
 static bool ia64_can_eliminate (const int, const int);
@@ -3208,7 +3208,7 @@ spill_restore_mem (rtx reg, HOST_WIDE_INT cfa_off)
 }
 
 static void
-do_spill (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off,
+do_spill (rtx_insn *(*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off,
          rtx frame_reg)
 {
   int iter = spill_fill_data.next_iter;
@@ -3250,7 +3250,8 @@ do_spill (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, 
HOST_WIDE_INT cfa_off,
 }
 
 static void
-do_restore (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, HOST_WIDE_INT cfa_off)
+do_restore (rtx_insn *(*move_fn) (rtx, rtx, rtx), rtx reg,
+           HOST_WIDE_INT cfa_off)
 {
   int iter = spill_fill_data.next_iter;
   rtx_insn *insn;
@@ -3264,22 +3265,22 @@ do_restore (rtx (*move_fn) (rtx, rtx, rtx), rtx reg, 
HOST_WIDE_INT cfa_off)
    exist so that we can give gr_spill/gr_fill the offset they need and
    use a consistent function interface.  */
 
-static rtx
+static rtx_insn *
 gen_movdi_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
 {
-  return gen_movdi (dest, src);
+  return gen_insn_movdi (dest, src);
 }
 
-static rtx
+static rtx_insn *
 gen_fr_spill_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
 {
-  return gen_fr_spill (dest, src);
+  return gen_insn_fr_spill (dest, src);
 }
 
-static rtx
+static rtx_insn *
 gen_fr_restore_x (rtx dest, rtx src, rtx offset ATTRIBUTE_UNUSED)
 {
-  return gen_fr_restore (dest, src);
+  return gen_insn_fr_restore (dest, src);
 }
 
 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
diff --git a/gcc/config/loongarch/lasx.md b/gcc/config/loongarch/lasx.md
index 23ba70c97dc..d0cdb8d4378 100644
--- a/gcc/config/loongarch/lasx.md
+++ b/gcc/config/loongarch/lasx.md
@@ -3570,9 +3570,9 @@
    (const_int zero_one)]
   "ISA_HAS_LASX"
 {
-  rtx (*fn_even) (rtx, rtx, rtx) =
+rtx_insn *(*fn_even) (rtx, rtx, rtx) =
 gen_lasx_xv<optab>wev_<dlasxfmt>_<lasxfmt><u>;
-  rtx (*fn_odd) (rtx, rtx, rtx) =
+rtx_insn *(*fn_odd) (rtx, rtx, rtx) =
 gen_lasx_xv<optab>wod_<dlasxfmt>_<lasxfmt><u>;
   loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
                         <zero_one>, fn_even, fn_odd);
@@ -3587,9 +3587,9 @@ gen_lasx_xv<optab>wod_<dlasxfmt>_<lasxfmt><u>;
    (const_int zero_one)]
   "ISA_HAS_LASX"
 {
-  rtx (*fn_even) (rtx, rtx, rtx) =
+rtx_insn *(*fn_even) (rtx, rtx, rtx) =
 gen_lasx_xvmulwev_<dlasxfmt>_<lasxfmt><u>;
-  rtx (*fn_odd) (rtx, rtx, rtx) =
+rtx_insn *(*fn_odd) (rtx, rtx, rtx) =
 gen_lasx_xvmulwod_<dlasxfmt>_<lasxfmt><u>;
   loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
                         <zero_one>, fn_even, fn_odd);
diff --git a/gcc/config/loongarch/loongarch-protos.h 
b/gcc/config/loongarch/loongarch-protos.h
index 0289409226f..eb0ac098f11 100644
--- a/gcc/config/loongarch/loongarch-protos.h
+++ b/gcc/config/loongarch/loongarch-protos.h
@@ -201,7 +201,7 @@ extern void loongarch_expand_vec_cond_expr (machine_mode, 
machine_mode, rtx *);
 extern void loongarch_expand_vec_cond_mask_expr (machine_mode, machine_mode,
                                                 rtx *);
 extern void loongarch_expand_vec_widen_hilo (rtx, rtx, rtx, bool,
-       rtx (*)(rtx, rtx, rtx), rtx (*)(rtx, rtx, rtx));
+       rtx_insn *(*)(rtx, rtx, rtx), rtx_insn *(*)(rtx, rtx, rtx));
 extern bool loongarch_16b_atomic_lock_free_p (void);
 
 /* Routines implemented in loongarch-c.c.  */
diff --git a/gcc/config/loongarch/loongarch.cc 
b/gcc/config/loongarch/loongarch.cc
index 2aa50a6c716..7ab35c8d108 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -9290,8 +9290,9 @@ loongarch_expand_vec_interleave (rtx target, rtx op0, rtx 
op1, bool high_p)
 
 void
 loongarch_expand_vec_widen_hilo (rtx dest, rtx op1, rtx op2,
-                                bool high_p, rtx (*fn_even) (rtx, rtx, rtx),
-                                rtx (*fn_odd) (rtx, rtx, rtx))
+                                bool high_p,
+                                rtx_insn *(*fn_even) (rtx, rtx, rtx),
+                                rtx_insn *(*fn_odd) (rtx, rtx, rtx))
 {
   machine_mode wmode = GET_MODE (dest);
   machine_mode mode = GET_MODE (op1);
@@ -10497,7 +10498,7 @@ loongarch_expand_vector_init (rtx target, rtx vals)
   /* Copy two elements of vals to target vector.  */
   typedef rtx (*loongarch_vec_repl2_fn) (rtx, rtx, rtx);
   /* Insert scalar operands into the specified position of the vector.  */
-  typedef rtx (*loongarch_vec_set_fn) (rtx, rtx, rtx);
+  typedef rtx_insn *(*loongarch_vec_set_fn) (rtx, rtx, rtx);
   /* Copy 64bit lowpart to highpart.  */
   typedef rtx (*loongarch_vec_mirror_fn) (rtx, rtx, rtx);
   /* Merge lowpart and highpart into target.  */
diff --git a/gcc/config/mips/loongson-mmi.md b/gcc/config/mips/loongson-mmi.md
index 33f4bfccc44..519f0065dd5 100644
--- a/gcc/config/mips/loongson-mmi.md
+++ b/gcc/config/mips/loongson-mmi.md
@@ -853,7 +853,7 @@
   "TARGET_HARD_FLOAT && TARGET_LOONGSON_MMI"
 {
   rtx tmp = gen_reg_rtx (GET_MODE (operands[1]));
-  mips_expand_vec_reduc (tmp, operands[1], gen_add<mode>3);
+  mips_expand_vec_reduc (tmp, operands[1], gen_insn_add<mode>3);
   emit_insn (gen_vec_loongson_extract_lo_<mode> (operands[0], tmp));
   DONE;
 })
@@ -864,7 +864,7 @@
   "TARGET_HARD_FLOAT && TARGET_LOONGSON_MMI"
 {
   rtx tmp = gen_reg_rtx (GET_MODE (operands[1]));
-  mips_expand_vec_reduc (tmp, operands[1], gen_smax<mode>3);
+  mips_expand_vec_reduc (tmp, operands[1], gen_insn_smax<mode>3);
   emit_insn (gen_vec_loongson_extract_lo_<mode> (operands[0], tmp));
   DONE;
 })
@@ -875,7 +875,7 @@
   "TARGET_HARD_FLOAT && TARGET_LOONGSON_MMI"
 {
   rtx tmp = gen_reg_rtx (GET_MODE (operands[1]));
-  mips_expand_vec_reduc (tmp, operands[1], gen_smin<mode>3);
+  mips_expand_vec_reduc (tmp, operands[1], gen_insn_smin<mode>3);
   emit_insn (gen_vec_loongson_extract_lo_<mode> (operands[0], tmp));
   DONE;
 })
@@ -886,7 +886,7 @@
   "TARGET_HARD_FLOAT && TARGET_LOONGSON_MMI"
 {
   rtx tmp = gen_reg_rtx (GET_MODE (operands[1]));
-  mips_expand_vec_reduc (tmp, operands[1], gen_umax<mode>3);
+  mips_expand_vec_reduc (tmp, operands[1], gen_insn_umax<mode>3);
   emit_insn (gen_vec_loongson_extract_lo_<mode> (operands[0], tmp));
   DONE;
 })
@@ -897,7 +897,7 @@
   "TARGET_HARD_FLOAT && TARGET_LOONGSON_MMI"
 {
   rtx tmp = gen_reg_rtx (GET_MODE (operands[1]));
-  mips_expand_vec_reduc (tmp, operands[1], gen_umin<mode>3);
+  mips_expand_vec_reduc (tmp, operands[1], gen_insn_umin<mode>3);
   emit_insn (gen_vec_loongson_extract_lo_<mode> (operands[0], tmp));
   DONE;
 })
diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h
index d02d60c38e0..45dbd49de8f 100644
--- a/gcc/config/mips/mips-protos.h
+++ b/gcc/config/mips/mips-protos.h
@@ -351,7 +351,7 @@ extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
 
 extern void mips_expand_vector_init (rtx, rtx);
 extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
-extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
+extern void mips_expand_vec_reduc (rtx, rtx, rtx_insn *(*)(rtx, rtx, rtx));
 extern void mips_expand_msa_reduc (rtx (*)(rtx, rtx, rtx), rtx, rtx);
 extern void mips_expand_vec_minmax (rtx, rtx, rtx,
                                    rtx (*) (rtx, rtx, rtx), bool);
@@ -380,7 +380,7 @@ extern int mips_trampoline_code_size (void);
 extern void mips_function_profiler (FILE *);
 extern bool mips_load_store_bonding_p (rtx *, machine_mode, bool);
 
-typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
+typedef rtx_insn *(*mulsidi3_gen_fn) (rtx, rtx, rtx);
 #ifdef RTX_CODE
 extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
 #endif
diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index 4402ae17c0d..2c986faffd7 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -21286,16 +21286,16 @@ mips_mulsidi3_gen_fn (enum rtx_code ext_code)
         ensure that we always remove the redundant sign-extension in this
         case we still expand mulsidi3 for DMUL.  */
       if (ISA_HAS_R6DMUL)
-       return signed_p ? gen_mulsidi3_64bit_r6dmul : NULL;
+       return signed_p ? gen_insn_mulsidi3_64bit_r6dmul : NULL;
       if (ISA_HAS_DMUL3)
-       return signed_p ? gen_mulsidi3_64bit_dmul : NULL;
+       return signed_p ? gen_insn_mulsidi3_64bit_dmul : NULL;
       if (TARGET_MIPS16)
        return (signed_p
                ? gen_mulsidi3_64bit_mips16
                : gen_umulsidi3_64bit_mips16);
       if (TARGET_FIX_R4000)
        return NULL;
-      return signed_p ? gen_mulsidi3_64bit : gen_umulsidi3_64bit;
+      return signed_p ? gen_insn_mulsidi3_64bit : gen_insn_umulsidi3_64bit;
     }
   else
     {
@@ -21306,8 +21306,10 @@ mips_mulsidi3_gen_fn (enum rtx_code ext_code)
                ? gen_mulsidi3_32bit_mips16
                : gen_umulsidi3_32bit_mips16);
       if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
-       return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
-      return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
+       return (signed_p
+               ? gen_insn_mulsidi3_32bit_r4000
+               : gen_insn_umulsidi3_32bit_r4000);
+      return signed_p ? gen_insn_mulsidi3_32bit : gen_insn_umulsidi3_32bit;
     }
 }
 
@@ -22839,7 +22841,7 @@ mips_expand_vector_init (rtx target, rtx vals)
 /* Expand a vector reduction.  */
 
 void
-mips_expand_vec_reduc (rtx target, rtx in, rtx (*gen)(rtx, rtx, rtx))
+mips_expand_vec_reduc (rtx target, rtx in, rtx_insn *(*gen)(rtx, rtx, rtx))
 {
   machine_mode vmode = GET_MODE (in);
   unsigned char perm2[2];
diff --git a/gcc/config/rl78/rl78-protos.h b/gcc/config/rl78/rl78-protos.h
index b658e00b692..e4982349522 100644
--- a/gcc/config/rl78/rl78-protos.h
+++ b/gcc/config/rl78/rl78-protos.h
@@ -27,8 +27,8 @@ void          rl78_expand_compare (rtx *);
 void           rl78_expand_movsi (rtx *);
 void           rl78_split_movsi (rtx *, machine_mode);
 void           rl78_split_movdi (rtx *, enum machine_mode);
-int            rl78_force_nonfar_2 (rtx *, rtx (*gen)(rtx,rtx));
-int            rl78_force_nonfar_3 (rtx *, rtx (*gen)(rtx,rtx,rtx));
+int            rl78_force_nonfar_2 (rtx *, rtx_insn *(*gen)(rtx,rtx));
+int            rl78_force_nonfar_3 (rtx *, rtx_insn *(*gen)(rtx,rtx,rtx));
 void           rl78_expand_eh_epilogue (rtx);
 void           rl78_expand_epilogue (void);
 void           rl78_expand_prologue (void);
diff --git a/gcc/config/rl78/rl78.cc b/gcc/config/rl78/rl78.cc
index 67fb86a1689..c073cfad658 100644
--- a/gcc/config/rl78/rl78.cc
+++ b/gcc/config/rl78/rl78.cc
@@ -623,7 +623,7 @@ rl78_split_movdi (rtx *operands, enum machine_mode omode)
    operands in the "far" namespace.  Force some such operands into
    registers so that each pattern has at most one far operand.  */
 int
-rl78_force_nonfar_2 (rtx *operands, rtx (*gen)(rtx,rtx))
+rl78_force_nonfar_2 (rtx *operands, rtx_insn *(*gen)(rtx,rtx))
 {
   int did = 0;
   rtx temp_reg = NULL;
@@ -648,7 +648,7 @@ rl78_force_nonfar_2 (rtx *operands, rtx (*gen)(rtx,rtx))
 
 /* Likewise, but for three-operand expanders.  */
 int
-rl78_force_nonfar_3 (rtx *operands, rtx (*gen)(rtx,rtx,rtx))
+rl78_force_nonfar_3 (rtx *operands, rtx_insn *(*gen)(rtx,rtx,rtx))
 {
   int did = 0;
   rtx temp_reg = NULL;
diff --git a/gcc/config/rs6000/rs6000-string.cc 
b/gcc/config/rs6000/rs6000-string.cc
index 0fc4d6d3065..ba0e5a62af2 100644
--- a/gcc/config/rs6000/rs6000-string.cc
+++ b/gcc/config/rs6000/rs6000-string.cc
@@ -2691,16 +2691,16 @@ expand_strn_compare (rtx operands[], int no_length)
    DEST is the destination for the data.
    SRC is the source of the data for the move.  */
 
-static rtx
+static rtx_insn *
 gen_lvx_v4si_move (rtx dest, rtx src)
 {
   gcc_assert (MEM_P (dest) ^ MEM_P (src));
   gcc_assert (GET_MODE (dest) == V4SImode && GET_MODE (src) == V4SImode);
 
   if (MEM_P (dest))
-    return gen_altivec_stvx_v4si_internal (dest, src);
+    return gen_insn_altivec_stvx_v4si_internal (dest, src);
   else
-    return gen_altivec_lvx_v4si_internal (dest, src);
+    return gen_insn_altivec_lvx_v4si_internal (dest, src);
 }
 
 static rtx
@@ -2775,7 +2775,7 @@ expand_block_move (rtx operands[], bool might_overlap)
   for (offset = 0; bytes > 0; offset += move_bytes, bytes -= move_bytes)
     {
       union {
-       rtx (*mov) (rtx, rtx);
+       rtx_insn *(*mov) (rtx, rtx);
        rtx (*movlen) (rtx, rtx, int);
       } gen_func;
       machine_mode mode = BLKmode;
@@ -2804,7 +2804,7 @@ expand_block_move (rtx operands[], bool might_overlap)
        {
          move_bytes = 16;
          mode = V2DImode;
-         gen_func.mov = gen_vsx_movv2di_64bit;
+         gen_func.mov = gen_insn_vsx_movv2di_64bit;
        }
       else if (TARGET_BLOCK_OPS_UNALIGNED_VSX
               /* Only use lxvl/stxvl on 64bit POWER10.  */
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 023e5e42aab..8d2a6c0582c 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -7223,9 +7223,9 @@ rs6000_expand_vector_init (rtx target, rtx vals)
        }
       else
        {
-         rtx (*merge_v16qi) (rtx, rtx, rtx) = NULL;
-         rtx (*merge_v8hi) (rtx, rtx, rtx) = NULL;
-         rtx (*merge_v4si) (rtx, rtx, rtx) = NULL;
+         rtx_insn *(*merge_v16qi) (rtx, rtx, rtx) = NULL;
+         rtx_insn *(*merge_v8hi) (rtx, rtx, rtx) = NULL;
+         rtx_insn *(*merge_v4si) (rtx, rtx, rtx) = NULL;
          rtx perm_idx;
 
          /* Set up some common gen routines and values.  */
@@ -7432,17 +7432,17 @@ rs6000_expand_vector_set_var_p7 (rtx target, rtx val, 
rtx idx)
 
   machine_mode shift_mode;
   rtx (*gen_ashl)(rtx, rtx, rtx);
-  rtx (*gen_add)(rtx, rtx, rtx);
-  rtx (*gen_sub)(rtx, rtx, rtx);
-  rtx (*gen_lvsl)(rtx, rtx);
+  rtx_insn *(*gen_add)(rtx, rtx, rtx);
+  rtx_insn *(*gen_sub)(rtx, rtx, rtx);
+  rtx_insn *(*gen_lvsl)(rtx, rtx);
 
   if (TARGET_POWERPC64)
     {
       shift_mode = DImode;
       gen_ashl = gen_ashldi3;
       gen_add = gen_adddi3;
-      gen_sub = gen_subdi3;
-      gen_lvsl = gen_altivec_lvsl_reg_di;
+      gen_sub = gen_insn_subdi3;
+      gen_lvsl = gen_insn_altivec_lvsl_reg_di;
     }
   else
     {
@@ -7450,7 +7450,7 @@ rs6000_expand_vector_set_var_p7 (rtx target, rtx val, rtx 
idx)
       gen_ashl = gen_ashlsi3;
       gen_add = gen_addsi3;
       gen_sub = gen_subsi3;
-      gen_lvsl = gen_altivec_lvsl_reg_si;
+      gen_lvsl = gen_insn_altivec_lvsl_reg_si;
     }
 
   /*  idx = idx * width.  */
@@ -16937,26 +16937,26 @@ emit_unlikely_jump (rtx cond, rtx label)
 static void
 emit_load_locked (machine_mode mode, rtx reg, rtx mem, rtx local)
 {
-  rtx (*fn) (rtx, rtx, rtx) = NULL;
+  rtx_insn *(*fn) (rtx, rtx, rtx) = NULL;
 
   switch (mode)
     {
     case E_QImode:
-      fn = gen_load_lockedqi;
+      fn = gen_insn_load_lockedqi;
       break;
     case E_HImode:
-      fn = gen_load_lockedhi;
+      fn = gen_insn_load_lockedhi;
       break;
     case E_SImode:
       if (GET_MODE (mem) == QImode)
-       fn = gen_load_lockedqi_si;
+       fn = gen_insn_load_lockedqi_si;
       else if (GET_MODE (mem) == HImode)
-       fn = gen_load_lockedhi_si;
+       fn = gen_insn_load_lockedhi_si;
       else
-       fn = gen_load_lockedsi;
+       fn = gen_insn_load_lockedsi;
       break;
     case E_DImode:
-      fn = gen_load_lockeddi;
+      fn = gen_insn_load_lockeddi;
       break;
     case E_TImode:
       fn = gen_load_lockedti;
@@ -16973,21 +16973,21 @@ emit_load_locked (machine_mode mode, rtx reg, rtx 
mem, rtx local)
 static void
 emit_store_conditional (machine_mode mode, rtx res, rtx mem, rtx val)
 {
-  rtx (*fn) (rtx, rtx, rtx) = NULL;
+  rtx_insn *(*fn) (rtx, rtx, rtx) = NULL;
 
   switch (mode)
     {
     case E_QImode:
-      fn = gen_store_conditionalqi;
+      fn = gen_insn_store_conditionalqi;
       break;
     case E_HImode:
-      fn = gen_store_conditionalhi;
+      fn = gen_insn_store_conditionalhi;
       break;
     case E_SImode:
-      fn = gen_store_conditionalsi;
+      fn = gen_insn_store_conditionalsi;
       break;
     case E_DImode:
-      fn = gen_store_conditionaldi;
+      fn = gen_insn_store_conditionaldi;
       break;
     case E_TImode:
       fn = gen_store_conditionalti;
diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc
index 9902daec371..de8a83a7767 100644
--- a/gcc/config/s390/s390.cc
+++ b/gcc/config/s390/s390.cc
@@ -11811,8 +11811,7 @@ save_gprs (rtx base, int offset, int first, int last, 
rtx_insn *before = NULL)
   /* Special-case single register.  */
   if (first == last)
     {
-      insn = as_a <rtx_insn *> (gen_movdi (addr,
-                                          gen_rtx_REG (Pmode, first)));
+      insn = gen_movdi (addr, gen_rtx_REG (Pmode, first));
 
       if (!global_not_special_regno_p (first))
        RTX_FRAME_RELATED_P (insn) = 1;
@@ -11828,9 +11827,8 @@ save_gprs (rtx base, int offset, int first, int last, 
rtx_insn *before = NULL)
     }
 
 
-  insn = as_a <rtx_insn *> (gen_store_multiple (addr,
-                                               gen_rtx_REG (Pmode, first),
-                                               GEN_INT (last - first + 1)));
+  insn = gen_store_multiple (addr, gen_rtx_REG (Pmode, first),
+                            GEN_INT (last - first + 1));
 
   if (first <= 6 && cfun->stdarg)
     for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
diff --git a/gcc/emit-rtl.cc b/gcc/emit-rtl.cc
index bfc6cfad51f..98dd59d1aa2 100644
--- a/gcc/emit-rtl.cc
+++ b/gcc/emit-rtl.cc
@@ -4199,6 +4199,8 @@ make_insn_raw (rtx pattern)
   rtx_insn *insn;
 
   insn = as_a <rtx_insn *> (rtx_alloc (INSN));
+  SET_NEXT_INSN (insn) = nullptr;
+  SET_PREV_INSN (insn) = nullptr;
 
   INSN_UID (insn) = cur_insn_uid++;
   PATTERN (insn) = pattern;
@@ -4230,6 +4232,8 @@ make_debug_insn_raw (rtx pattern)
   rtx_debug_insn *insn;
 
   insn = as_a <rtx_debug_insn *> (rtx_alloc (DEBUG_INSN));
+  SET_NEXT_INSN (insn) = nullptr;
+  SET_PREV_INSN (insn) = nullptr;
   INSN_UID (insn) = cur_debug_insn_uid++;
   if (cur_debug_insn_uid > param_min_nondebug_insn_uid)
     INSN_UID (insn) = cur_insn_uid++;
@@ -4245,12 +4249,14 @@ make_debug_insn_raw (rtx pattern)
 
 /* Like `make_insn_raw' but make a JUMP_INSN instead of an insn.  */
 
-static rtx_insn *
+rtx_insn *
 make_jump_insn_raw (rtx pattern)
 {
   rtx_jump_insn *insn;
 
   insn = as_a <rtx_jump_insn *> (rtx_alloc (JUMP_INSN));
+  SET_NEXT_INSN (insn) = nullptr;
+  SET_PREV_INSN (insn) = nullptr;
   INSN_UID (insn) = cur_insn_uid++;
 
   PATTERN (insn) = pattern;
@@ -4265,12 +4271,14 @@ make_jump_insn_raw (rtx pattern)
 
 /* Like `make_insn_raw' but make a CALL_INSN instead of an insn.  */
 
-static rtx_insn *
+rtx_insn *
 make_call_insn_raw (rtx pattern)
 {
   rtx_call_insn *insn;
 
   insn = as_a <rtx_call_insn *> (rtx_alloc (CALL_INSN));
+  SET_NEXT_INSN (insn) = nullptr;
+  SET_PREV_INSN (insn) = nullptr;
   INSN_UID (insn) = cur_insn_uid++;
 
   PATTERN (insn) = pattern;
diff --git a/gcc/genemit.cc b/gcc/genemit.cc
index c40f7fc7fb1..ee5961f1e46 100644
--- a/gcc/genemit.cc
+++ b/gcc/genemit.cc
@@ -411,9 +411,10 @@ maybe_queue_insn (const md_rtx_info &info)
    in STATS.  Return the C++ expression for the operands array.  */
 
 static const char *
-start_gen_insn (FILE *file, const char *name, const pattern_stats &stats)
+start_gen_insn (FILE *file, const char *name, const pattern_stats &stats,
+               bool return_pat)
 {
-  fprintf (file, "rtx\ngen_%s (", name);
+  fprintf (file, "%s\ngen_%s (", return_pat ? "rtx" : "rtx_insn *", name);
   if (stats.num_generator_args)
     for (int i = 0; i < stats.num_generator_args; i++)
       fprintf (file, "%sconst rtx operand%d", i == 0 ? "" : ", ", i);
@@ -441,6 +442,33 @@ start_gen_insn (FILE *file, const char *name, const 
pattern_stats &stats)
   return "nullptr";
 }
 
+/* Generate an rtx_insn * gen_insn_<name> wrapper around gen_<name>.
+   MAKE_INSN is make_insn_raw, make_jump_insn_raw, or make_call_insn_raw.
+   The insn is not inserted into the current sequence.  */
+
+static void
+gen_insn_wrapper (FILE *file, const char *name, int args,
+                 const char *make_insn)
+{
+  int i;
+
+  fprintf (file, "rtx_insn *\ngen_insn_%s (", name);
+  if (args > 0)
+    {
+      for (i = 1; i < args; i++)
+       fprintf (file, "rtx %c, ", 'a' + i - 1);
+      fprintf (file, "rtx %c", 'a' + args - 1);
+    }
+  fprintf (file, ")\n{ return %s (gen_%s (", make_insn, name);
+  if (args > 0)
+    {
+      for (i = 1; i < args; i++)
+       fprintf (file, "%c, ", 'a' + i - 1);
+      fprintf (file, "%c", 'a' + args - 1);
+    }
+  fprintf (file, ")); }\n");
+}
+
 /* Generate the `gen_...' function for a DEFINE_INSN.  */
 
 static void
@@ -455,13 +483,16 @@ gen_insn (const md_rtx_info &info, FILE *file)
     fatal_at (info.loc, "match_dup operand number has no match_operand");
 
   /* Output the function name and argument declarations.  */
-  const char *operands = start_gen_insn (file, XSTR (insn, 0), stats);
+  const char *operands = start_gen_insn (file, XSTR (insn, 0), stats,
+                                       true);
 
   /* Output code to construct and return the rtl for the instruction body.  */
 
   rtx pattern = add_implicit_parallel (XVEC (insn, 1));
   const char *table = generator (info).gen_exp (file, pattern);
   fprintf (file, "  return expand_rtx (%s, %s);\n}\n\n", table, operands);
+  gen_insn_wrapper (file, XSTR (insn, 0), stats.num_generator_args,
+                   get_make_insn_function (pattern));
 }
 
 /* Process and queue the DEFINE_EXPAND in INFO.  */
@@ -493,19 +524,23 @@ gen_expand (const md_rtx_info &info, FILE *file)
     fatal_at (info.loc, "define_expand for %s needs to have match_scratch "
              "numbers above all other operands", XSTR (expand, 0));
 
+  /* A one-element expand with no C code returns the pattern, like a
+     DEFINE_INSN.  Anything that emits insns returns an rtx_insn *.  */
+  bool return_pat = ((XSTR (expand, 3) == 0 || *XSTR (expand, 3) == '\0')
+                    && stats.max_opno >= stats.max_dup_opno
+                    && XVECLEN (expand, 1) == 1);
+
   /* Output the function name and argument declarations.  */
-  const char *operands = start_gen_insn (file, XSTR (expand, 0), stats);
-
-  /* If we don't have any C code to write, only one insn is being written,
-     and no MATCH_DUPs are present, we can just return the desired insn
-     like we do for a DEFINE_INSN.  This saves memory.  */
-  if ((XSTR (expand, 3) == 0 || *XSTR (expand, 3) == '\0')
-      && stats.max_opno >= stats.max_dup_opno
-      && XVECLEN (expand, 1) == 1)
+  const char *operands = start_gen_insn (file, XSTR (expand, 0), stats,
+                                       return_pat);
+
+  if (return_pat)
     {
       rtx pattern = XVECEXP (expand, 1, 0);
       const char *table = generator (info).gen_exp (file, pattern);
       fprintf (file, "  return expand_rtx (%s, %s);\n}\n\n", table, operands);
+      gen_insn_wrapper (file, XSTR (expand, 0), stats.num_generator_args,
+                       get_make_insn_function (pattern));
       return;
     }
 
diff --git a/gcc/genflags.cc b/gcc/genflags.cc
index 8b917144119..ab672ce48fb 100644
--- a/gcc/genflags.cc
+++ b/gcc/genflags.cc
@@ -102,11 +102,22 @@ gen_proto (rtx insn)
   int i;
   const char *name = XSTR (insn, 0);
   int truth = maybe_eval_c_test (XSTR (insn, 2));
+  pattern_stats stats;
+  get_pattern_stats (&stats, XVEC (insn, 1));
+  /* DEFINE_INSN, and a one-element define_expand with no C code,
+     return the pattern.  An expand that emits insns returns an
+     rtx_insn *.  */
+  bool return_pat = (GET_CODE (insn) == DEFINE_INSN
+                    || ((!XSTR (insn, 3) || XSTR (insn, 3)[0] == '\0')
+                        && stats.max_opno >= stats.max_dup_opno
+                        && XVECLEN (insn, 1) == 1));
+  const char *ret_type = return_pat ? "rtx" : "rtx_insn *";
 
   if (truth != 0)
-    printf ("extern rtx        gen_%-*s (", max_id_len, name);
+    printf ("extern %s gen_%-*s (", ret_type, max_id_len, name);
   else
-    printf ("static inline rtx gen_%-*s (", max_id_len, name);
+    printf ("static inline %s gen_%-*s (", ret_type, max_id_len,
+            name);
 
   if (num == 0)
     fputs ("void", stdout);
@@ -120,11 +131,59 @@ gen_proto (rtx insn)
 
   puts (");");
 
+  if (return_pat)
+    {
+      /* genemit drops an elided pattern, so the wrapper is a stub.  */
+      if (truth == 0)
+       {
+         printf ("static inline rtx_insn *\ngen_insn_%s", name);
+         if (num > 0)
+           {
+             putchar ('(');
+             for (i = 0; i < num - 1; i++)
+               printf ("rtx ARG_UNUSED (%c), ", 'a' + i);
+             printf ("rtx ARG_UNUSED (%c))\n", 'a' + i);
+           }
+         else
+           puts ("(void)");
+         puts ("{\n  return 0;\n}");
+       }
+      else
+       {
+         printf ("extern rtx_insn *gen_insn_%s (", name);
+         if (num > 0)
+           {
+             for (i = 1; i < num; i++)
+               printf ("rtx, ");
+             printf ("rtx");
+           }
+         puts (");");
+       }
+    }
+  else
+    {
+      printf ("static inline rtx_insn *\ngen_insn_%s (", name);
+      if (num > 0)
+       {
+         for (i = 1; i < num; i++)
+           printf ("rtx %c, ", 'a' + i - 1);
+         printf ("rtx %c", 'a' + i - 1);
+       }
+      printf (")\n{ return gen_%s (", name);
+      if (num > 0)
+       {
+         for (i = 1; i < num; i++)
+           printf ("%c, ", 'a' + i - 1);
+         printf ("%c", 'a' + i - 1);
+       }
+      printf ("); }\n");
+    }
+
   /* Some back ends want to take the address of generator functions,
      so we cannot simply use #define for these dummy definitions.  */
   if (truth == 0)
     {
-      printf ("static inline rtx\ngen_%s", name);
+      printf ("static inline %s\ngen_%s", ret_type, name);
       if (num > 0)
        {
          putchar ('(');
diff --git a/gcc/gensupport.cc b/gcc/gensupport.cc
index 0bacafc848b..ab0dba08f96 100644
--- a/gcc/gensupport.cc
+++ b/gcc/gensupport.cc
@@ -3751,23 +3751,22 @@ get_pattern_stats (struct pattern_stats *stats, rtvec 
pattern)
                                       stats->max_scratch_opno)) + 1;
 }
 
-/* Return the emit_* function that should be used for pattern X, or NULL
-   if we can't pick a particular type at compile time and should instead
-   fall back to "emit".  */
+/* Return the make_*_insn_raw function for pattern X, or NULL if the
+   insn code is only known when the compiler is run.  */
 
 const char *
-get_emit_function (rtx x)
+get_make_insn_function (rtx x)
 {
   switch (classify_insn (x))
     {
     case INSN:
-      return "emit_insn";
+      return "make_insn_raw";
 
     case CALL_INSN:
-      return "emit_call_insn";
+      return "make_call_insn_raw";
 
     case JUMP_INSN:
-      return "emit_jump_insn";
+      return "make_jump_insn_raw";
 
     case UNKNOWN:
       return NULL;
diff --git a/gcc/gensupport.h b/gcc/gensupport.h
index 880505355b2..8eab8f533fd 100644
--- a/gcc/gensupport.h
+++ b/gcc/gensupport.h
@@ -230,7 +230,7 @@ extern hash_set<rtx> compact_syntax;
 extern void get_pattern_stats (struct pattern_stats *ranges, rtvec vec);
 extern void compute_test_codes (rtx, file_location, char *);
 extern file_location get_file_location (rtx);
-extern const char *get_emit_function (rtx);
+extern const char *get_make_insn_function (rtx);
 extern bool find_optab (optab_pattern *, const char *);
 
 /* An output file produced by a machine-description generator.  Partition
diff --git a/gcc/rtl.cc b/gcc/rtl.cc
index dac230b2159..f7ed0de9295 100644
--- a/gcc/rtl.cc
+++ b/gcc/rtl.cc
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "rtl.h"
 #ifdef GENERATOR_FILE
 # include "errors.h"
+# include "gensupport.h"
 #else
 # include "rtlhash.h"
 # include "diagnostic-core.h"
@@ -606,6 +607,70 @@ rtvec_series_p (rtvec vec, poly_int64 start)
   return true;
 }
 
+/* Classify the elements of VEC.  VEC is either the body of a PARALLEL
+   or the required prefix of a MATCH_PARALLEL.  A call or return that
+   selects CALL_INSN or JUMP_INSN is one of those elements.  */
+
+static enum rtx_code
+classify_insn_vec (rtvec vec)
+{
+  int j;
+  bool has_return_p = false;
+
+  for (j = GET_NUM_ELEM (vec) - 1; j >= 0; j--)
+    {
+      rtx el = RTVEC_ELT (vec, j);
+
+      if (GET_CODE (el) == CALL)
+       return CALL_INSN;
+      else if (ANY_RETURN_P (el))
+       has_return_p = true;
+      else if (GET_CODE (el) == SET && GET_CODE (SET_DEST (el)) == PC)
+       return JUMP_INSN;
+      else if (GET_CODE (el) == SET && GET_CODE (SET_SRC (el)) == CALL)
+       return CALL_INSN;
+    }
+  if (has_return_p)
+    return JUMP_INSN;
+  if (GET_NUM_ELEM (vec) > 0
+      && GET_CODE (RTVEC_ELT (vec, 0)) == ASM_OPERANDS
+      && ASM_OPERANDS_LABEL_LENGTH (RTVEC_ELT (vec, 0)))
+    return JUMP_INSN;
+  return INSN;
+}
+
+#ifdef GENERATOR_FILE
+/* True when every code PRED accepts is an ordinary insn body.  A call,
+   set, parallel, return, or asm can still select another insn code.  */
+
+static bool
+predicate_is_always_insn (const struct pred_data *pred)
+{
+  if (!pred || pred->num_codes == 0)
+    return false;
+
+  for (int code = 0; code < NUM_RTX_CODE; code++)
+    if (pred->codes[code])
+      switch ((enum rtx_code) code)
+       {
+       case CALL:
+       case SET:
+       case PARALLEL:
+       case RETURN:
+       case SIMPLE_RETURN:
+       case ASM_OPERANDS:
+       case ASM_INPUT:
+       case CODE_LABEL:
+         return false;
+
+       default:
+         break;
+       }
+
+  return true;
+}
+#endif
+
 /* Return an indication of which type of insn should have X as a body.
    In generator files, this can be UNKNOWN if the answer is only known
    at (GCC) runtime.  Otherwise the value is CODE_LABEL, INSN, CALL_INSN
@@ -632,33 +697,19 @@ classify_insn (rtx x)
        return INSN;
     }
   if (GET_CODE (x) == PARALLEL)
-    {
-      int j;
-      bool has_return_p = false;
-      for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
-       if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
-         return CALL_INSN;
-       else if (ANY_RETURN_P (XVECEXP (x, 0, j)))
-         has_return_p = true;
-       else if (GET_CODE (XVECEXP (x, 0, j)) == SET
-                && GET_CODE (SET_DEST (XVECEXP (x, 0, j))) == PC)
-         return JUMP_INSN;
-       else if (GET_CODE (XVECEXP (x, 0, j)) == SET
-                && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
-         return CALL_INSN;
-      if (has_return_p)
-       return JUMP_INSN;
-      if (GET_CODE (XVECEXP (x, 0, 0)) == ASM_OPERANDS
-         && ASM_OPERANDS_LABEL_LENGTH (XVECEXP (x, 0, 0)))
-       return JUMP_INSN;
-    }
+    return classify_insn_vec (XVEC (x, 0));
 #ifdef GENERATOR_FILE
+  /* The predicate may accept elements past this prefix.  The RTX that
+     selects the insn code is written in the prefix.  */
+  if (GET_CODE (x) == MATCH_PARALLEL)
+    return classify_insn_vec (XVEC (x, 2));
+  if (GET_CODE (x) == MATCH_OPERAND
+      && predicate_is_always_insn (lookup_predicate (XSTR (x, 1))))
+    return INSN;
   if (GET_CODE (x) == MATCH_OPERAND
       || GET_CODE (x) == MATCH_OPERATOR
-      || GET_CODE (x) == MATCH_PARALLEL
       || GET_CODE (x) == MATCH_OP_DUP
-      || GET_CODE (x) == MATCH_DUP
-      || GET_CODE (x) == PARALLEL)
+      || GET_CODE (x) == MATCH_DUP)
     return UNKNOWN;
 #endif
   return INSN;
diff --git a/gcc/rtl.h b/gcc/rtl.h
index d4ba485feb9..53fa353fb0b 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3494,6 +3494,8 @@ extern rtx_insn *emit_clobber (rtx);
 extern rtx_insn *gen_use (rtx);
 extern rtx_insn *emit_use (rtx);
 extern rtx_insn *make_insn_raw (rtx);
+extern rtx_insn *make_jump_insn_raw (rtx);
+extern rtx_insn *make_call_insn_raw (rtx);
 extern void add_function_usage_to (rtx_insn *, rtx);
 extern rtx_call_insn *last_call_insn (void);
 extern rtx_insn *previous_insn (rtx_insn *);
-- 
2.53.0

Reply via email to