Commit d56b9f12 by Sandra Loosemore Committed by Sandra Loosemore

mips.h (TUNE_24K): Define.

2007-07-16  Sandra Loosemore  <sandra@codesourcery.com>
	    David Ung  <davidu@mips.com>

        gcc/

        * config/mips/mips.h (TUNE_24K): Define.
	(TUNE_MACC_CHAINS): Add TUNE_24K.
        * config/mips/mips.md: (*mul_acc_si, *mul_sub_si): Change type to
        imadd.
        * config/mips/74k.md (r74k_int_mult): Split madd/msub to ..
        (r74k_int_madd): .. this new reservation.
        (define_bypass): Fixed bypasses for r74k_int_madd to use
	mips_linked_madd_p.
        * config/mips/24k.md (define_bypass): Define new
        r24k_int_mul3->r24k_int_madd bypass using mips_linked_madd_p.

	gcc/testsuite/

        * gcc.target/mips/mips-sched-madd.c: New test case.

Co-Authored-By: David Ung <davidu@mips.com>

From-SVN: r126688
parent 0015c873
2007-07-16 Sandra Loosemore <sandra@codesourcery.com> 2007-07-16 Sandra Loosemore <sandra@codesourcery.com>
David Ung <davidu@mips.com>
* config/mips/mips.h (TUNE_24K): Define.
(TUNE_MACC_CHAINS): Add TUNE_24K.
* config/mips/mips.md: (*mul_acc_si, *mul_sub_si): Change type to
imadd.
* config/mips/74k.md (r74k_int_mult): Split madd/msub to ..
(r74k_int_madd): .. this new reservation.
(define_bypass): Fixed bypasses for r74k_int_madd to use
mips_linked_madd_p.
* config/mips/24k.md (define_bypass): Define new
r24k_int_mul3->r24k_int_madd bypass using mips_linked_madd_p.
2007-07-16 Sandra Loosemore <sandra@codesourcery.com>
Nigel Stephens <nigel@mips.com> Nigel Stephens <nigel@mips.com>
* config/mips/mips.md: Include 20kc.md. * config/mips/mips.md: Include 20kc.md.
......
...@@ -188,6 +188,9 @@ ...@@ -188,6 +188,9 @@
(define_bypass 6 "r24k_int_mul3" "r24k_int_store" "!store_data_bypass_p") (define_bypass 6 "r24k_int_mul3" "r24k_int_store" "!store_data_bypass_p")
(define_bypass 6 "r24k_int_mul3" "r24k_int_prefetch") (define_bypass 6 "r24k_int_mul3" "r24k_int_prefetch")
;; mul3->madd/msub : 1 cycle
(define_bypass 1 "r24k_int_mul3" "r24k_int_madd" "mips_linked_madd_p")
;; mfhilo->next use : 5 cycles (default) ;; mfhilo->next use : 5 cycles (default)
;; mfhilo->l/s base : 6 cycles ;; mfhilo->l/s base : 6 cycles
;; mfhilo->prefetch : 6 cycles ;; mfhilo->prefetch : 6 cycles
......
...@@ -60,10 +60,16 @@ ...@@ -60,10 +60,16 @@
"r74k_agen*2") "r74k_agen*2")
;; MDU: fully pipelined multiplier ;; MDU: fully pipelined multiplier
;; mult, madd, msub - delivers result to hi/lo in 4 cycle (pipelined) ;; mult - delivers result to hi/lo in 4 cycle (pipelined)
(define_insn_reservation "r74k_int_mult" 4 (define_insn_reservation "r74k_int_mult" 4
(and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2") (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
(eq_attr "type" "imul,imadd")) (eq_attr "type" "imul"))
"r74k_alu+r74k_mul")
;; madd, msub - delivers result to hi/lo in 4 cycle (pipelined)
(define_insn_reservation "r74k_int_madd" 4
(and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
(eq_attr "type" "imadd"))
"r74k_alu+r74k_mul") "r74k_alu+r74k_mul")
;; mul - delivers result to general register in 7 cycles ;; mul - delivers result to general register in 7 cycles
...@@ -160,9 +166,13 @@ ...@@ -160,9 +166,13 @@
(define_bypass 5 "r74k_int_cmove" "r74k_int_load") (define_bypass 5 "r74k_int_cmove" "r74k_int_load")
(define_bypass 5 "r74k_int_cmove" "r74k_int_store" "!store_data_bypass_p") (define_bypass 5 "r74k_int_cmove" "r74k_int_store" "!store_data_bypass_p")
;; mult/madd->int_mfhilo : 4 cycles (default) ;; mult/madd/msub->int_mfhilo : 4 cycles (default)
;; mult/madd->mult/madd : 1 cycles ;; mult->madd/msub : 1 cycles
(define_bypass 1 "r74k_int_mult" "r74k_int_mult") ;; madd/msub->madd/msub : 1 cycles
(define_bypass 1 "r74k_int_mult,r74k_int_mul3" "r74k_int_madd"
"mips_linked_madd_p")
(define_bypass 1 "r74k_int_madd" "r74k_int_madd"
"mips_linked_madd_p")
;; -------------------------------------------------------------- ;; --------------------------------------------------------------
;; Floating Point Instructions ;; Floating Point Instructions
......
...@@ -250,6 +250,9 @@ extern const struct mips_rtx_cost_data *mips_cost; ...@@ -250,6 +250,9 @@ extern const struct mips_rtx_cost_data *mips_cost;
#define TUNE_MIPS9000 (mips_tune == PROCESSOR_R9000) #define TUNE_MIPS9000 (mips_tune == PROCESSOR_R9000)
#define TUNE_SB1 (mips_tune == PROCESSOR_SB1 \ #define TUNE_SB1 (mips_tune == PROCESSOR_SB1 \
|| mips_tune == PROCESSOR_SB1A) || mips_tune == PROCESSOR_SB1A)
#define TUNE_24K (mips_tune == PROCESSOR_24KC \
|| mips_tune == PROCESSOR_24KF2_1 \
|| mips_tune == PROCESSOR_24KF1_1)
#define TUNE_74K (mips_tune == PROCESSOR_74KC \ #define TUNE_74K (mips_tune == PROCESSOR_74KC \
|| mips_tune == PROCESSOR_74KF2_1 \ || mips_tune == PROCESSOR_74KF2_1 \
|| mips_tune == PROCESSOR_74KF1_1 \ || mips_tune == PROCESSOR_74KF1_1 \
...@@ -289,7 +292,8 @@ extern const struct mips_rtx_cost_data *mips_cost; ...@@ -289,7 +292,8 @@ extern const struct mips_rtx_cost_data *mips_cost;
than others, so this macro is defined on an opt-in basis. */ than others, so this macro is defined on an opt-in basis. */
#define TUNE_MACC_CHAINS (TUNE_MIPS5500 \ #define TUNE_MACC_CHAINS (TUNE_MIPS5500 \
|| TUNE_MIPS4120 \ || TUNE_MIPS4120 \
|| TUNE_MIPS4130) || TUNE_MIPS4130 \
|| TUNE_24K)
#define TARGET_OLDABI (mips_abi == ABI_32 || mips_abi == ABI_O64) #define TARGET_OLDABI (mips_abi == ABI_32 || mips_abi == ABI_O64)
#define TARGET_NEWABI (mips_abi == ABI_N32 || mips_abi == ABI_64) #define TARGET_NEWABI (mips_abi == ABI_N32 || mips_abi == ABI_64)
......
...@@ -1228,7 +1228,7 @@ ...@@ -1228,7 +1228,7 @@
return "#"; return "#";
return madd[which_alternative]; return madd[which_alternative];
} }
[(set_attr "type" "imadd,imadd,multi") [(set_attr "type" "imadd")
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "4,4,8")]) (set_attr "length" "4,4,8")])
...@@ -1483,7 +1483,7 @@ ...@@ -1483,7 +1483,7 @@
msub\t%2,%3 msub\t%2,%3
# #
#" #"
[(set_attr "type" "imadd,multi,multi") [(set_attr "type" "imadd")
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "4,8,8")]) (set_attr "length" "4,8,8")])
......
2007-07-16 Sandra Loosemore <sandra@codesourcery.com>
David Ung <davidu@mips.com>
* gcc.target/mips/mips-sched-madd.c: New test case.
2007-07-15 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2007-07-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/32611 PR libfortran/32611
/* Test for case where another independent multiply insn may interfere
with a macc chain. */
/* { dg-do compile } */
/* { dg-mips-options "-Os -march=24kf -mno-mips16" } */
int foo (int a, int b, int c, int d, int e, int f, int g)
{
int temp;
int acc;
acc = a * b;
temp = a * c;
acc = d * e + acc;
acc = f * g + acc;
return acc > temp ? acc : temp;
}
/* { dg-final { scan-assembler "\tmult\t" } } */
/* { dg-final { scan-assembler "\tmadd\t" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment