[{"id":3677722,"web_url":"http://patchwork.ozlabs.org/comment/3677722/","msgid":"<944D438D-1671-470C-A685-1B91565185CA@suse.de>","list_archive_url":null,"date":"2026-04-15T15:14:12","subject":"Re: [PATCH] bitintlower, v2: Padding bit fixes, part 1 [PR123635]","submitter":{"id":4338,"url":"http://patchwork.ozlabs.org/api/people/4338/","name":"Richard Biener","email":"rguenther@suse.de"},"content":"> Am 15.04.2026 um 16:15 schrieb Jakub Jelinek <jakub@redhat.com>:\n> \n> ﻿On Wed, Apr 15, 2026 at 01:05:17PM +0200, Richard Biener wrote:\n>>> Bootstrapped/regtested on x86_64-linux, i686-linux, aarch64-linux and\n>>> s390x-linux, ok for trunk if somebody tests this on arm-linux-gnueabi or\n>>> riscv*-linux?\n>> \n>> OK, but can we use an enum for the extend type please?\n> \n> So like this?\n\nYes, OK\n\nRichard \n\n> 2026-04-15  Jakub Jelinek  <jakub@redhat.com>\n> \n>    PR middle-end/123635\n>    * target.h (enum bitint_ext): New.\n>    (struct bitint_info): Change extend type from bool to enum bitint_ext\n>    and document it.\n>    * gimple-lower-bitint.cc (bitint_extended): Change type from bool\n>    to enum bitint_ext.\n>    (bitint_precision_kind): Change bitint_extended to bitint_ext_partial\n>    from bitint_ext_full if limb_mode is the same as abi_limb_mode.\n>    (bitint_large_huge::limb_access_type): For\n>    bitint_extended == bitint_ext_full allow access to the most\n>    significant limb solely with padding bits if present.\n>    (bitint_large_huge::lower_mergeable_stmt): Handle\n>    bitint_extended == bitint_ext_full extension if needed.\n>    (bitint_large_huge::lower_muldiv_stmt): Likewise.\n>    (bitint_large_huge::lower_float_conv_stmt): Likewise.\n>    * config/aarch64/aarch64.cc (aarch64_bitint_type_info): Set\n>    info->extended to bitint_ext_undef rather than false.\n>    * config/arm/arm.cc (arm_bitint_type_info): Set\n>    info->extended to bitint_ext_full rather than true.\n>    * config/i386/i386.cc (ix86_bitint_type_info): Set\n>    info->extended to bitint_ext_undef rather than false.\n>    * config/loongarch/loongarch.cc (loongarch_bitint_type_info): Set\n>    info->extended to bitint_ext_partial rather than true.\n>    * config/riscv/riscv.cc (riscv_bitint_type_info): Set\n>    info->extended to bitint_ext_full rather than true.\n>    * config/s390/s390.cc (s390_bitint_type_info): Likewise.\n> \n>    * gcc.dg/bitintext.h: Handle __riscv__ like __arm__.\n>    * gcc.dg/torture/bitint-86.c: New test.\n>    * gcc.dg/torture/bitint-87.c: New test.\n> \n> --- gcc/target.h.jj    2026-03-27 10:17:14.548323983 +0100\n> +++ gcc/target.h    2026-04-15 16:09:18.525546771 +0200\n> @@ -68,13 +68,22 @@ union cumulative_args_t { void *p; };\n> \n> #endif /* !CHECKING_P */\n> \n> +/* Values for bitint_info::extended below.  */\n> +\n> +enum bitint_ext { bitint_ext_undef, bitint_ext_partial, bitint_ext_full };\n> +\n> /* Target properties of _BitInt(N) type.  _BitInt(N) is to be represented\n>    as series of abi_limb_mode CEIL (N, GET_MODE_PRECISION (abi_limb_mode))\n>    limbs, ordered from least significant to most significant if !big_endian,\n>    otherwise from most significant to least significant.  If extended is\n> -   false, the bits above or equal to N are undefined when stored in a register\n> -   or memory, otherwise they are zero or sign extended depending on if\n> -   it is unsigned _BitInt(N) or _BitInt(N) / signed _BitInt(N).\n> +   bitint_ext_undef, the bits above or equal to N are undefined when stored in\n> +   a register or memory, if extended is bitint_ext_full, they are zero or sign\n> +   extended depending on if it is unsigned _BitInt(N) or\n> +   _BitInt(N) / signed _BitInt(N), if extended is bitint_ext_partial, then bits\n> +   above or equal to N and below\n> +   M = CEIL (N, GET_MODE_PRECISION (limb_mode)) * GET_MODE_PRECISION (limb_mode)\n> +   are zero or sign extended as specified above and bits above or equal to M\n> +   are undefined.\n>    limb_mode is either the same as abi_limb_mode, or some narrower mode\n>    in which _BitInt lowering should actually perform operations in and\n>    what libgcc _BitInt helpers should use.\n> @@ -87,7 +96,7 @@ union cumulative_args_t { void *p; };\n> struct bitint_info {\n>   machine_mode abi_limb_mode, limb_mode;\n>   bool big_endian;\n> -  bool extended;\n> +  enum bitint_ext extended;\n> };\n> \n> /* Types of memory operation understood by the \"by_pieces\" infrastructure.\n> --- gcc/gimple-lower-bitint.cc.jj    2026-04-14 09:27:02.221287531 +0200\n> +++ gcc/gimple-lower-bitint.cc    2026-04-14 18:45:43.191371265 +0200\n> @@ -77,7 +77,8 @@ enum bitint_prec_kind {\n> \n> static int small_max_prec, mid_min_prec, large_min_prec, huge_min_prec;\n> static int limb_prec, abi_limb_prec;\n> -static bool bitint_big_endian, bitint_extended;\n> +static bool bitint_big_endian;\n> +static enum bitint_ext bitint_extended;\n> \n> /* Categorize _BitInt(PREC) as small, middle, large or huge.  */\n> \n> @@ -104,6 +105,8 @@ bitint_precision_kind (int prec)\n>     }\n>   bitint_big_endian = info.big_endian;\n>   bitint_extended = info.extended;\n> +  if (info.limb_mode == info.abi_limb_mode && bitint_extended == bitint_ext_full)\n> +    bitint_extended = bitint_ext_partial;\n>   if (!large_min_prec\n>       && GET_MODE_PRECISION (limb_mode) <= MAX_FIXED_MODE_SIZE)\n>     large_min_prec = MAX_FIXED_MODE_SIZE + 1;\n> @@ -599,7 +602,11 @@ bitint_large_huge::limb_access_type (tre\n>     return m_limb_type;\n>   unsigned HOST_WIDE_INT i = tree_to_uhwi (idx);\n>   unsigned int prec = TYPE_PRECISION (type);\n> -  gcc_assert (i * limb_prec < prec);\n> +  gcc_assert (i * limb_prec < prec\n> +          || (bitint_extended == bitint_ext_full\n> +          && abi_limb_prec > limb_prec\n> +          && i * limb_prec\n> +             < CEIL (prec, abi_limb_prec) * abi_limb_prec));\n>   if (bitint_big_endian\n>       ? (i != 0 || (prec % limb_prec) == 0)\n>       : (i + 1) * limb_prec <= prec)\n> @@ -2870,6 +2877,16 @@ bitint_large_huge::lower_mergeable_stmt\n>     = (prec != (unsigned) TYPE_PRECISION (type)\n>        && (CEIL ((unsigned) TYPE_PRECISION (type), limb_prec)\n>       > CEIL (prec, limb_prec)));\n> +  if (bitint_extended == bitint_ext_full\n> +      && !eq_p\n> +      && abi_limb_prec > limb_prec\n> +      && ((CEIL ((unsigned) TYPE_PRECISION (type), abi_limb_prec)\n> +       * abi_limb_prec / limb_prec) > CEIL (prec, limb_prec)))\n> +    {\n> +      if (prec == (unsigned) TYPE_PRECISION (type))\n> +    sext = !TYPE_UNSIGNED (type);\n> +      separate_ext = true;\n> +    }\n>   unsigned dst_idx_off = 0;\n>   if (separate_ext && bitint_big_endian)\n>     dst_idx_off = (CEIL ((unsigned) TYPE_PRECISION (type), limb_prec)\n> @@ -3107,6 +3124,11 @@ bitint_large_huge::lower_mergeable_stmt\n>       kind = bitint_precision_kind (type);\n>       unsigned start = CEIL (prec, limb_prec);\n>       prec = TYPE_PRECISION (type);\n> +      if (bitint_extended == bitint_ext_full && abi_limb_prec > limb_prec)\n> +    {\n> +      prec = CEIL (prec, abi_limb_prec) * abi_limb_prec;\n> +      kind = bitint_precision_kind (prec);\n> +    }\n>       unsigned total = CEIL (prec, limb_prec);\n>       idx = idx_first = idx_next = NULL_TREE;\n>       if (prec <= (start + 2 + (bo_shift != 0)) * limb_prec)\n> @@ -3964,6 +3986,7 @@ bitint_large_huge::lower_muldiv_stmt (tr\n>   gcc_assert (TREE_CODE (type) == BITINT_TYPE\n>          && bitint_precision_kind (type) >= bitint_prec_large);\n>   int prec = TYPE_PRECISION (type), prec1, prec2;\n> +  bool zero_ms_limb = false;\n>   rhs1 = handle_operand_addr (rhs1, stmt, NULL, &prec1);\n>   rhs2 = handle_operand_addr (rhs2, stmt, NULL, &prec2);\n>   if (obj == NULL_TREE)\n> @@ -3979,6 +4002,18 @@ bitint_large_huge::lower_muldiv_stmt (tr\n>       lhs = force_gimple_operand_gsi (&m_gsi, lhs, true,\n>                      NULL_TREE, true, GSI_SAME_STMT);\n>     }\n> +  if (bitint_extended == bitint_ext_full\n> +      && abi_limb_prec > limb_prec\n> +      && (CEIL (prec, abi_limb_prec) * abi_limb_prec\n> +      > CEIL (prec, limb_prec) * limb_prec))\n> +    {\n> +      /* unsigned multiplication needs to wrap around, so we can't\n> +     increase prec.  */\n> +      if (rhs_code == MULT_EXPR && TYPE_UNSIGNED (type))\n> +    zero_ms_limb = true;\n> +      else\n> +    prec = CEIL (prec, abi_limb_prec) * abi_limb_prec;\n> +    }\n>   tree sitype = lang_hooks.types.type_for_mode (SImode, 0);\n>   gimple *g;\n>   switch (rhs_code)\n> @@ -4032,6 +4067,13 @@ bitint_large_huge::lower_muldiv_stmt (tr\n>      add_eh_edge (e2->src, e1);\n>    }\n>     }\n> +  if (zero_ms_limb)\n> +    {\n> +      unsigned int i = CEIL (prec, abi_limb_prec) * abi_limb_prec / limb_prec;\n> +      g = gimple_build_assign (limb_access (type, obj, size_int (i - 1), true),\n> +                   build_zero_cst (m_limb_type));\n> +      insert_before (g);\n> +    }\n> }\n> \n> /* Lower large/huge _BitInt conversion to/from floating point.  */\n> @@ -4046,8 +4088,15 @@ bitint_large_huge::lower_float_conv_stmt\n>   gimple *g;\n>   if (rhs_code == FIX_TRUNC_EXPR)\n>     {\n> -      int prec = TYPE_PRECISION (TREE_TYPE (lhs));\n> -      if (!TYPE_UNSIGNED (TREE_TYPE (lhs)))\n> +      tree type = TREE_TYPE (lhs);\n> +      int prec = TYPE_PRECISION (type);\n> +      bool extend_ms_limb = false;\n> +      if (bitint_extended == bitint_ext_full\n> +      && abi_limb_prec > limb_prec\n> +      && (CEIL (prec, abi_limb_prec) * abi_limb_prec\n> +          > CEIL (prec, limb_prec) * limb_prec))\n> +    extend_ms_limb = true;\n> +      if (!TYPE_UNSIGNED (type))\n>    prec = -prec;\n>       if (obj == NULL_TREE)\n>    {\n> @@ -4081,6 +4130,32 @@ bitint_large_huge::lower_float_conv_stmt\n>                      lhs, build_int_cst (sitype, prec),\n>                      rhs1);\n>       insert_before (g);\n> +      if (extend_ms_limb)\n> +    {\n> +      unsigned int i\n> +        = (CEIL (prec < 0 ? -prec : prec, abi_limb_prec)\n> +           * abi_limb_prec / limb_prec);\n> +      tree val;\n> +      if (prec < 0)\n> +        {\n> +          g = gimple_build_assign (make_ssa_name (m_limb_type),\n> +                       limb_access (type, obj,\n> +                            size_int (i - 2),\n> +                            true));\n> +          insert_before (g);\n> +          g = gimple_build_assign (make_ssa_name (m_limb_type),\n> +                       RSHIFT_EXPR, gimple_assign_lhs (g),\n> +                       build_int_cst (unsigned_type_node,\n> +                              limb_prec - 1));\n> +          insert_before (g);\n> +          val = gimple_assign_lhs (g);\n> +        }\n> +      else\n> +        val = build_zero_cst (m_limb_type);\n> +      g = gimple_build_assign (limb_access (type, obj, size_int (i - 1),\n> +                        true), val);\n> +      insert_before (g);\n> +    }\n>     }\n>   else\n>     {\n> --- gcc/config/aarch64/aarch64.cc.jj    2026-04-10 08:45:20.699812103 +0200\n> +++ gcc/config/aarch64/aarch64.cc    2026-04-14 13:05:23.358474454 +0200\n> @@ -30497,7 +30497,7 @@ aarch64_bitint_type_info (int n, struct\n>   else\n>     info->abi_limb_mode = info->limb_mode;\n>   info->big_endian = TARGET_BIG_END;\n> -  info->extended = false;\n> +  info->extended = bitint_ext_undef;\n>   return true;\n> }\n> \n> --- gcc/config/arm/arm.cc.jj    2026-03-30 11:56:53.023841345 +0200\n> +++ gcc/config/arm/arm.cc    2026-04-14 13:05:31.620334159 +0200\n> @@ -35933,7 +35933,7 @@ arm_bitint_type_info (int n, struct biti\n>   else\n>     info->abi_limb_mode = info->limb_mode;\n>   info->big_endian = TARGET_BIG_END;\n> -  info->extended = true;\n> +  info->extended = bitint_ext_full;\n>   return true;\n> }\n> \n> --- gcc/config/i386/i386.cc.jj    2026-04-14 08:39:48.626636548 +0200\n> +++ gcc/config/i386/i386.cc    2026-04-14 13:05:37.917227233 +0200\n> @@ -27719,7 +27719,7 @@ ix86_bitint_type_info (int n, struct bit\n>     info->limb_mode = DImode;\n>   info->abi_limb_mode = info->limb_mode;\n>   info->big_endian = false;\n> -  info->extended = false;\n> +  info->extended = bitint_ext_undef;\n>   return true;\n> }\n> \n> --- gcc/config/loongarch/loongarch.cc.jj    2026-04-02 14:18:31.926538351 +0200\n> +++ gcc/config/loongarch/loongarch.cc    2026-04-14 13:05:41.762161943 +0200\n> @@ -11391,7 +11391,7 @@ loongarch_bitint_type_info (int n, struc\n>     info->abi_limb_mode = TImode;\n> \n>   info->big_endian = false;\n> -  info->extended = true;\n> +  info->extended = bitint_ext_partial;\n>   return true;\n> }\n> \n> --- gcc/config/riscv/riscv.cc.jj    2026-04-10 08:45:20.701812067 +0200\n> +++ gcc/config/riscv/riscv.cc    2026-04-14 13:05:46.023089589 +0200\n> @@ -14926,7 +14926,7 @@ riscv_bitint_type_info (int n, struct bi\n>     info->abi_limb_mode = DImode;\n> \n>   info->big_endian = TARGET_BIG_ENDIAN;\n> -  info->extended = true;\n> +  info->extended = bitint_ext_full;\n>   return true;\n> }\n> \n> --- gcc/config/s390/s390.cc.jj    2026-04-01 19:09:38.325343788 +0200\n> +++ gcc/config/s390/s390.cc    2026-04-14 13:05:49.527030090 +0200\n> @@ -18851,7 +18851,7 @@ s390_bitint_type_info (int n, struct bit\n>     info->limb_mode = DImode;\n>   info->abi_limb_mode = info->limb_mode;\n>   info->big_endian = true;\n> -  info->extended = true;\n> +  info->extended = bitint_ext_full;\n>   return true;\n> }\n> \n> --- gcc/testsuite/gcc.dg/bitintext.h.jj    2026-03-27 10:17:16.871286076 +0100\n> +++ gcc/testsuite/gcc.dg/bitintext.h    2026-04-14 12:26:15.243964985 +0200\n> @@ -16,7 +16,7 @@ do_copy (void *p, const void *q, __SIZE_\n> #define CEIL(x,y) (((x) + (y) - 1) / (y))\n> \n> /* Promote a _BitInt type to include its padding bits.  */\n> -#if defined (__s390x__) || defined(__arm__)\n> +#if defined (__s390x__) || defined(__arm__) || defined(__riscv__)\n> #define PROMOTED_SIZE(x) sizeof (x)\n> #elif defined(__loongarch__)\n> #define PROMOTED_SIZE(x) (sizeof (x) > 8 ? CEIL (S (x), 64) * 8 : sizeof (x))\n> @@ -24,7 +24,8 @@ do_copy (void *p, const void *q, __SIZE_\n> \n> /* Macro to test whether (on targets where psABI requires it) _BitInt\n>    with padding bits have those filled with sign or zero extension.  */\n> -#if defined(__s390x__) || defined(__arm__) || defined(__loongarch__)\n> +#if defined(__s390x__) || defined(__arm__) || defined(__loongarch__) \\\n> +    || defined(__riscv__)\n> #define BEXTC1(x, uns) \\\n>   do {                              \\\n>     uns _BitInt(PROMOTED_SIZE (x) * __CHAR_BIT__) __x;      \\\n> --- gcc/testsuite/gcc.dg/torture/bitint-86.c.jj    2026-04-14 13:52:03.448042878 +0200\n> +++ gcc/testsuite/gcc.dg/torture/bitint-86.c    2026-04-14 15:49:40.833426638 +0200\n> @@ -0,0 +1,96 @@\n> +/* PR middle-end/123635 */\n> +/* { dg-do run { target bitint } } */\n> +/* { dg-require-effective-target sync_char_short } */\n> +/* { dg-options \"-std=c23 -pedantic-errors\" } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests }  { \"*\" } { \"-O0\" \"-O2\" } } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests } { \"-flto\" } { \"\" } } */\n> +\n> +#if __BITINT_MAXWIDTH__ >= 1025\n> +_BitInt(513) a, b, c, d;\n> +unsigned _BitInt(513) e, f, g, h;\n> +_BitInt(1025) i, j, k, l;\n> +unsigned _BitInt(1025) m, n, o, p;\n> +#endif\n> +\n> +#include \"../bitintext.h\"\n> +\n> +#if __BITINT_MAXWIDTH__ >= 1025\n> +[[gnu::noipa]] void\n> +f1 (_BitInt(513) q, _BitInt(513) r, _BitInt(513) s,\n> +    unsigned _BitInt(513) t, unsigned _BitInt(513) u, unsigned _BitInt(513) v)\n> +{\n> +  a = q + r;\n> +  BEXTC (a);\n> +  b = r + s;\n> +  BEXTC (b);\n> +  c = q - r;\n> +  BEXTC (c);\n> +  d = q - s;\n> +  BEXTC (d);\n> +  e = t + u;\n> +  BEXTC (e);\n> +  f = u + v;\n> +  BEXTC (f);\n> +  g = t - u;\n> +  BEXTC (g);\n> +  h = t - v;\n> +  BEXTC (h);\n> +}\n> +\n> +[[gnu::noipa]] void\n> +f2 (_BitInt(513) q, _BitInt(513) r, _BitInt(513) s,\n> +    unsigned _BitInt(513) t, unsigned _BitInt(513) u, unsigned _BitInt(513) v)\n> +{\n> +  i = q + r;\n> +  BEXTC (i);\n> +  j = r + s;\n> +  BEXTC (j);\n> +  k = q - r;\n> +  BEXTC (k);\n> +  l = q - s;\n> +  BEXTC (l);\n> +  m = t + u;\n> +  BEXTC (m);\n> +  n = u + v;\n> +  BEXTC (n);\n> +  o = t - u;\n> +  BEXTC (o);\n> +  p = t - v;\n> +  BEXTC (p);\n> +}\n> +#endif\n> +\n> +int\n> +main ()\n> +{\n> +#if __BITINT_MAXWIDTH__ >= 1025\n> +  __builtin_memset (&a, 0x55, sizeof (a));\n> +  __builtin_memset (&b, 0xaa, sizeof (b));\n> +  __builtin_memset (&c, 0x55, sizeof (c));\n> +  __builtin_memset (&d, 0xaa, sizeof (d));\n> +  __builtin_memset (&e, 0x55, sizeof (e));\n> +  __builtin_memset (&f, 0xaa, sizeof (f));\n> +  __builtin_memset (&g, 0x55, sizeof (g));\n> +  __builtin_memset (&h, 0xaa, sizeof (h));\n> +  f1 (-2639616085193412675089727272130019765984398127278861998378045997173219392866835944828454559654047247059773556852593471531433454810831298259785611283536204wb,\n> +      -7234121192495298112713936268702056205915537824658323839255206188456944966709752205781440683757949161649123152428620619997014209098183677328840647884700332wb,\n> +      8654283549227219676537451326576929768614001427323560383705131223498505581982738964879437520020436012891649083646965651378407397436785749860023553778646861wb,\n> +      15046745594550617619205422464231805109110883864578289024439083517871820578179553927615539526791313634437787081814763432804808038115388367331529035246240655uwb,\n> +      20633637828717837096174917874088391607464281656818868213468970773994599068609617673436080725569780340050358299419252926775025136778754971701553110169281151uwb,\n> +      513612209045189503622076474995216606086383139671427104179978688982034117764664711277072795083902951564358998498109412142322138933760173628255697435284781uwb);\n> +  __builtin_memset (&i, 0x55, sizeof (i));\n> +  __builtin_memset (&j, 0xaa, sizeof (j));\n> +  __builtin_memset (&k, 0x55, sizeof (k));\n> +  __builtin_memset (&l, 0xaa, sizeof (l));\n> +  __builtin_memset (&m, 0x55, sizeof (m));\n> +  __builtin_memset (&n, 0xaa, sizeof (n));\n> +  __builtin_memset (&o, 0x55, sizeof (o));\n> +  __builtin_memset (&p, 0xaa, sizeof (p));\n> +  f2 (-2639616085193412675089727272130019765984398127278861998378045997173219392866835944828454559654047247059773556852593471531433454810831298259785611283536204wb,\n> +      -7234121192495298112713936268702056205915537824658323839255206188456944966709752205781440683757949161649123152428620619997014209098183677328840647884700332wb,\n> +      8654283549227219676537451326576929768614001427323560383705131223498505581982738964879437520020436012891649083646965651378407397436785749860023553778646861wb,\n> +      15046745594550617619205422464231805109110883864578289024439083517871820578179553927615539526791313634437787081814763432804808038115388367331529035246240655uwb,\n> +      20633637828717837096174917874088391607464281656818868213468970773994599068609617673436080725569780340050358299419252926775025136778754971701553110169281151uwb,\n> +      513612209045189503622076474995216606086383139671427104179978688982034117764664711277072795083902951564358998498109412142322138933760173628255697435284781uwb);\n> +#endif\n> +}\n> --- gcc/testsuite/gcc.dg/torture/bitint-87.c.jj    2026-04-14 15:48:02.591099982 +0200\n> +++ gcc/testsuite/gcc.dg/torture/bitint-87.c    2026-04-14 15:56:45.479193714 +0200\n> @@ -0,0 +1,85 @@\n> +/* PR middle-end/123635 */\n> +/* { dg-do run { target bitint } } */\n> +/* { dg-require-effective-target sync_char_short } */\n> +/* { dg-options \"-std=c23 -pedantic-errors\" } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests }  { \"*\" } { \"-O0\" \"-O2\" } } */\n> +/* { dg-skip-if \"\" { ! run_expensive_tests } { \"-flto\" } { \"\" } } */\n> +\n> +#if __BITINT_MAXWIDTH__ >= 513\n> +_BitInt(513) a, b, c, d;\n> +unsigned _BitInt(513) e, f, g, h;\n> +_BitInt(513) i, j, k;\n> +unsigned _BitInt(513) l, m, n;\n> +#endif\n> +\n> +#include \"../bitintext.h\"\n> +\n> +#if __BITINT_MAXWIDTH__ >= 513\n> +[[gnu::noipa]] void\n> +f1 (_BitInt(513) q, _BitInt(513) r, _BitInt(513) s,\n> +    unsigned _BitInt(513) t, unsigned _BitInt(513) u, unsigned _BitInt(513) v)\n> +{\n> +  a = q * r;\n> +  BEXTC (a);\n> +  b = r * s;\n> +  BEXTC (b);\n> +  c = q / r;\n> +  BEXTC (c);\n> +  d = q / s;\n> +  BEXTC (d);\n> +  e = t * u;\n> +  BEXTC (e);\n> +  f = u * v;\n> +  BEXTC (f);\n> +  g = t / u;\n> +  BEXTC (g);\n> +  h = t / v;\n> +  BEXTC (h);\n> +}\n> +\n> +[[gnu::noipa]] void\n> +f2 (float q, double r, long double s, float t, double u, long double v)\n> +{\n> +  i = q;\n> +  BEXTC (i);\n> +  j = r;\n> +  BEXTC (j);\n> +  k = s;\n> +  BEXTC (k);\n> +  l = t;\n> +  BEXTC (l);\n> +  m = u;\n> +  BEXTC (m);\n> +  n = v;\n> +  BEXTC (n);\n> +}\n> +#endif\n> +\n> +int\n> +main ()\n> +{\n> +#if __BITINT_MAXWIDTH__ >= 513\n> +  __builtin_memset (&a, 0x55, sizeof (a));\n> +  __builtin_memset (&b, 0xaa, sizeof (b));\n> +  __builtin_memset (&c, 0x55, sizeof (c));\n> +  __builtin_memset (&d, 0xaa, sizeof (d));\n> +  __builtin_memset (&e, 0x55, sizeof (e));\n> +  __builtin_memset (&f, 0xaa, sizeof (f));\n> +  __builtin_memset (&g, 0x55, sizeof (g));\n> +  __builtin_memset (&h, 0xaa, sizeof (h));\n> +  f1 (-53323980256963787505256507743137477556434962931963225515943461794698643113423wb,\n> +      -10076482373458251489901780456236592759327822657780415144730546867053397315531wb,\n> +      9430367348600775477158545473775377451258484445522540280907903691748059121081wb,\n> +      15046745594550617619205422464231805109110883864578289024439083517871820578179553927615539526791313634437787081814763432804808038115388367331529035246240655uwb,\n> +      20633637828717837096174917874088391607464281656818868213468970773994599068609617673436080725569780340050358299419252926775025136778754971701553110169281uwb,\n> +      5136122090451895036220764749952166060863831396714271041799786889820341177646647112770727950839029515643589984981094121423221389337601736282556974uwb);\n> +  __builtin_memset (&i, 0x55, sizeof (i));\n> +  __builtin_memset (&j, 0xaa, sizeof (j));\n> +  __builtin_memset (&k, 0x55, sizeof (k));\n> +  __builtin_memset (&l, 0xaa, sizeof (l));\n> +  __builtin_memset (&m, 0x55, sizeof (m));\n> +  __builtin_memset (&n, 0xaa, sizeof (n));\n> +  f2 (12345678.5f, -234567891234567.125, 123465987893275.53244532L,\n> +      12345678.5f, 234567891234567.125, 123465987893275.53244532L);\n> +#endif\n> +}\n> \n> \n>    Jakub\n>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=w9GgQ9Md;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=SAb2WLO8;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=w9GgQ9Md;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=SAb2WLO8;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256\n header.s=susede2_rsa header.b=w9GgQ9Md;\n\tdkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=SAb2WLO8;\n\tdkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de\n header.a=rsa-sha256 header.s=susede2_rsa header.b=w9GgQ9Md;\n\tdkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256\n header.s=susede2_ed25519 header.b=SAb2WLO8","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=suse.de","sourceware.org; spf=pass smtp.mailfrom=suse.de","server2.sourceware.org;\n arc=none smtp.remote-ip=195.135.223.131","smtp-out2.suse.de;\n dkim=pass header.d=suse.de header.s=susede2_rsa header.b=w9GgQ9Md;\n dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=SAb2WLO8"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fwl7Q42j7z1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 01:14:57 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 67D9E4BA2E2B\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 15:14:55 +0000 (GMT)","from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131])\n by sourceware.org (Postfix) with ESMTPS id 940D24BA2E0A\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 15:14:24 +0000 (GMT)","from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org\n [IPv6:2a07:de40:b281:104:10:150:64:97])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by smtp-out2.suse.de (Postfix) with ESMTPS id 2147E5BD82;\n Wed, 15 Apr 2026 15:14:23 +0000 (UTC)","from imap1.dmz-prg2.suse.org (localhost [127.0.0.1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 0C6CE4BA8B;\n Wed, 15 Apr 2026 15:14:23 +0000 (UTC)","from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167])\n by imap1.dmz-prg2.suse.org with ESMTPSA id w9gEA0+r32n6TQAAD6G6ig\n (envelope-from <rguenther@suse.de>); Wed, 15 Apr 2026 15:14:23 +0000"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 67D9E4BA2E2B","OpenDKIM Filter v2.11.0 sourceware.org 940D24BA2E0A"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 940D24BA2E0A","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 940D24BA2E0A","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776266064; cv=none;\n b=V2MNCIZ+kVuOWx1asuWj5OylVDn//f4Kc6RsIb7Uig+xombF7jVK2CtdlpbqqKRUq+hikO68ehw9nr08fTj+0TvAOaAmzTtbc+4OR6XgjjztK1J0xW0GS0ghzlpZprSC3f4WV9JSGsRJ8wANzChUQlsSW5YnWPoZQvdJKMYh6VI=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776266064; c=relaxed/simple;\n bh=zzeQrEsKegc4dGnPi/bgRdeFtuvu61s6CBgBuamtbTY=;\n h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From:\n Mime-Version:Subject:Date:Message-Id:To;\n b=cTPeSzcV163q00EEY9tB065aZi4bgJDqiKpfyOVnH6gJjguZmfaN3l3q5qXQc33lOZ2AEdjcq9AH/ZfWntK+IeFZ/YbMF1851sIiKDeVCFZ3oiOQqXat7E2NYZdJh7aB3ezPFCdAmC7AFIzHy7cDHVGZIcReOMVHB8cov/7E1qo=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776266063;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=H0hwYAMWJsfjaRD02vpueRcngrcKAUt5vqI0NuZNmNQ=;\n b=w9GgQ9MdQOCjRVnmZS0U+RODOEVsEpYWvuGF3Nll+SQfN4nT9jxQY15VcYofiJNtpsTmzw\n tUbBreJeV1zU1OwlPRnr8tl86YzzjuSx+Iy+xnCsYwk+4vZC4rxebsFiMSRcxjIl6S9d4P\n pE4SgnLnZb4e0sEN20NO2JuCFnSb3q8=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776266063;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=H0hwYAMWJsfjaRD02vpueRcngrcKAUt5vqI0NuZNmNQ=;\n b=SAb2WLO8mJwIaIywXYl/2DMgBneojq3f9BrYs0tc2/vXY2yjkxGT5pQ1L35dtl6XlfLq8o\n OkNvcS8ERIss3ABw==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_rsa;\n t=1776266063;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=H0hwYAMWJsfjaRD02vpueRcngrcKAUt5vqI0NuZNmNQ=;\n b=w9GgQ9MdQOCjRVnmZS0U+RODOEVsEpYWvuGF3Nll+SQfN4nT9jxQY15VcYofiJNtpsTmzw\n tUbBreJeV1zU1OwlPRnr8tl86YzzjuSx+Iy+xnCsYwk+4vZC4rxebsFiMSRcxjIl6S9d4P\n pE4SgnLnZb4e0sEN20NO2JuCFnSb3q8=","v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de;\n s=susede2_ed25519; t=1776266063;\n h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc:\n mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=H0hwYAMWJsfjaRD02vpueRcngrcKAUt5vqI0NuZNmNQ=;\n b=SAb2WLO8mJwIaIywXYl/2DMgBneojq3f9BrYs0tc2/vXY2yjkxGT5pQ1L35dtl6XlfLq8o\n OkNvcS8ERIss3ABw=="],"Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","From":"Richard Biener <rguenther@suse.de>","Mime-Version":"1.0 (1.0)","Subject":"Re: [PATCH] bitintlower, v2: Padding bit fixes, part 1 [PR123635]","Date":"Wed, 15 Apr 2026 17:14:12 +0200","Message-Id":"<944D438D-1671-470C-A685-1B91565185CA@suse.de>","References":"<ad-dUojo7PeLr-t3@tucnak>","Cc":"gcc-patches@gcc.gnu.org,\n Andre Simoes Dias Vieira <andre.simoesdiasvieira@arm.com>,\n Dabbelt Palmer <palmer@dabbelt.com>, Robin Dapp <rdapp.gcc@gmail.com>","In-Reply-To":"<ad-dUojo7PeLr-t3@tucnak>","To":"Jakub Jelinek <jakub@redhat.com>","X-Mailer":"iPhone Mail (23E254)","X-Spamd-Result":"default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%];\n SUSPICIOUS_RECIPS(1.50)[]; NEURAL_HAM_LONG(-1.00)[-1.000];\n R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain];\n MX_GOOD(-0.01)[]; TO_MATCH_ENVRCPT_ALL(0.00)[];\n DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519];\n RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:104:10:150:64:97:from];\n ARC_NA(0.00)[];\n SPAMHAUS_XBL(0.00)[2a07:de40:b281:104:10:150:64:97:from];\n FUZZY_RATELIMITED(0.00)[rspamd.com]; TO_DN_SOME(0.00)[];\n MIME_TRACE(0.00)[0:+]; FREEMAIL_ENVRCPT(0.00)[gmail.com];\n FREEMAIL_CC(0.00)[gcc.gnu.org,arm.com,dabbelt.com,gmail.com];\n RCVD_TLS_ALL(0.00)[]; RCVD_COUNT_TWO(0.00)[2];\n MID_RHS_MATCH_FROM(0.00)[]; FROM_EQ_ENVFROM(0.00)[];\n FROM_HAS_DN(0.00)[]; RCPT_COUNT_FIVE(0.00)[5];\n RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:106:10:150:64:167:received];\n RCVD_VIA_SMTP_AUTH(0.00)[]; TAGGED_RCPT(0.00)[];\n DKIM_TRACE(0.00)[suse.de:+]; APPLE_IOS_MAILER_COMMON(0.00)[];\n DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:dkim, suse.de:mid,\n imap1.dmz-prg2.suse.org:helo, imap1.dmz-prg2.suse.org:rdns]","X-Rspamd-Action":"no action","X-Rspamd-Server":"rspamd1.dmz-prg2.suse.org","X-Rspamd-Queue-Id":"2147E5BD82","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]