aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJie Mei <jie.mei@oss.cipunited.com>2023-06-19 16:29:57 +0800
committerYunQiang Su <yunqiang.su@cipunited.com>2023-07-03 11:38:20 +0800
commite3ee4289840f45d5e0219dea20d2fbb97a9b8894 (patch)
treed17c9b4cd4a615e0603e157d02d6a30d75ef3727 /gcc/config
parent773110dea48baed989f2b92bf2e1689cc2d87b60 (diff)
downloadgcc-e3ee4289840f45d5e0219dea20d2fbb97a9b8894.zip
gcc-e3ee4289840f45d5e0219dea20d2fbb97a9b8894.tar.gz
gcc-e3ee4289840f45d5e0219dea20d2fbb97a9b8894.tar.bz2
MIPS: Add CACHE instruction for mips16e2
This patch adds CACHE instruction from mips16e2 with corresponding tests. gcc/ChangeLog: * config/mips/mips.cc(mips_9bit_offset_address_p): Restrict the address register to M16_REGS for MIPS16. (BUILTIN_AVAIL_MIPS16E2): Defined a new macro. (AVAIL_MIPS16E2_OR_NON_MIPS16): Same as above. (AVAIL_NON_MIPS16 (cache..)): Update to AVAIL_MIPS16E2_OR_NON_MIPS16. * config/mips/mips.h (ISA_HAS_CACHE): Add clause for ISA_HAS_MIPS16E2. * config/mips/mips.md (mips_cache): Mark as extended MIPS16. gcc/testsuite/ChangeLog: * gcc.target/mips/mips16e2-cache.c: New tests for mips16e2.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/mips/mips.cc25
-rw-r--r--gcc/config/mips/mips.h3
-rw-r--r--gcc/config/mips/mips.md3
3 files changed, 26 insertions, 5 deletions
diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index 78f368f..fec25bd 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -2926,6 +2926,9 @@ mips_9bit_offset_address_p (rtx x, machine_mode mode)
return (mips_classify_address (&addr, x, mode, false)
&& addr.type == ADDRESS_REG
&& CONST_INT_P (addr.offset)
+ && (!TARGET_MIPS16E2
+ || M16_REG_P (REGNO (addr.reg))
+ || REGNO (addr.reg) >= FIRST_PSEUDO_REGISTER)
&& MIPS_9BIT_OFFSET_P (INTVAL (addr.offset)));
}
@@ -15514,9 +15517,13 @@ mips_loongson_ext2_prefetch_cookie (rtx write, rtx)
The function is available on the current target if !TARGET_MIPS16.
BUILTIN_AVAIL_MIPS16
- The function is available on the current target if TARGET_MIPS16. */
+ The function is available on the current target if TARGET_MIPS16.
+
+ BUILTIN_AVAIL_MIPS16E2
+ The function is available on the current target if TARGET_MIPS16E2. */
#define BUILTIN_AVAIL_NON_MIPS16 1
#define BUILTIN_AVAIL_MIPS16 2
+#define BUILTIN_AVAIL_MIPS16E2 4
/* Declare an availability predicate for built-in functions that
require non-MIPS16 mode and also require COND to be true.
@@ -15529,6 +15536,17 @@ mips_loongson_ext2_prefetch_cookie (rtx write, rtx)
}
/* Declare an availability predicate for built-in functions that
+ require non-MIPS16 mode or MIPS16E2 and also require COND to be true.
+ NAME is the main part of the predicate's name. */
+#define AVAIL_MIPS16E2_OR_NON_MIPS16(NAME, COND) \
+ static unsigned int \
+ mips_builtin_avail_##NAME (void) \
+ { \
+ return ((COND) ? BUILTIN_AVAIL_NON_MIPS16 | BUILTIN_AVAIL_MIPS16E2 \
+ : 0); \
+ }
+
+/* Declare an availability predicate for built-in functions that
support both MIPS16 and non-MIPS16 code and also require COND
to be true. NAME is the main part of the predicate's name. */
#define AVAIL_ALL(NAME, COND) \
@@ -15573,7 +15591,7 @@ AVAIL_NON_MIPS16 (dsp_32, !TARGET_64BIT && TARGET_DSP)
AVAIL_NON_MIPS16 (dsp_64, TARGET_64BIT && TARGET_DSP)
AVAIL_NON_MIPS16 (dspr2_32, !TARGET_64BIT && TARGET_DSPR2)
AVAIL_NON_MIPS16 (loongson, TARGET_LOONGSON_MMI)
-AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
+AVAIL_MIPS16E2_OR_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
AVAIL_NON_MIPS16 (msa, TARGET_MSA)
/* Construct a mips_builtin_description from the given arguments.
@@ -17573,7 +17591,8 @@ mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
d = &mips_builtins[fcode];
avail = d->avail ();
gcc_assert (avail != 0);
- if (TARGET_MIPS16 && !(avail & BUILTIN_AVAIL_MIPS16))
+ if (TARGET_MIPS16 && !(avail & BUILTIN_AVAIL_MIPS16)
+ && (!TARGET_MIPS16E2 || !(avail & BUILTIN_AVAIL_MIPS16E2)))
{
error ("built-in function %qE not supported for MIPS16",
DECL_NAME (fndecl));
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 05ccd20..0b6ea78 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -1386,7 +1386,8 @@ struct mips_cpu_info {
#define TARGET_CACHE_BUILTIN (mips_isa >= MIPS_ISA_MIPS3)
/* The CACHE instruction is available. */
-#define ISA_HAS_CACHE (TARGET_CACHE_BUILTIN && !TARGET_MIPS16)
+#define ISA_HAS_CACHE (TARGET_CACHE_BUILTIN && (!TARGET_MIPS16 \
+ || TARGET_MIPS16E2))
/* Tell collect what flags to pass to nm. */
#ifndef NM_FLAGS
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index eec167a..609416b 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -5753,7 +5753,8 @@
(match_operand:QI 1 "address_operand" "ZD")]
UNSPEC_MIPS_CACHE))]
"ISA_HAS_CACHE"
- "cache\t%X0,%a1")
+ "cache\t%X0,%a1"
+ [(set_attr "extended_mips16" "yes")])
;; Similar, but with the operands hard-coded to an R10K cache barrier
;; operation. We keep the pattern distinct so that we can identify