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);