On Fri, Nov 8, 2024 at 10:41 AM Hu, Lin1 <lin1...@intel.com> 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);

Reply via email to