diff options
author | Maxim Kuvyrkov <maxim@codesourcery.com> | 2008-06-15 10:03:07 +0000 |
---|---|---|
committer | Maxim Kuvyrkov <mkuvyrkov@gcc.gnu.org> | 2008-06-15 10:03:07 +0000 |
commit | 58684fa02e97dbfe84ac269146aa32191441685d (patch) | |
tree | 1b6d70e1e8d6afb15b79450a882c31079c754452 /gcc/config/mips/loongson.md | |
parent | 1cbc62c077deab75b6ced6c89874d25f5b785ec9 (diff) | |
download | gcc-58684fa02e97dbfe84ac269146aa32191441685d.zip gcc-58684fa02e97dbfe84ac269146aa32191441685d.tar.gz gcc-58684fa02e97dbfe84ac269146aa32191441685d.tar.bz2 |
loongson2ef.md: New file.
* config/mips/loongson2ef.md: New file.
* config/mips/mips.md (UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN)
(UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN)
(UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN)
(UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN): New constants.
(define_attr "cpu"): Rename loongson2e and loongson2f to loongson_2e
and loongson_2f.
(loongson2ef.md): New include.
* config/mips/loongson.md (vec_pack_ssat_<mode>, vec_pack_usat_<mode>)
(add<mode>3, paddd, ssadd<mode>3, usadd<mode>3)
(loongson_and_not_<mode>, loongson_average_<mode>, loongson_eq_<mode>)
(loongson_gt_<mode>, loongson_extract_halfword)
(loongson_insert_halfword_0, loongson_insert_halfword_2)
(loongson_insert_halfword_3, loongson_mult_add, smax<mode>3)
(umax<mode>3, smin<mode>3, umin<mode>3, loongson_move_byte_mask)
(umul<mode>3_highpart, smul<mode>3_highpart, loongson_smul_lowpart)
(loongson_umul_word, loongson_pasubub, reduc_uplus_<mode>)
(loongson_psadbh, loongson_pshufh, loongson_psll<mode>)
(loongson_psra<mode>, loongson_psrl<mode>, sub<mode>3, psubd)
(sssub<mode>3, ussub<mode>3, vec_interleave_high<mode>)
(vec_interleave_low<mode>): Define type attribute.
* config/mips/mips.c (mips_ls2): New static variable.
(mips_issue_rate): Update to handle tuning for Loongson 2E/2F.
(mips_ls2_init_dfa_post_cycle_insn, mips_init_dfa_post_cycle_insn)
(sched_ls2_dfa_post_advance_cycle, mips_dfa_post_advance_cycle):
Implement target scheduling hooks.
(mips_multipass_dfa_lookahead): Update to handle tuning for
Loongson 2E/2F.
(mips_sched_init): Initialize data for Loongson scheduling.
(mips_ls2_variable_issue): New static function.
(mips_variable_issue): Update to handle tuning for Loongson 2E/2F.
Add sanity check.
(TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN)
(TARGET_SCHED_DFA_POST_ADVANCE_CYCLE): Override target hooks.
* config/mips/mips.h (TUNE_LOONGSON_2EF): New macros.
(ISA_HAS_XFER_DELAY, ISA_HAS_FCMP_DELAY, ISA_HAS_HILO_INTERLOCKS):
Handle ST Loongson 2E/2F cores.
(CPU_UNITS_QUERY): Define macro to enable querying of DFA units.
From-SVN: r136805
Diffstat (limited to 'gcc/config/mips/loongson.md')
-rw-r--r-- | gcc/config/mips/loongson.md | 114 |
1 files changed, 76 insertions, 38 deletions
diff --git a/gcc/config/mips/loongson.md b/gcc/config/mips/loongson.md index 5177ae4..73d183a 100644 --- a/gcc/config/mips/loongson.md +++ b/gcc/config/mips/loongson.md @@ -108,7 +108,8 @@ (ss_truncate:<V_squash> (match_operand:VWH 2 "register_operand" "f"))))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "packss<V_squash_double_suffix>\t%0,%1,%2") + "packss<V_squash_double_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Pack with unsigned saturation. (define_insn "vec_pack_usat_<mode>" @@ -119,7 +120,8 @@ (us_truncate:<V_squash> (match_operand:VH 2 "register_operand" "f"))))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "packus<V_squash_double_suffix>\t%0,%1,%2") + "packus<V_squash_double_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Addition, treating overflow by wraparound. (define_insn "add<mode>3" @@ -127,7 +129,8 @@ (plus:VWHB (match_operand:VWHB 1 "register_operand" "f") (match_operand:VWHB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "padd<V_suffix>\t%0,%1,%2") + "padd<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Addition of doubleword integers stored in FP registers. ;; Overflow is treated by wraparound. @@ -141,7 +144,8 @@ (match_operand:DI 2 "register_operand" "f")] UNSPEC_LOONGSON_PADDD))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "paddd\t%0,%1,%2") + "paddd\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Addition, treating overflow by signed saturation. (define_insn "ssadd<mode>3" @@ -149,7 +153,8 @@ (ss_plus:VHB (match_operand:VHB 1 "register_operand" "f") (match_operand:VHB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "padds<V_suffix>\t%0,%1,%2") + "padds<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Addition, treating overflow by unsigned saturation. (define_insn "usadd<mode>3" @@ -157,7 +162,8 @@ (us_plus:VHB (match_operand:VHB 1 "register_operand" "f") (match_operand:VHB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "paddus<V_suffix>\t%0,%1,%2") + "paddus<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Logical AND NOT. (define_insn "loongson_pandn_<V_suffix>" @@ -166,7 +172,8 @@ (not:VWHBDI (match_operand:VWHBDI 1 "register_operand" "f")) (match_operand:VWHBDI 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pandn\t%0,%1,%2") + "pandn\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Average. (define_insn "loongson_pavg<V_suffix>" @@ -175,7 +182,8 @@ (match_operand:VHB 2 "register_operand" "f")] UNSPEC_LOONGSON_PAVG))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pavg<V_suffix>\t%0,%1,%2") + "pavg<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Equality test. (define_insn "loongson_pcmpeq<V_suffix>" @@ -184,7 +192,8 @@ (match_operand:VWHB 2 "register_operand" "f")] UNSPEC_LOONGSON_PCMPEQ))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pcmpeq<V_suffix>\t%0,%1,%2") + "pcmpeq<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Greater-than test. (define_insn "loongson_pcmpgt<V_suffix>" @@ -193,7 +202,8 @@ (match_operand:VWHB 2 "register_operand" "f")] UNSPEC_LOONGSON_PCMPGT))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pcmpgt<V_suffix>\t%0,%1,%2") + "pcmpgt<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Extract halfword. (define_insn "loongson_pextr<V_suffix>" @@ -202,7 +212,8 @@ (match_operand:SI 2 "register_operand" "f")] UNSPEC_LOONGSON_PEXTR))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pextr<V_suffix>\t%0,%1,%2") + "pextr<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Insert halfword. (define_insn "loongson_pinsr<V_suffix>_0" @@ -211,7 +222,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PINSR_0))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pinsr<V_suffix>_0\t%0,%1,%2") + "pinsr<V_suffix>_0\t%0,%1,%2" + [(set_attr "type" "fdiv")]) (define_insn "loongson_pinsr<V_suffix>_1" [(set (match_operand:VH 0 "register_operand" "=f") @@ -219,7 +231,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PINSR_1))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pinsr<V_suffix>_1\t%0,%1,%2") + "pinsr<V_suffix>_1\t%0,%1,%2" + [(set_attr "type" "fdiv")]) (define_insn "loongson_pinsr<V_suffix>_2" [(set (match_operand:VH 0 "register_operand" "=f") @@ -227,7 +240,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PINSR_2))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pinsr<V_suffix>_2\t%0,%1,%2") + "pinsr<V_suffix>_2\t%0,%1,%2" + [(set_attr "type" "fdiv")]) (define_insn "loongson_pinsr<V_suffix>_3" [(set (match_operand:VH 0 "register_operand" "=f") @@ -235,7 +249,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PINSR_3))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pinsr<V_suffix>_3\t%0,%1,%2") + "pinsr<V_suffix>_3\t%0,%1,%2" + [(set_attr "type" "fdiv")]) ;; Multiply and add packed integers. (define_insn "loongson_pmadd<V_stretch_half_suffix>" @@ -244,7 +259,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PMADD))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmadd<V_stretch_half_suffix>\t%0,%1,%2") + "pmadd<V_stretch_half_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Maximum of signed halfwords. (define_insn "smax<mode>3" @@ -252,7 +268,8 @@ (smax:VH (match_operand:VH 1 "register_operand" "f") (match_operand:VH 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmaxs<V_suffix>\t%0,%1,%2") + "pmaxs<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Maximum of unsigned bytes. (define_insn "umax<mode>3" @@ -260,7 +277,8 @@ (umax:VB (match_operand:VB 1 "register_operand" "f") (match_operand:VB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmaxu<V_suffix>\t%0,%1,%2") + "pmaxu<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Minimum of signed halfwords. (define_insn "smin<mode>3" @@ -268,7 +286,8 @@ (smin:VH (match_operand:VH 1 "register_operand" "f") (match_operand:VH 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmins<V_suffix>\t%0,%1,%2") + "pmins<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Minimum of unsigned bytes. (define_insn "umin<mode>3" @@ -276,7 +295,8 @@ (umin:VB (match_operand:VB 1 "register_operand" "f") (match_operand:VB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pminu<V_suffix>\t%0,%1,%2") + "pminu<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Move byte mask. (define_insn "loongson_pmovmsk<V_suffix>" @@ -284,7 +304,8 @@ (unspec:VB [(match_operand:VB 1 "register_operand" "f")] UNSPEC_LOONGSON_PMOVMSK))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmovmsk<V_suffix>\t%0,%1") + "pmovmsk<V_suffix>\t%0,%1" + [(set_attr "type" "fabs")]) ;; Multiply unsigned integers and store high result. (define_insn "umul<mode>3_highpart" @@ -293,7 +314,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PMULHU))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmulhu<V_suffix>\t%0,%1,%2") + "pmulhu<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Multiply signed integers and store high result. (define_insn "smul<mode>3_highpart" @@ -302,7 +324,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PMULH))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmulh<V_suffix>\t%0,%1,%2") + "pmulh<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Multiply signed integers and store low result. (define_insn "loongson_pmull<V_suffix>" @@ -311,7 +334,8 @@ (match_operand:VH 2 "register_operand" "f")] UNSPEC_LOONGSON_PMULL))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmull<V_suffix>\t%0,%1,%2") + "pmull<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Multiply unsigned word integers. (define_insn "loongson_pmulu<V_suffix>" @@ -320,7 +344,8 @@ (match_operand:VW 2 "register_operand" "f")] UNSPEC_LOONGSON_PMULU))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pmulu<V_suffix>\t%0,%1,%2") + "pmulu<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Absolute difference. (define_insn "loongson_pasubub" @@ -329,7 +354,8 @@ (match_operand:VB 2 "register_operand" "f")] UNSPEC_LOONGSON_PASUBUB))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pasubub\t%0,%1,%2") + "pasubub\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Sum of unsigned byte integers. (define_insn "reduc_uplus_<mode>" @@ -337,7 +363,8 @@ (unspec:<V_stretch_half> [(match_operand:VB 1 "register_operand" "f")] UNSPEC_LOONGSON_BIADD))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "biadd\t%0,%1") + "biadd\t%0,%1" + [(set_attr "type" "fabs")]) ;; Sum of absolute differences. (define_insn "loongson_psadbh" @@ -346,7 +373,8 @@ (match_operand:VB 2 "register_operand" "f")] UNSPEC_LOONGSON_PSADBH))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pasubub\t%0,%1,%2;biadd\t%0,%0") + "pasubub\t%0,%1,%2;biadd\t%0,%0" + [(set_attr "type" "fadd")]) ;; Shuffle halfwords. (define_insn "loongson_pshufh" @@ -356,7 +384,8 @@ (match_operand:SI 3 "register_operand" "f")] UNSPEC_LOONGSON_PSHUFH))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "pshufh\t%0,%2,%3") + "pshufh\t%0,%2,%3" + [(set_attr "type" "fmul")]) ;; Shift left logical. (define_insn "loongson_psll<V_suffix>" @@ -364,7 +393,8 @@ (ashift:VWH (match_operand:VWH 1 "register_operand" "f") (match_operand:SI 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psll<V_suffix>\t%0,%1,%2") + "psll<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fmul")]) ;; Shift right arithmetic. (define_insn "loongson_psra<V_suffix>" @@ -372,7 +402,8 @@ (ashiftrt:VWH (match_operand:VWH 1 "register_operand" "f") (match_operand:SI 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psra<V_suffix>\t%0,%1,%2") + "psra<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fdiv")]) ;; Shift right logical. (define_insn "loongson_psrl<V_suffix>" @@ -380,7 +411,8 @@ (lshiftrt:VWH (match_operand:VWH 1 "register_operand" "f") (match_operand:SI 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psrl<V_suffix>\t%0,%1,%2") + "psrl<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fdiv")]) ;; Subtraction, treating overflow by wraparound. (define_insn "sub<mode>3" @@ -388,7 +420,8 @@ (minus:VWHB (match_operand:VWHB 1 "register_operand" "f") (match_operand:VWHB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psub<V_suffix>\t%0,%1,%2") + "psub<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Subtraction of doubleword integers stored in FP registers. ;; Overflow is treated by wraparound. @@ -400,7 +433,8 @@ (match_operand:DI 2 "register_operand" "f")] UNSPEC_LOONGSON_PSUBD))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psubd\t%0,%1,%2") + "psubd\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Subtraction, treating overflow by signed saturation. (define_insn "sssub<mode>3" @@ -408,7 +442,8 @@ (ss_minus:VHB (match_operand:VHB 1 "register_operand" "f") (match_operand:VHB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psubs<V_suffix>\t%0,%1,%2") + "psubs<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Subtraction, treating overflow by unsigned saturation. (define_insn "ussub<mode>3" @@ -416,7 +451,8 @@ (us_minus:VHB (match_operand:VHB 1 "register_operand" "f") (match_operand:VHB 2 "register_operand" "f")))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "psubus<V_suffix>\t%0,%1,%2") + "psubus<V_suffix>\t%0,%1,%2" + [(set_attr "type" "fadd")]) ;; Unpack high data. (define_insn "vec_interleave_high<mode>" @@ -425,7 +461,8 @@ (match_operand:VWHB 2 "register_operand" "f")] UNSPEC_LOONGSON_PUNPCKH))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "punpckh<V_stretch_half_suffix>\t%0,%1,%2") + "punpckh<V_stretch_half_suffix>\t%0,%1,%2" + [(set_attr "type" "fdiv")]) ;; Unpack low data. (define_insn "vec_interleave_low<mode>" @@ -434,4 +471,5 @@ (match_operand:VWHB 2 "register_operand" "f")] UNSPEC_LOONGSON_PUNPCKL))] "TARGET_HARD_FLOAT && TARGET_LOONGSON_VECTORS" - "punpckl<V_stretch_half_suffix>\t%0,%1,%2") + "punpckl<V_stretch_half_suffix>\t%0,%1,%2" + [(set_attr "type" "fdiv")]) |