Projects
openEuler:24.03:SP1:Everything
gcc
_service:tar_scm:0100-LoongArch-Fixed-the-probl...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0100-LoongArch-Fixed-the-problem-of-incorrect-judgment-of.patch of Package gcc
From 90db6906a92b685403d9220e94f779737d2dd100 Mon Sep 17 00:00:00 2001 From: Lulu Cheng <chenglulu@loongson.cn> Date: Thu, 4 Jan 2024 10:37:53 +0800 Subject: [PATCH 100/188] LoongArch: Fixed the problem of incorrect judgment of the immediate field of the [x]vld/[x]vst instruction. The [x]vld/[x]vst directive is defined as follows: [x]vld/[x]vst {x/v}d, rj, si12 When not modified, the immediate field of [x]vld/[x]vst is between 10 and 14 bits depending on the type. However, in loongarch_valid_offset_p, the immediate field is restricted first, so there is no error. However, in some cases redundant instructions will be generated, see test cases. Now modify it according to the description in the instruction manual. gcc/ChangeLog: * config/loongarch/lasx.md (lasx_mxld_<lasxfmt_f>): Modify the method of determining the memory offset of [x]vld/[x]vst. (lasx_mxst_<lasxfmt_f>): Likewise. * config/loongarch/loongarch.cc (loongarch_valid_offset_p): Delete. (loongarch_address_insns): Likewise. * config/loongarch/lsx.md (lsx_ld_<lsxfmt_f>): Likewise. (lsx_st_<lsxfmt_f>): Likewise. * config/loongarch/predicates.md (aq10b_operand): Likewise. (aq10h_operand): Likewise. (aq10w_operand): Likewise. (aq10d_operand): Likewise. gcc/testsuite/ChangeLog: * gcc.target/loongarch/vect-ld-st-imm12.c: New test. --- gcc/config/loongarch/lasx.md | 26 ------------------- gcc/config/loongarch/loongarch.cc | 19 +++----------- gcc/config/loongarch/lsx.md | 26 ------------------- gcc/config/loongarch/predicates.md | 16 ------------ .../gcc.target/loongarch/vect-ld-st-imm12.c | 15 +++++++++++ 5 files changed, 19 insertions(+), 83 deletions(-) create mode 100644 gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c diff --git a/gcc/config/loongarch/lasx.md b/gcc/config/loongarch/lasx.md index dbbf5a136..95c6bae20 100644 --- a/gcc/config/loongarch/lasx.md +++ b/gcc/config/loongarch/lasx.md @@ -846,32 +846,6 @@ DONE; }) -;; Offset load -(define_expand "lasx_mxld_<lasxfmt_f>" - [(match_operand:LASX 0 "register_operand") - (match_operand 1 "pmode_register_operand") - (match_operand 2 "aq10<lasxfmt>_operand")] - "ISA_HAS_LASX" -{ - rtx addr = plus_constant (GET_MODE (operands[1]), operands[1], - INTVAL (operands[2])); - loongarch_emit_move (operands[0], gen_rtx_MEM (<MODE>mode, addr)); - DONE; -}) - -;; Offset store -(define_expand "lasx_mxst_<lasxfmt_f>" - [(match_operand:LASX 0 "register_operand") - (match_operand 1 "pmode_register_operand") - (match_operand 2 "aq10<lasxfmt>_operand")] - "ISA_HAS_LASX" -{ - rtx addr = plus_constant (GET_MODE (operands[1]), operands[1], - INTVAL (operands[2])); - loongarch_emit_move (gen_rtx_MEM (<MODE>mode, addr), operands[0]); - DONE; -}) - ;; LASX (define_insn "add<mode>3" [(set (match_operand:ILASX 0 "register_operand" "=f,f,f") diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 9d2374a46..ddb32cea2 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -2123,21 +2123,11 @@ loongarch_valid_offset_p (rtx x, machine_mode mode) /* We may need to split multiword moves, so make sure that every word is accessible. */ - if (GET_MODE_SIZE (mode) > UNITS_PER_WORD + if (!(LSX_SUPPORTED_MODE_P (mode) || LASX_SUPPORTED_MODE_P (mode)) + && GET_MODE_SIZE (mode) > UNITS_PER_WORD && !IMM12_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD)) return false; - /* LSX LD.* and ST.* supports 10-bit signed offsets. */ - if (LSX_SUPPORTED_MODE_P (mode) - && !loongarch_signed_immediate_p (INTVAL (x), 10, - loongarch_ldst_scaled_shift (mode))) - return false; - - /* LASX XVLD.B and XVST.B supports 10-bit signed offsets without shift. */ - if (LASX_SUPPORTED_MODE_P (mode) - && !loongarch_signed_immediate_p (INTVAL (x), 10, 0)) - return false; - return true; } @@ -2372,9 +2362,8 @@ loongarch_address_insns (rtx x, machine_mode mode, bool might_split_p) case ADDRESS_REG: if (lsx_p) { - /* LSX LD.* and ST.* supports 10-bit signed offsets. */ - if (loongarch_signed_immediate_p (INTVAL (addr.offset), 10, - loongarch_ldst_scaled_shift (mode))) + /* LSX LD.* and ST.* supports 12-bit signed offsets. */ + if (IMM12_OPERAND (INTVAL (addr.offset))) return 1; else return 0; diff --git a/gcc/config/loongarch/lsx.md b/gcc/config/loongarch/lsx.md index 3e3248ef4..02e89247b 100644 --- a/gcc/config/loongarch/lsx.md +++ b/gcc/config/loongarch/lsx.md @@ -812,32 +812,6 @@ DONE; }) -;; Offset load -(define_expand "lsx_ld_<lsxfmt_f>" - [(match_operand:LSX 0 "register_operand") - (match_operand 1 "pmode_register_operand") - (match_operand 2 "aq10<lsxfmt>_operand")] - "ISA_HAS_LSX" -{ - rtx addr = plus_constant (GET_MODE (operands[1]), operands[1], - INTVAL (operands[2])); - loongarch_emit_move (operands[0], gen_rtx_MEM (<MODE>mode, addr)); - DONE; -}) - -;; Offset store -(define_expand "lsx_st_<lsxfmt_f>" - [(match_operand:LSX 0 "register_operand") - (match_operand 1 "pmode_register_operand") - (match_operand 2 "aq10<lsxfmt>_operand")] - "ISA_HAS_LSX" -{ - rtx addr = plus_constant (GET_MODE (operands[1]), operands[1], - INTVAL (operands[2])); - loongarch_emit_move (gen_rtx_MEM (<MODE>mode, addr), operands[0]); - DONE; -}) - ;; Integer operations (define_insn "add<mode>3" [(set (match_operand:ILSX 0 "register_operand" "=f,f,f") diff --git a/gcc/config/loongarch/predicates.md b/gcc/config/loongarch/predicates.md index 3698b9103..824a85b36 100644 --- a/gcc/config/loongarch/predicates.md +++ b/gcc/config/loongarch/predicates.md @@ -167,22 +167,6 @@ (and (match_code "const_int") (match_test "loongarch_signed_immediate_p (INTVAL (op), 8, 3)"))) -(define_predicate "aq10b_operand" - (and (match_code "const_int") - (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 0)"))) - -(define_predicate "aq10h_operand" - (and (match_code "const_int") - (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 1)"))) - -(define_predicate "aq10w_operand" - (and (match_code "const_int") - (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 2)"))) - -(define_predicate "aq10d_operand" - (and (match_code "const_int") - (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 3)"))) - (define_predicate "aq12b_operand" (and (match_code "const_int") (match_test "loongarch_signed_immediate_p (INTVAL (op), 12, 0)"))) diff --git a/gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c b/gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c new file mode 100644 index 000000000..bfc208e4f --- /dev/null +++ b/gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-march=loongarch64 -mabi=lp64d -mlasx -O2" } */ +/* { dg-final { scan-assembler-not "addi.d" } } */ + +extern short a[1000]; +extern short b[1000]; +extern short c[1000]; + +void +test (void) +{ + for (int i = 501; i < 517; i++) + ((int *)(c + 1))[i] = ((int *)(a + 1))[i] + ((int *)(b + 1))[i]; +} + -- 2.43.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2