On Fri, Nov 8, 2024 at 10:41 AM Hu, Lin1 <[email protected]> wrote:
>
> Hi, all
>
> -maddress-mode=long will let Pmode = DI_mode, but -mx32 request x32 ABI.
> So raise an error to avoid ICE.
>
> Bootstrapped and regtested, OK for trunk?
>
> BRs,
> Lin
>
> gcc/ChangeLog:
>
> PR target/117418
> * config/i386/i386-options.cc (ix86_option_override_internal): raise
> an
> error with option -mx32 -maddress-mode=long.
>
> gcc/testsuite/ChangeLog:
>
> PR target/117418
> * gcc.target/i386/pr117418-1.c: New test.
> ---
> gcc/config/i386/i386-options.cc | 4 ++++
> gcc/testsuite/gcc.target/i386/pr117418-1.c | 13 +++++++++++++
> 2 files changed, 17 insertions(+)
> create mode 100644 gcc/testsuite/gcc.target/i386/pr117418-1.c
>
> diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
> index 239269ecbdd..ba1abea2537 100644
> --- a/gcc/config/i386/i386-options.cc
> +++ b/gcc/config/i386/i386-options.cc
> @@ -2190,6 +2190,10 @@ ix86_option_override_internal (bool main_args_p,
> error ("address mode %qs not supported in the %s bit mode",
> TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "short" : "long",
> TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "64" : "32");
> +
> + if (TARGET_X32_P (opts->x_ix86_isa_flags)
> + && opts_set->x_ix86_pmode == PMODE_DI)
> + error ("address mode 'long' not supported in the x32 ABI");
This looks wrong. Try the encoded patch.
> }
> else
> opts->x_ix86_pmode = TARGET_LP64_P (opts->x_ix86_isa_flags)
> diff --git a/gcc/testsuite/gcc.target/i386/pr117418-1.c
> b/gcc/testsuite/gcc.target/i386/pr117418-1.c
> new file mode 100644
> index 00000000000..08430ef9d4b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr117418-1.c
> @@ -0,0 +1,13 @@
> +/* PR target/117418 */
> +/* { dg-do compile } */
> +/* { dg-options "-maddress-mode=long -mwidekl -mx32" } */
> +/* { dg-error "address mode 'long' not supported in the x32 ABI" "" { target
> *-*-* } 0 } */
> +
> +typedef __attribute__((__vector_size__(16))) long long V;
> +V a;
> +
> +void
> +foo()
> +{
> + __builtin_ia32_encodekey256_u32(0, a, a, &a);
> +}
> --
> 2.31.1
>
--
H.J.
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 5c4a8e07d62..a6e6e738a52 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -14064,6 +14064,9 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
op1 = expand_normal (arg1);
op2 = expand_normal (arg2);
+ if (GET_MODE (op1) != Pmode)
+ op1 = convert_to_mode (Pmode, op1, 1);
+
if (!address_operand (op2, VOIDmode))
{
op2 = convert_memory_address (Pmode, op2);
@@ -14099,6 +14102,9 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
emit_label (ok_label);
emit_insn (gen_rtx_SET (target, pat));
+ if (GET_MODE (op0) != Pmode)
+ op0 = convert_to_mode (Pmode, op0, 1);
+
for (i = 0; i < 8; i++)
{
op = gen_rtx_MEM (V2DImode,
@@ -14123,6 +14129,9 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
if (!REG_P (op0))
op0 = copy_to_mode_reg (SImode, op0);
+ if (GET_MODE (op2) != Pmode)
+ op2 = convert_to_mode (Pmode, op2, 1);
+
op = gen_rtx_REG (V2DImode, GET_SSE_REGNO (0));
emit_move_insn (op, op1);
@@ -14160,6 +14169,9 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
if (!REG_P (op0))
op0 = copy_to_mode_reg (SImode, op0);
+ if (GET_MODE (op3) != Pmode)
+ op3 = convert_to_mode (Pmode, op3, 1);
+
/* Force to use xmm0, xmm1 for keylow, keyhi*/
op = gen_rtx_REG (V2DImode, GET_SSE_REGNO (0));
emit_move_insn (op, op1);