diff options
author | Lulu Cheng <chenglulu@loongson.cn> | 2024-01-04 10:37:53 +0800 |
---|---|---|
committer | Lulu Cheng <chenglulu@loongson.cn> | 2024-01-05 20:31:49 +0800 |
commit | 03c7df97e7ad46b8a78f6930ece7a0c02d1dd399 (patch) | |
tree | 36252d8def9cd2131a5416e48e940bf661fa492b /gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c | |
parent | f8e4412b047e4f075b628203fda84e2b4e6842cc (diff) | |
download | gcc-03c7df97e7ad46b8a78f6930ece7a0c02d1dd399.zip gcc-03c7df97e7ad46b8a78f6930ece7a0c02d1dd399.tar.gz gcc-03c7df97e7ad46b8a78f6930ece7a0c02d1dd399.tar.bz2 |
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.
Diffstat (limited to 'gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c')
-rw-r--r-- | gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c | 15 |
1 files changed, 15 insertions, 0 deletions
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 0000000..bfc208e --- /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]; +} + |