diff mbox series

[v4,114/163] tcg: Add TCGOutOp structures for add/sub carry opcodes

Message ID 20250415192515.232910-115-richard.henderson@linaro.org
State New
Headers show
Series tcg: Convert to TCGOutOp structures | expand

Commit Message

Richard Henderson April 15, 2025, 7:24 p.m. UTC
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tcg/tcg.c                        | 61 +++++++++++++++++++++++++++-----
 tcg/aarch64/tcg-target.c.inc     | 34 ++++++++++++++++++
 tcg/arm/tcg-target.c.inc         | 34 ++++++++++++++++++
 tcg/i386/tcg-target.c.inc        | 34 ++++++++++++++++++
 tcg/loongarch64/tcg-target.c.inc | 34 ++++++++++++++++++
 tcg/mips/tcg-target.c.inc        | 34 ++++++++++++++++++
 tcg/ppc/tcg-target.c.inc         | 34 ++++++++++++++++++
 tcg/riscv/tcg-target.c.inc       | 34 ++++++++++++++++++
 tcg/s390x/tcg-target.c.inc       | 34 ++++++++++++++++++
 tcg/sparc64/tcg-target.c.inc     | 34 ++++++++++++++++++
 tcg/tci/tcg-target.c.inc         | 34 ++++++++++++++++++
 11 files changed, 393 insertions(+), 8 deletions(-)

Comments

Pierrick Bouvier April 16, 2025, 6:56 p.m. UTC | #1
On 4/15/25 12:24, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   tcg/tcg.c                        | 61 +++++++++++++++++++++++++++-----
>   tcg/aarch64/tcg-target.c.inc     | 34 ++++++++++++++++++
>   tcg/arm/tcg-target.c.inc         | 34 ++++++++++++++++++
>   tcg/i386/tcg-target.c.inc        | 34 ++++++++++++++++++
>   tcg/loongarch64/tcg-target.c.inc | 34 ++++++++++++++++++
>   tcg/mips/tcg-target.c.inc        | 34 ++++++++++++++++++
>   tcg/ppc/tcg-target.c.inc         | 34 ++++++++++++++++++
>   tcg/riscv/tcg-target.c.inc       | 34 ++++++++++++++++++
>   tcg/s390x/tcg-target.c.inc       | 34 ++++++++++++++++++
>   tcg/sparc64/tcg-target.c.inc     | 34 ++++++++++++++++++
>   tcg/tci/tcg-target.c.inc         | 34 ++++++++++++++++++
>   11 files changed, 393 insertions(+), 8 deletions(-)
> 
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index c6a49f5648..1db9796964 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -133,6 +133,8 @@ static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
>   static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2);
>   static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
>   static void tcg_out_goto_tb(TCGContext *s, int which);
> +static void tcg_out_set_carry(TCGContext *s);
> +static void tcg_out_set_borrow(TCGContext *s);
>   static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
>                          const TCGArg args[TCG_MAX_OP_ARGS],
>                          const int const_args[TCG_MAX_OP_ARGS]);
> @@ -978,6 +980,18 @@ typedef struct TCGOutOp {
>       TCGConstraintSetIndex (*dynamic_constraint)(TCGType type, unsigned flags);
>   } TCGOutOp;
>   
> +typedef struct TCGOutOpAddSubCarry {
> +    TCGOutOp base;
> +    void (*out_rrr)(TCGContext *s, TCGType type,
> +                    TCGReg a0, TCGReg a1, TCGReg a2);
> +    void (*out_rri)(TCGContext *s, TCGType type,
> +                    TCGReg a0, TCGReg a1, tcg_target_long a2);
> +    void (*out_rir)(TCGContext *s, TCGType type,
> +                    TCGReg a0, tcg_target_long a1, TCGReg a2);
> +    void (*out_rii)(TCGContext *s, TCGType type,
> +                    TCGReg a0, tcg_target_long a1, tcg_target_long a2);
> +} TCGOutOpAddSubCarry;
> +
>   typedef struct TCGOutOpBinary {
>       TCGOutOp base;
>       void (*out_rrr)(TCGContext *s, TCGType type,
> @@ -1131,6 +1145,11 @@ static const TCGOutOpUnary outop_extrl_i64_i32 = {
>   /* Register allocation descriptions for every TCGOpcode. */
>   static const TCGOutOp * const all_outop[NB_OPS] = {
>       OUTOP(INDEX_op_add, TCGOutOpBinary, outop_add),
> +    OUTOP(INDEX_op_addci, TCGOutOpAddSubCarry, outop_addci),
> +    OUTOP(INDEX_op_addcio, TCGOutOpBinary, outop_addcio),
> +    OUTOP(INDEX_op_addco, TCGOutOpBinary, outop_addco),
> +    /* addc1o is implemented with set_carry + addcio */
> +    OUTOP(INDEX_op_addc1o, TCGOutOpBinary, outop_addcio),
>       OUTOP(INDEX_op_and, TCGOutOpBinary, outop_and),
>       OUTOP(INDEX_op_andc, TCGOutOpBinary, outop_andc),
>       OUTOP(INDEX_op_brcond, TCGOutOpBrcond, outop_brcond),
> @@ -1170,6 +1189,11 @@ static const TCGOutOp * const all_outop[NB_OPS] = {
>       OUTOP(INDEX_op_shl, TCGOutOpBinary, outop_shl),
>       OUTOP(INDEX_op_shr, TCGOutOpBinary, outop_shr),
>       OUTOP(INDEX_op_sub, TCGOutOpSubtract, outop_sub),
> +    OUTOP(INDEX_op_subbi, TCGOutOpAddSubCarry, outop_subbi),
> +    OUTOP(INDEX_op_subbio, TCGOutOpAddSubCarry, outop_subbio),
> +    OUTOP(INDEX_op_subbo, TCGOutOpAddSubCarry, outop_subbo),
> +    /* subb1o is implemented with set_borrow + subbio */
> +    OUTOP(INDEX_op_subb1o, TCGOutOpAddSubCarry, outop_subbio),
>       OUTOP(INDEX_op_xor, TCGOutOpBinary, outop_xor),
>   
>   #if TCG_TARGET_REG_BITS == 32
> @@ -5564,7 +5588,12 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
>       /* emit instruction */
>       TCGType type = TCGOP_TYPE(op);
>       switch (op->opc) {
> +    case INDEX_op_addc1o:
> +        tcg_out_set_carry(s);
> +        /* fall through */
>       case INDEX_op_add:
> +    case INDEX_op_addcio:
> +    case INDEX_op_addco:
>       case INDEX_op_and:
>       case INDEX_op_andc:
>       case INDEX_op_clz:
> @@ -5603,8 +5632,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
>   
>       case INDEX_op_sub:
>           {
> -            const TCGOutOpSubtract *out =
> -                container_of(all_outop[op->opc], TCGOutOpSubtract, base);
> +            const TCGOutOpSubtract *out = &outop_sub;
>   
>               /*
>                * Constants should never appear in the second source operand.
> @@ -5619,15 +5647,32 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
>           }
>           break;
>   
> -    case INDEX_op_addco:
> -    case INDEX_op_subbo:
> +    case INDEX_op_subb1o:
> +        tcg_out_set_borrow(s);
> +        /* fall through */
>       case INDEX_op_addci:
>       case INDEX_op_subbi:
> -    case INDEX_op_addcio:
>       case INDEX_op_subbio:
> -    case INDEX_op_addc1o:
> -    case INDEX_op_subb1o:
> -        g_assert_not_reached();
> +    case INDEX_op_subbo:
> +        {
> +            const TCGOutOpAddSubCarry *out =
> +                container_of(all_outop[op->opc], TCGOutOpAddSubCarry, base);
> +
> +            if (const_args[2]) {
> +                if (const_args[1]) {
> +                    out->out_rii(s, type, new_args[0],
> +                                 new_args[1], new_args[2]);
> +                } else {
> +                    out->out_rri(s, type, new_args[0],
> +                                 new_args[1], new_args[2]);
> +                }
> +            } else if (const_args[1]) {
> +                out->out_rir(s, type, new_args[0], new_args[1], new_args[2]);
> +            } else {
> +                out->out_rrr(s, type, new_args[0], new_args[1], new_args[2]);
> +            }
> +        }
> +        break;
>   
>       case INDEX_op_bswap64:
>       case INDEX_op_ext_i32_i64:
> diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
> index bece494c55..87f8c98ed7 100644
> --- a/tcg/aarch64/tcg-target.c.inc
> +++ b/tcg/aarch64/tcg-target.c.inc
> @@ -2078,6 +2078,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -2421,6 +2438,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
> index f366424af5..aa0397520d 100644
> --- a/tcg/arm/tcg-target.c.inc
> +++ b/tcg/arm/tcg-target.c.inc
> @@ -1826,6 +1826,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -2135,6 +2152,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rir = tgen_subfi,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
> index 2b2ad9ca95..04e31cae12 100644
> --- a/tcg/i386/tcg-target.c.inc
> +++ b/tcg/i386/tcg-target.c.inc
> @@ -2629,6 +2629,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -3054,6 +3071,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
> index 735dcc117a..937f19fe6b 100644
> --- a/tcg/loongarch64/tcg-target.c.inc
> +++ b/tcg/loongarch64/tcg-target.c.inc
> @@ -1326,6 +1326,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tcg_out_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -1715,6 +1732,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
> index e69781b871..0c268cef42 100644
> --- a/tcg/mips/tcg-target.c.inc
> +++ b/tcg/mips/tcg-target.c.inc
> @@ -1593,6 +1593,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -2044,6 +2061,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
> index a964239aab..5b04655f3b 100644
> --- a/tcg/ppc/tcg-target.c.inc
> +++ b/tcg/ppc/tcg-target.c.inc
> @@ -2863,6 +2863,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -3267,6 +3284,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rir = tgen_subfi,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
> index dce46dcba6..707ebb8f6d 100644
> --- a/tcg/riscv/tcg-target.c.inc
> +++ b/tcg/riscv/tcg-target.c.inc
> @@ -1947,6 +1947,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -2333,6 +2350,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
> index ff06834e6e..a30afb455e 100644
> --- a/tcg/s390x/tcg-target.c.inc
> +++ b/tcg/s390x/tcg-target.c.inc
> @@ -2248,6 +2248,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -2766,6 +2783,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
> index 4c7d916302..12f0dbd23d 100644
> --- a/tcg/sparc64/tcg-target.c.inc
> +++ b/tcg/sparc64/tcg-target.c.inc
> @@ -1381,6 +1381,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rri = tgen_addi,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -1717,6 +1734,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
> index 9a5ca9c778..bba96d7a19 100644
> --- a/tcg/tci/tcg-target.c.inc
> +++ b/tcg/tci/tcg-target.c.inc
> @@ -573,6 +573,23 @@ static const TCGOutOpBinary outop_add = {
>       .out_rrr = tgen_add,
>   };
>   
> +static const TCGOutOpBinary outop_addco = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_addci = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpBinary outop_addcio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_carry(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_and(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {
> @@ -893,6 +910,23 @@ static const TCGOutOpSubtract outop_sub = {
>       .out_rrr = tgen_sub,
>   };
>   
> +static const TCGOutOpAddSubCarry outop_subbo = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbi = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static const TCGOutOpAddSubCarry outop_subbio = {
> +    .base.static_constraint = C_NotImplemented,
> +};
> +
> +static void tcg_out_set_borrow(TCGContext *s)
> +{
> +    g_assert_not_reached();
> +}
> +
>   static void tgen_xor(TCGContext *s, TCGType type,
>                        TCGReg a0, TCGReg a1, TCGReg a2)
>   {

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff mbox series

Patch

diff --git a/tcg/tcg.c b/tcg/tcg.c
index c6a49f5648..1db9796964 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -133,6 +133,8 @@  static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
 static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2);
 static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
 static void tcg_out_goto_tb(TCGContext *s, int which);
+static void tcg_out_set_carry(TCGContext *s);
+static void tcg_out_set_borrow(TCGContext *s);
 static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
                        const TCGArg args[TCG_MAX_OP_ARGS],
                        const int const_args[TCG_MAX_OP_ARGS]);
@@ -978,6 +980,18 @@  typedef struct TCGOutOp {
     TCGConstraintSetIndex (*dynamic_constraint)(TCGType type, unsigned flags);
 } TCGOutOp;
 
+typedef struct TCGOutOpAddSubCarry {
+    TCGOutOp base;
+    void (*out_rrr)(TCGContext *s, TCGType type,
+                    TCGReg a0, TCGReg a1, TCGReg a2);
+    void (*out_rri)(TCGContext *s, TCGType type,
+                    TCGReg a0, TCGReg a1, tcg_target_long a2);
+    void (*out_rir)(TCGContext *s, TCGType type,
+                    TCGReg a0, tcg_target_long a1, TCGReg a2);
+    void (*out_rii)(TCGContext *s, TCGType type,
+                    TCGReg a0, tcg_target_long a1, tcg_target_long a2);
+} TCGOutOpAddSubCarry;
+
 typedef struct TCGOutOpBinary {
     TCGOutOp base;
     void (*out_rrr)(TCGContext *s, TCGType type,
@@ -1131,6 +1145,11 @@  static const TCGOutOpUnary outop_extrl_i64_i32 = {
 /* Register allocation descriptions for every TCGOpcode. */
 static const TCGOutOp * const all_outop[NB_OPS] = {
     OUTOP(INDEX_op_add, TCGOutOpBinary, outop_add),
+    OUTOP(INDEX_op_addci, TCGOutOpAddSubCarry, outop_addci),
+    OUTOP(INDEX_op_addcio, TCGOutOpBinary, outop_addcio),
+    OUTOP(INDEX_op_addco, TCGOutOpBinary, outop_addco),
+    /* addc1o is implemented with set_carry + addcio */
+    OUTOP(INDEX_op_addc1o, TCGOutOpBinary, outop_addcio),
     OUTOP(INDEX_op_and, TCGOutOpBinary, outop_and),
     OUTOP(INDEX_op_andc, TCGOutOpBinary, outop_andc),
     OUTOP(INDEX_op_brcond, TCGOutOpBrcond, outop_brcond),
@@ -1170,6 +1189,11 @@  static const TCGOutOp * const all_outop[NB_OPS] = {
     OUTOP(INDEX_op_shl, TCGOutOpBinary, outop_shl),
     OUTOP(INDEX_op_shr, TCGOutOpBinary, outop_shr),
     OUTOP(INDEX_op_sub, TCGOutOpSubtract, outop_sub),
+    OUTOP(INDEX_op_subbi, TCGOutOpAddSubCarry, outop_subbi),
+    OUTOP(INDEX_op_subbio, TCGOutOpAddSubCarry, outop_subbio),
+    OUTOP(INDEX_op_subbo, TCGOutOpAddSubCarry, outop_subbo),
+    /* subb1o is implemented with set_borrow + subbio */
+    OUTOP(INDEX_op_subb1o, TCGOutOpAddSubCarry, outop_subbio),
     OUTOP(INDEX_op_xor, TCGOutOpBinary, outop_xor),
 
 #if TCG_TARGET_REG_BITS == 32
@@ -5564,7 +5588,12 @@  static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
     /* emit instruction */
     TCGType type = TCGOP_TYPE(op);
     switch (op->opc) {
+    case INDEX_op_addc1o:
+        tcg_out_set_carry(s);
+        /* fall through */
     case INDEX_op_add:
+    case INDEX_op_addcio:
+    case INDEX_op_addco:
     case INDEX_op_and:
     case INDEX_op_andc:
     case INDEX_op_clz:
@@ -5603,8 +5632,7 @@  static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
 
     case INDEX_op_sub:
         {
-            const TCGOutOpSubtract *out =
-                container_of(all_outop[op->opc], TCGOutOpSubtract, base);
+            const TCGOutOpSubtract *out = &outop_sub;
 
             /*
              * Constants should never appear in the second source operand.
@@ -5619,15 +5647,32 @@  static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
         }
         break;
 
-    case INDEX_op_addco:
-    case INDEX_op_subbo:
+    case INDEX_op_subb1o:
+        tcg_out_set_borrow(s);
+        /* fall through */
     case INDEX_op_addci:
     case INDEX_op_subbi:
-    case INDEX_op_addcio:
     case INDEX_op_subbio:
-    case INDEX_op_addc1o:
-    case INDEX_op_subb1o:
-        g_assert_not_reached();
+    case INDEX_op_subbo:
+        {
+            const TCGOutOpAddSubCarry *out =
+                container_of(all_outop[op->opc], TCGOutOpAddSubCarry, base);
+
+            if (const_args[2]) {
+                if (const_args[1]) {
+                    out->out_rii(s, type, new_args[0],
+                                 new_args[1], new_args[2]);
+                } else {
+                    out->out_rri(s, type, new_args[0],
+                                 new_args[1], new_args[2]);
+                }
+            } else if (const_args[1]) {
+                out->out_rir(s, type, new_args[0], new_args[1], new_args[2]);
+            } else {
+                out->out_rrr(s, type, new_args[0], new_args[1], new_args[2]);
+            }
+        }
+        break;
 
     case INDEX_op_bswap64:
     case INDEX_op_ext_i32_i64:
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
index bece494c55..87f8c98ed7 100644
--- a/tcg/aarch64/tcg-target.c.inc
+++ b/tcg/aarch64/tcg-target.c.inc
@@ -2078,6 +2078,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -2421,6 +2438,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
index f366424af5..aa0397520d 100644
--- a/tcg/arm/tcg-target.c.inc
+++ b/tcg/arm/tcg-target.c.inc
@@ -1826,6 +1826,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -2135,6 +2152,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rir = tgen_subfi,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
index 2b2ad9ca95..04e31cae12 100644
--- a/tcg/i386/tcg-target.c.inc
+++ b/tcg/i386/tcg-target.c.inc
@@ -2629,6 +2629,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -3054,6 +3071,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
index 735dcc117a..937f19fe6b 100644
--- a/tcg/loongarch64/tcg-target.c.inc
+++ b/tcg/loongarch64/tcg-target.c.inc
@@ -1326,6 +1326,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tcg_out_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -1715,6 +1732,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
index e69781b871..0c268cef42 100644
--- a/tcg/mips/tcg-target.c.inc
+++ b/tcg/mips/tcg-target.c.inc
@@ -1593,6 +1593,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -2044,6 +2061,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
index a964239aab..5b04655f3b 100644
--- a/tcg/ppc/tcg-target.c.inc
+++ b/tcg/ppc/tcg-target.c.inc
@@ -2863,6 +2863,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -3267,6 +3284,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rir = tgen_subfi,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
index dce46dcba6..707ebb8f6d 100644
--- a/tcg/riscv/tcg-target.c.inc
+++ b/tcg/riscv/tcg-target.c.inc
@@ -1947,6 +1947,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -2333,6 +2350,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
index ff06834e6e..a30afb455e 100644
--- a/tcg/s390x/tcg-target.c.inc
+++ b/tcg/s390x/tcg-target.c.inc
@@ -2248,6 +2248,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -2766,6 +2783,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
index 4c7d916302..12f0dbd23d 100644
--- a/tcg/sparc64/tcg-target.c.inc
+++ b/tcg/sparc64/tcg-target.c.inc
@@ -1381,6 +1381,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rri = tgen_addi,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -1717,6 +1734,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
index 9a5ca9c778..bba96d7a19 100644
--- a/tcg/tci/tcg-target.c.inc
+++ b/tcg/tci/tcg-target.c.inc
@@ -573,6 +573,23 @@  static const TCGOutOpBinary outop_add = {
     .out_rrr = tgen_add,
 };
 
+static const TCGOutOpBinary outop_addco = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_addci = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpBinary outop_addcio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_carry(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_and(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {
@@ -893,6 +910,23 @@  static const TCGOutOpSubtract outop_sub = {
     .out_rrr = tgen_sub,
 };
 
+static const TCGOutOpAddSubCarry outop_subbo = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbi = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static const TCGOutOpAddSubCarry outop_subbio = {
+    .base.static_constraint = C_NotImplemented,
+};
+
+static void tcg_out_set_borrow(TCGContext *s)
+{
+    g_assert_not_reached();
+}
+
 static void tgen_xor(TCGContext *s, TCGType type,
                      TCGReg a0, TCGReg a1, TCGReg a2)
 {