Re: [PATCH] x86: Update constraints for APX NDD instructions

2024-02-07 Thread Hongtao Liu
On Tue, Feb 6, 2024 at 11:49 AM H.J. Lu  wrote:
>
> 1. The only supported TLS code sequence with ADD is
>
> addq foo@gottpoff(%rip),%reg
>
> Change je constraint to a memory operand in APX NDD ADD pattern with
> register source operand.
>
> 2. The instruction length of APX NDD instructions with immediate operand:
>
> op imm, mem, reg
>
> may exceed the size limit of 15 byes when non-default address space,
> segment register or address size prefix are used.
>
> Add jM constraint which is a memory operand valid for APX NDD instructions
> with immediate operand and add jO constraint which is an offsetable memory
> operand valid for APX NDD instructions with immediate operand.  Update
> APX NDD patterns with jM and jO constraints.
Ok.
>
> gcc/
>
> PR target/113711
> PR target/113733
> * config/i386/constraints.md: List all constraints with j prefix.
> (j>): Change auto-dec to auto-inc in documentation.
> (je): Changed to a memory constraint with APX NDD TLS operand
> check.
> (jM): New memory constraint for APX NDD instructions.
> (jO): Likewise.
> * config/i386/i386-protos.h (x86_poff_operand_p): Removed.
> * config/i386/i386.cc (x86_poff_operand_p): Likewise.
> * config/i386/i386.md (*add3_doubleword): Use rjO.
> (*add_1[SWI48]): Use je and jM.
> (addsi_1_zext): Use jM.
> (*addv4_doubleword_1[DWI]): Likewise.
> (*sub_1[SWI]): Use jM.
> (@add3_cc_overflow_1[SWI]): Likewise.
> (*add3_doubleword_cc_overflow_1): Use rjO.
> (*and3_doubleword): Likewise.
> (*anddi_1): Use jM.
> (*andsi_1_zext): Likewise.
> (*and_1[SWI24]): Likewise.
> (*3_doubleword[any_or]: Use rjO
> (*code_1[any_or SWI248]): Use jM.
> (*si_1_zext[zero_extend + any_or]): Likewise.
> * config/i386/predicates.md (apx_ndd_memory_operand): New.
> (apx_ndd_add_memory_operand): Likewise.
>
> gcc/testsuite/
>
> PR target/113711
> PR target/113733
> * gcc.target/i386/apx-ndd-2.c: New test.
> * gcc.target/i386/apx-ndd-base-index-1.c: Likewise.
> * gcc.target/i386/apx-ndd-no-seg-global-1.c: Likewise.
> * gcc.target/i386/apx-ndd-seg-1.c: Likewise.
> * gcc.target/i386/apx-ndd-seg-2.c: Likewise.
> * gcc.target/i386/apx-ndd-seg-3.c: Likewise.
> * gcc.target/i386/apx-ndd-seg-4.c: Likewise.
> * gcc.target/i386/apx-ndd-seg-5.c: Likewise.
> * gcc.target/i386/apx-ndd-tls-1a.c: Likewise.
> * gcc.target/i386/apx-ndd-tls-2.c: Likewise.
> * gcc.target/i386/apx-ndd-tls-3.c: Likewise.
> * gcc.target/i386/apx-ndd-tls-4.c: Likewise.
> * gcc.target/i386/apx-ndd-x32-1.c: Likewise.
> ---
>  gcc/config/i386/constraints.md|  36 -
>  gcc/config/i386/i386-protos.h |   1 -
>  gcc/config/i386/i386.cc   |  25 
>  gcc/config/i386/i386.md   | 129 +-
>  gcc/config/i386/predicates.md |  65 +
>  gcc/testsuite/gcc.target/i386/apx-ndd-2.c |  17 +++
>  .../gcc.target/i386/apx-ndd-base-index-1.c|  50 +++
>  .../gcc.target/i386/apx-ndd-no-seg-global-1.c |  74 ++
>  gcc/testsuite/gcc.target/i386/apx-ndd-seg-1.c |  98 +
>  gcc/testsuite/gcc.target/i386/apx-ndd-seg-2.c |  98 +
>  gcc/testsuite/gcc.target/i386/apx-ndd-seg-3.c |  14 ++
>  gcc/testsuite/gcc.target/i386/apx-ndd-seg-4.c |   9 ++
>  gcc/testsuite/gcc.target/i386/apx-ndd-seg-5.c |  13 ++
>  .../gcc.target/i386/apx-ndd-tls-1a.c  |  41 ++
>  gcc/testsuite/gcc.target/i386/apx-ndd-tls-2.c |  38 ++
>  gcc/testsuite/gcc.target/i386/apx-ndd-tls-3.c |  16 +++
>  gcc/testsuite/gcc.target/i386/apx-ndd-tls-4.c |  31 +
>  gcc/testsuite/gcc.target/i386/apx-ndd-x32-1.c |  49 +++
>  18 files changed, 712 insertions(+), 92 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-base-index-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-no-seg-global-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-3.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-4.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-5.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-1a.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-3.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-4.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-x32-1.c
>
> diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
> index 280e4c8e36c..64702d9c0a8 100644
> 

[PATCH] x86: Update constraints for APX NDD instructions

2024-02-05 Thread H.J. Lu
1. The only supported TLS code sequence with ADD is

addq foo@gottpoff(%rip),%reg

Change je constraint to a memory operand in APX NDD ADD pattern with
register source operand.

2. The instruction length of APX NDD instructions with immediate operand:

op imm, mem, reg

may exceed the size limit of 15 byes when non-default address space,
segment register or address size prefix are used.

Add jM constraint which is a memory operand valid for APX NDD instructions
with immediate operand and add jO constraint which is an offsetable memory
operand valid for APX NDD instructions with immediate operand.  Update
APX NDD patterns with jM and jO constraints.

gcc/

PR target/113711
PR target/113733
* config/i386/constraints.md: List all constraints with j prefix.
(j>): Change auto-dec to auto-inc in documentation.
(je): Changed to a memory constraint with APX NDD TLS operand
check.
(jM): New memory constraint for APX NDD instructions.
(jO): Likewise.
* config/i386/i386-protos.h (x86_poff_operand_p): Removed.
* config/i386/i386.cc (x86_poff_operand_p): Likewise.
* config/i386/i386.md (*add3_doubleword): Use rjO.
(*add_1[SWI48]): Use je and jM.
(addsi_1_zext): Use jM.
(*addv4_doubleword_1[DWI]): Likewise.
(*sub_1[SWI]): Use jM.
(@add3_cc_overflow_1[SWI]): Likewise.
(*add3_doubleword_cc_overflow_1): Use rjO.
(*and3_doubleword): Likewise.
(*anddi_1): Use jM.
(*andsi_1_zext): Likewise.
(*and_1[SWI24]): Likewise.
(*3_doubleword[any_or]: Use rjO
(*code_1[any_or SWI248]): Use jM.
(*si_1_zext[zero_extend + any_or]): Likewise.
* config/i386/predicates.md (apx_ndd_memory_operand): New.
(apx_ndd_add_memory_operand): Likewise.

gcc/testsuite/

PR target/113711
PR target/113733
* gcc.target/i386/apx-ndd-2.c: New test.
* gcc.target/i386/apx-ndd-base-index-1.c: Likewise.
* gcc.target/i386/apx-ndd-no-seg-global-1.c: Likewise.
* gcc.target/i386/apx-ndd-seg-1.c: Likewise.
* gcc.target/i386/apx-ndd-seg-2.c: Likewise.
* gcc.target/i386/apx-ndd-seg-3.c: Likewise.
* gcc.target/i386/apx-ndd-seg-4.c: Likewise.
* gcc.target/i386/apx-ndd-seg-5.c: Likewise.
* gcc.target/i386/apx-ndd-tls-1a.c: Likewise.
* gcc.target/i386/apx-ndd-tls-2.c: Likewise.
* gcc.target/i386/apx-ndd-tls-3.c: Likewise.
* gcc.target/i386/apx-ndd-tls-4.c: Likewise.
* gcc.target/i386/apx-ndd-x32-1.c: Likewise.
---
 gcc/config/i386/constraints.md|  36 -
 gcc/config/i386/i386-protos.h |   1 -
 gcc/config/i386/i386.cc   |  25 
 gcc/config/i386/i386.md   | 129 +-
 gcc/config/i386/predicates.md |  65 +
 gcc/testsuite/gcc.target/i386/apx-ndd-2.c |  17 +++
 .../gcc.target/i386/apx-ndd-base-index-1.c|  50 +++
 .../gcc.target/i386/apx-ndd-no-seg-global-1.c |  74 ++
 gcc/testsuite/gcc.target/i386/apx-ndd-seg-1.c |  98 +
 gcc/testsuite/gcc.target/i386/apx-ndd-seg-2.c |  98 +
 gcc/testsuite/gcc.target/i386/apx-ndd-seg-3.c |  14 ++
 gcc/testsuite/gcc.target/i386/apx-ndd-seg-4.c |   9 ++
 gcc/testsuite/gcc.target/i386/apx-ndd-seg-5.c |  13 ++
 .../gcc.target/i386/apx-ndd-tls-1a.c  |  41 ++
 gcc/testsuite/gcc.target/i386/apx-ndd-tls-2.c |  38 ++
 gcc/testsuite/gcc.target/i386/apx-ndd-tls-3.c |  16 +++
 gcc/testsuite/gcc.target/i386/apx-ndd-tls-4.c |  31 +
 gcc/testsuite/gcc.target/i386/apx-ndd-x32-1.c |  49 +++
 18 files changed, 712 insertions(+), 92 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-base-index-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-no-seg-global-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-3.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-4.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-seg-5.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-1a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-3.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-tls-4.c
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-x32-1.c

diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
index 280e4c8e36c..64702d9c0a8 100644
--- a/gcc/config/i386/constraints.md
+++ b/gcc/config/i386/constraints.md
@@ -372,6 +372,24 @@ (define_address_constraint "Ts"
   "Address operand without segment register"
   (match_operand 0 "address_no_seg_operand"))
 
+;; j prefix is used for