aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorChao-ying Fu <fu@mips.com>2010-11-05 00:26:14 +0000
committerChao-ying Fu <chaoyingfu@gcc.gnu.org>2010-11-05 00:26:14 +0000
commit293b77b0578cf252c527d325913f08eadde5e2d5 (patch)
tree6b8bba7d8f858fae48851ba021aa3c36731bd2e8 /gcc/config
parent1ea3db46777d599b519d267897435760c4932f1d (diff)
downloadgcc-293b77b0578cf252c527d325913f08eadde5e2d5.zip
gcc-293b77b0578cf252c527d325913f08eadde5e2d5.tar.gz
gcc-293b77b0578cf252c527d325913f08eadde5e2d5.tar.bz2
configure.ac: Test assembler support for DSP Rev1 mult.
2010-11-04 Chao-ying Fu <fu@mips.com> * configure.ac: Test assembler support for DSP Rev1 mult. * configure: Regenerate. * config.in: Regenerate. * config/mips/mips.h (ISA_HAS_DSP_MULT): New define. * config/mips/mips.c (CODE_FOR_mips_mult): New define. (CODE_FOR_mips_multu): New define. (mips_builtins): Move madd, maddu, msub, msubu, mult, multu from dspr2_32 to dsp_32. (mips_mulsidi3_gen_fn): Test (TARGET_FIX_R4000 && !ISA_HAS_DSP). Delete returns when ISA_HAS_DSPR2, because the old patterns are deleted. * config/mips/mips-dsp.md (mips_madd<u>, mips_msub<u>): New define_expand patterns. * config/mips/constraints.md (ka): Update the constraint to test ISA_HAS_DSP_MULT instead of ISA_HAS_DSPR2. * config/mips/mips-dspr2.md (mips_madd<u>, mips_msub<u>, mips_mult, mips_multu): Delete. * config/mips/mips.md (<u>mulsidi3_32bit): Add comments. Change target constraint to "ka". Use (!TARGET_FIX_R4000 || ISA_HAS_DSP), instead of (!TARGET_FIX_R4000 && !ISA_HAS_DSPR2). Emit the accumulator destination when ISA_HAS_DSP_MULT. (<u>msubsidi4): Add comments. Test ISA_HAS_DSP. Emit the accumulator destination when ISA_HAS_DSP_MULT. (<u>maddsidi4): Likewise. * doc/extend.texi (MIPS DSP Built-in Functions): Move madd, maddu, msub, msubu, mult, multu built-in functions from DSP r2 to DSP r1. From-SVN: r166344
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/mips/constraints.md4
-rw-r--r--gcc/config/mips/mips-dsp.md15
-rw-r--r--gcc/config/mips/mips-dspr2.md36
-rw-r--r--gcc/config/mips/mips.c18
-rw-r--r--gcc/config/mips/mips.h7
-rw-r--r--gcc/config/mips/mips.md31
6 files changed, 57 insertions, 54 deletions
diff --git a/gcc/config/mips/constraints.md b/gcc/config/mips/constraints.md
index a29d2c9..dcffdb5 100644
--- a/gcc/config/mips/constraints.md
+++ b/gcc/config/mips/constraints.md
@@ -86,8 +86,8 @@
;; Registers that can be used as the target of multiply-accumulate
;; instructions. The core MIPS32 ISA provides a hi/lo madd,
-;; but the DSPr2 version allows any accumulator target.
-(define_register_constraint "ka" "ISA_HAS_DSPR2 ? ACC_REGS : MD_REGS")
+;; but the DSP version allows any accumulator target.
+(define_register_constraint "ka" "ISA_HAS_DSP_MULT ? ACC_REGS : MD_REGS")
(define_constraint "kf"
"@internal"
diff --git a/gcc/config/mips/mips-dsp.md b/gcc/config/mips/mips-dsp.md
index faa22bd..4f518cb 100644
--- a/gcc/config/mips/mips-dsp.md
+++ b/gcc/config/mips/mips-dsp.md
@@ -1181,3 +1181,18 @@
"%*bposge%1\t%0%/"
[(set_attr "type" "branch")])
+(define_expand "mips_madd<u>"
+ [(set (match_operand:DI 0 "register_operand")
+ (plus:DI
+ (mult:DI (any_extend:DI (match_operand:SI 2 "register_operand"))
+ (any_extend:DI (match_operand:SI 3 "register_operand")))
+ (match_operand:DI 1 "register_operand")))]
+ "ISA_HAS_DSP && !TARGET_64BIT")
+
+(define_expand "mips_msub<u>"
+ [(set (match_operand:DI 0 "register_operand")
+ (minus:DI
+ (match_operand:DI 1 "register_operand")
+ (mult:DI (any_extend:DI (match_operand:SI 2 "register_operand"))
+ (any_extend:DI (match_operand:SI 3 "register_operand")))))]
+ "ISA_HAS_DSP && !TARGET_64BIT")
diff --git a/gcc/config/mips/mips-dspr2.md b/gcc/config/mips/mips-dspr2.md
index 9c3cbd5..3a5c7d2 100644
--- a/gcc/config/mips/mips-dspr2.md
+++ b/gcc/config/mips/mips-dspr2.md
@@ -224,22 +224,6 @@
[(set_attr "type" "imadd")
(set_attr "mode" "SI")])
-(define_expand "mips_madd<u>"
- [(set (match_operand:DI 0 "register_operand")
- (plus:DI
- (mult:DI (any_extend:DI (match_operand:SI 2 "register_operand"))
- (any_extend:DI (match_operand:SI 3 "register_operand")))
- (match_operand:DI 1 "register_operand")))]
- "ISA_HAS_DSPR2 && !TARGET_64BIT")
-
-(define_expand "mips_msub<u>"
- [(set (match_operand:DI 0 "register_operand")
- (minus:DI
- (match_operand:DI 1 "register_operand")
- (mult:DI (any_extend:DI (match_operand:SI 2 "register_operand"))
- (any_extend:DI (match_operand:SI 3 "register_operand")))))]
- "ISA_HAS_DSPR2 && !TARGET_64BIT")
-
(define_insn "mulv2hi3"
[(parallel
[(set (match_operand:V2HI 0 "register_operand" "=d")
@@ -320,26 +304,6 @@
[(set_attr "type" "imadd")
(set_attr "mode" "SI")])
-(define_insn "mips_mult"
- [(set (match_operand:DI 0 "register_operand" "=a")
- (mult:DI
- (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))
- (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
- "ISA_HAS_DSPR2 && !TARGET_64BIT"
- "mult\t%q0,%1,%2"
- [(set_attr "type" "imul")
- (set_attr "mode" "SI")])
-
-(define_insn "mips_multu"
- [(set (match_operand:DI 0 "register_operand" "=a")
- (mult:DI
- (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))
- (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
- "ISA_HAS_DSPR2 && !TARGET_64BIT"
- "multu\t%q0,%1,%2"
- [(set_attr "type" "imul")
- (set_attr "mode" "SI")])
-
(define_insn "mips_precr_qb_ph"
[(set (match_operand:V4QI 0 "register_operand" "=d")
(unspec:V4QI [(match_operand:V2HI 1 "reg_or_0_operand" "dYG")
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 3dfc59e..76c0786 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -12730,6 +12730,8 @@ AVAIL_NON_MIPS16 (cache, TARGET_CACHE_BUILTIN)
#define CODE_FOR_mips_subq_ph CODE_FOR_subv2hi3
#define CODE_FOR_mips_subu_qb CODE_FOR_subv4qi3
#define CODE_FOR_mips_mul_ph CODE_FOR_mulv2hi3
+#define CODE_FOR_mips_mult CODE_FOR_mulsidi3_32bit
+#define CODE_FOR_mips_multu CODE_FOR_umulsidi3_32bit
#define CODE_FOR_loongson_packsswh CODE_FOR_vec_pack_ssat_v2si
#define CODE_FOR_loongson_packsshb CODE_FOR_vec_pack_ssat_v4hi
@@ -12928,17 +12930,17 @@ static const struct mips_builtin_description mips_builtins[] = {
DIRECT_BUILTIN (extpdp, MIPS_SI_FTYPE_DI_SI, dsp_32),
DIRECT_BUILTIN (shilo, MIPS_DI_FTYPE_DI_SI, dsp_32),
DIRECT_BUILTIN (mthlip, MIPS_DI_FTYPE_DI_SI, dsp_32),
+ DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
+ DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
+ DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dsp_32),
+ DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dsp_32),
+ DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dsp_32),
+ DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dsp_32),
/* The following are for the MIPS DSP ASE REV 2 (32-bit only). */
DIRECT_BUILTIN (dpa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
DIRECT_BUILTIN (dps_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
- DIRECT_BUILTIN (madd, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
- DIRECT_BUILTIN (maddu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
- DIRECT_BUILTIN (msub, MIPS_DI_FTYPE_DI_SI_SI, dspr2_32),
- DIRECT_BUILTIN (msubu, MIPS_DI_FTYPE_DI_USI_USI, dspr2_32),
DIRECT_BUILTIN (mulsa_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
- DIRECT_BUILTIN (mult, MIPS_DI_FTYPE_SI_SI, dspr2_32),
- DIRECT_BUILTIN (multu, MIPS_DI_FTYPE_USI_USI, dspr2_32),
DIRECT_BUILTIN (dpax_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
DIRECT_BUILTIN (dpsx_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
DIRECT_BUILTIN (dpaqx_s_w_ph, MIPS_DI_FTYPE_DI_V2HI_V2HI, dspr2_32),
@@ -16173,10 +16175,8 @@ mips_mulsidi3_gen_fn (enum rtx_code ext_code)
}
else
{
- if (TARGET_FIX_R4000)
+ if (TARGET_FIX_R4000 && !ISA_HAS_DSP)
return signed_p ? gen_mulsidi3_32bit_r4000 : gen_umulsidi3_32bit_r4000;
- if (ISA_HAS_DSPR2)
- return signed_p ? gen_mips_mult : gen_mips_multu;
return signed_p ? gen_mulsidi3_32bit : gen_umulsidi3_32bit;
}
}
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index a367503..7b5e140 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -180,6 +180,13 @@ enum mips_code_readable_setting {
#define TARGET_WRITABLE_EH_FRAME (flag_pic && TARGET_SHARED)
#endif
+/* Test the assembler to set ISA_HAS_DSP_MULT to DSP Rev 1 or 2. */
+#ifdef HAVE_AS_DSPR1_MULT
+#define ISA_HAS_DSP_MULT ISA_HAS_DSP
+#else
+#define ISA_HAS_DSP_MULT ISA_HAS_DSPR2
+#endif
+
/* Generate mips16 code */
#define TARGET_MIPS16 ((target_flags & MASK_MIPS16) != 0)
/* Generate mips16e code. Default 16bit ASE for mips32* and mips64* */
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 9b09344..b789394 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -1731,12 +1731,20 @@
DONE;
})
+;; As well as being named patterns, these instructions are used by the
+;; __builtin_mips_mult<u>() functions. We must always make those functions
+;; available if !TARGET_64BIT && ISA_HAS_DSP.
(define_insn "<u>mulsidi3_32bit"
- [(set (match_operand:DI 0 "register_operand" "=x")
+ [(set (match_operand:DI 0 "register_operand" "=ka")
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
(any_extend:DI (match_operand:SI 2 "register_operand" "d"))))]
- "!TARGET_64BIT && !TARGET_FIX_R4000 && !ISA_HAS_DSPR2"
- "mult<u>\t%1,%2"
+ "!TARGET_64BIT && (!TARGET_FIX_R4000 || ISA_HAS_DSP)"
+{
+ if (ISA_HAS_DSP_MULT)
+ return "mult<u>\t%q0,%1,%2";
+ else
+ return "mult<u>\t%1,%2";
+}
[(set_attr "type" "imul")
(set_attr "mode" "SI")])
@@ -1856,6 +1864,13 @@
[(set_attr "type" "imul")
(set_attr "mode" "SI")])
+;; As well as being named patterns, these instructions are used by the
+;; __builtin_mips_msub<u>() functions. We must always make those functions
+;; available if !TARGET_64BIT && ISA_HAS_DSP.
+;;
+;; This leads to a slight inconsistency. We honor any tuning overrides
+;; in GENERATE_MADD_MSUB for -mno-dsp, but always ignore them for -mdsp,
+;; even if !ISA_HAS_DSP_MULT.
(define_insn "<u>msubsidi4"
[(set (match_operand:DI 0 "register_operand" "=ka")
(minus:DI
@@ -1863,9 +1878,9 @@
(mult:DI
(any_extend:DI (match_operand:SI 1 "register_operand" "d"))
(any_extend:DI (match_operand:SI 2 "register_operand" "d")))))]
- "!TARGET_64BIT && (ISA_HAS_MSAC || GENERATE_MADD_MSUB || ISA_HAS_DSPR2)"
+ "!TARGET_64BIT && (ISA_HAS_MSAC || GENERATE_MADD_MSUB || ISA_HAS_DSP)"
{
- if (ISA_HAS_DSPR2)
+ if (ISA_HAS_DSP_MULT)
return "msub<u>\t%q0,%1,%2";
else if (TARGET_MIPS5500 || GENERATE_MADD_MSUB)
return "msub<u>\t%1,%2";
@@ -2036,18 +2051,20 @@
[(set_attr "type" "imadd")
(set_attr "mode" "SI")])
+;; See the comment above <u>msubsidi4 for the relationship between
+;; ISA_HAS_DSP and ISA_HAS_DSP_MULT.
(define_insn "<u>maddsidi4"
[(set (match_operand:DI 0 "register_operand" "=ka")
(plus:DI
(mult:DI (any_extend:DI (match_operand:SI 1 "register_operand" "d"))
(any_extend:DI (match_operand:SI 2 "register_operand" "d")))
(match_operand:DI 3 "register_operand" "0")))]
- "(TARGET_MAD || ISA_HAS_MACC || GENERATE_MADD_MSUB || ISA_HAS_DSPR2)
+ "(TARGET_MAD || ISA_HAS_MACC || GENERATE_MADD_MSUB || ISA_HAS_DSP)
&& !TARGET_64BIT"
{
if (TARGET_MAD)
return "mad<u>\t%1,%2";
- else if (ISA_HAS_DSPR2)
+ else if (ISA_HAS_DSP_MULT)
return "madd<u>\t%q0,%1,%2";
else if (GENERATE_MADD_MSUB || TARGET_MIPS5500)
return "madd<u>\t%1,%2";