nice, i'd like to put my patches on gcc-3.4.6 here for who are interested with it. though there may be some mistakes. :-)
ericfisher diff -up -N gcc-3.4.6/gcc/config/mips/loongson2.md loongson-gcc-3.4.6/gcc/config/mips/loongson2.md --- gcc-3.4.6/gcc/config/mips/loongson2.md 1970-01-01 08:00:00.000000000 +0800 +++ loongson-gcc-3.4.6/gcc/config/mips/loongson2.md 2008-04-21 23:49:22.000000000 +0800 @@ -0,0 +1,167 @@ +;; loongson2e/2f has +;; two fix point units: alu1 and alu2, +;; two float units: falu1 and falu2, +;; and one memory access unit: memory + +(define_automaton "loongson2_int, loongson2_fp") + +(define_cpu_unit "alu1, alu2" "loongson2_int") +(define_cpu_unit "mem" "loongson2_int") +(define_cpu_unit "falu1, falu2" "loongson2_fp") + +;; Add/sub/logical/shift/lui/cmp +;; MF/MT HI/LO +;; move? condmove? li? +(define_insn_reservation "loongson2_arith" 2 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "arith, darith, hilo, move, condmove, const, icmp")) + "alu1|alu2") + +;; Trap/branch +(define_insn_reservation "loongson2_branch" 2 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "branch, jump, call")) + "alu1") + +;; (D)MULT(U) +(define_insn_reservation "loongson2_mult" 5 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "imul")) + "alu2*2") + +;; (D)MULT(U)G +(define_insn_reservation "loongson2_multg" 5 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "multg")) + "alu2") + +;; (D)DIV(U) +;; (D)DIV(U)G +;; (D)MOD(U)G +(define_insn_reservation "loongson2e_div" 37 + (and (eq_attr "cpu" "loongson2e") + (eq_attr "type" "idiv, divg")) + "alu2*37") + +;; (D)DIV(U) +(define_insn_reservation "loongson2f_div" 38 + (and (eq_attr "cpu" "loongson2f") + (eq_attr "type" "idiv")) + "alu2*76") + +;; (D)DIV(U)G +;; (D)MOD(U)G +(define_insn_reservation "loongson2f_divg" 38 + (and (eq_attr "cpu" "loongson2f") + (eq_attr "type" "divg")) + "alu2*37") + +;; Load +;; fp: Lwc1, Ldc1 +(define_insn_reservation "loongson2_load" 5 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "load")) + "mem") + +;; Store? +(define_insn_reservation "loongson2_store" 1 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "store")) + "mem") + +;; (D)MTC1/(D)MFC1 +(define_insn_reservation "loongson2_c1" 5 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "xfer")) + "mem") + +;; fp: Abs/Neg/C.cond/Bc1t/Bc1f/Move/Cvt* +(define_insn_reservation "loongson2_fabs" 3 + (and (eq_attr "cpu" "loongson2e, loongson2f") + (eq_attr "type" "fabs, fneg, fcmp")) + "falu1") + +;; fp: Add/Sub/Round/Trunc/Ceil/Floor/Cvt* +(define_insn_reservation "loongson2e_fadd" 5 + (and (eq_attr "cpu" "loongson2e") + (eq_attr "type" "fadd, fcvt")) + "falu1") + +;; fp: Round/Trunc/Ceil/Floor/CVT* +(define_insn_reservation "loongson2f_fcvt" 5 + (and (eq_attr "cpu" "loongson2f") + (eq_attr "type" "fcvt")) + "falu1") + +;; fp: ADD/SUB/MUL/MADD/MSUB/NMADD/NMSUB +(define_insn_reservation "loongson2f_fadd" 7 + (and (eq_attr "cpu" "loongson2f") + (eq_attr "type" "fadd, fmul, fmadd")) + "falu1|falu2") + +;; fp: Mul +(define_insn_reservation "loongson2e_fmul" 6 + (and (eq_attr "cpu" "loongson2e") + (eq_attr "type" "fmul")) + "falu1|falu2") + +;; fp: Div.s +(define_insn_reservation "loongson2e_fdivs" 10 + (and (eq_attr "cpu" "loongson2e") + (and (eq_attr "type" "fdiv") + (eq_attr "mode" "SF"))) + "falu2*10") + +;; fp: Div.s +(define_insn_reservation "loongson2f_fdivs" 11 + (and (eq_attr "cpu" "loongson2f") + (and (eq_attr "type" "fdiv") + (eq_attr "mode" "SF"))) + "falu2*10") + +;; fp: Div.d +(define_insn_reservation "loongson2e_fdivd" 17 + (and (eq_attr "cpu" "loongson2e") + (and (eq_attr "type" "fdiv") + (eq_attr "mode" "DF"))) + "falu2*17") + +;; fp: Div.d +(define_insn_reservation "loongson2f_fdivd" 18 + (and (eq_attr "cpu" "loongson2f") + (and (eq_attr "type" "fdiv") + (eq_attr "mode" "DF"))) + "falu2*17") + +;; fp: Sqrt.s +(define_insn_reservation "loongson2e_sqrts" 16 + (and (eq_attr "cpu" "loongson2e") + (and (eq_attr "type" "fsqrt") + (eq_attr "mode" "SF"))) + "falu2*16") + +;; fp: Sqrt.s +(define_insn_reservation "loongson2f_sqrts" 17 + (and (eq_attr "cpu" "loongson2f") + (and (eq_attr "type" "fsqrt") + (eq_attr "mode" "SF"))) + "falu2*16") + +;; fp: Sqrt.d +(define_insn_reservation "loongson2e_sqrtd" 31 + (and (eq_attr "cpu" "loongson2e") + (and (eq_attr "type" "fsqrt") + (eq_attr "mode" "DF"))) + "falu2*31") + +;; fp: Sqrt.d +(define_insn_reservation "loongson2f_sqrtd" 32 + (and (eq_attr "cpu" "loongson2f") + (and (eq_attr "type" "fsqrt") + (eq_attr "mode" "DF"))) + "falu2*31") + +;; for debug +;; (automata_option "v") +;; (automata_option "progress") + diff -up -N gcc-3.4.6/gcc/config/mips/mips-protos.h loongson-gcc-3.4.6/gcc/config/mips/mips-protos.h --- gcc-3.4.6/gcc/config/mips/mips-protos.h 2005-07-31 16:35:15.000000000 +0800 +++ loongson-gcc-3.4.6/gcc/config/mips/mips-protos.h 2008-04-21 14:20:54.000000000 +0800 @@ -146,6 +146,7 @@ extern const char *mips_output_load_labe extern const char *mips_output_conditional_branch (rtx, rtx *, int, int, int, int); extern const char *mips_output_division (const char *, rtx *); +extern const char *mips_output_division_p (const char *, rtx *); extern unsigned int mips_hard_regno_nregs (int, enum machine_mode); extern int mips_return_in_memory (tree); extern const char *mips_emit_prefetch (rtx *); diff -up -N gcc-3.4.6/gcc/config/mips/mips.c loongson-gcc-3.4.6/gcc/config/mips/mips.c --- gcc-3.4.6/gcc/config/mips/mips.c 2005-07-31 16:35:15.000000000 +0800 +++ loongson-gcc-3.4.6/gcc/config/mips/mips.c 2008-04-21 14:13:45.000000000 +0800 @@ -489,10 +489,10 @@ int mips_isa; int mips_abi; /* Strings to hold which cpu and instruction set architecture to use. */ -const char *mips_arch_string; /* for -march=<xxx> */ -const char *mips_tune_string; /* for -mtune=<xxx> */ -const char *mips_isa_string; /* for -mips{1,2,3,4} */ -const char *mips_abi_string; /* for -mabi={32,n32,64,eabi} */ +const char *mips_arch_string; /* for -march=<xxx> */ +const char *mips_tune_string; /* for -mtune=<xxx> */ +const char *mips_isa_string; /* for -mips{1,2,3,4} */ +const char *mips_abi_string; /* for -mabi={32,n32,64,eabi} */ /* Whether we are generating mips16 hard float code. In mips16 mode we always set TARGET_SOFT_FLOAT; this variable is nonzero if @@ -726,6 +726,10 @@ const struct mips_cpu_info mips_cpu_info { "sb1", PROCESSOR_SB1, 64 }, { "sr71000", PROCESSOR_SR71000, 64 }, + /* ST Microelectronics Loongson 2E and 2F cores */ + { "loongson2e", PROCESSOR_LOONGSON2E, 3}, + { "loongson2f", PROCESSOR_LOONGSON2F, 3}, + /* End marker */ { 0, 0, 0 } }; @@ -4624,9 +4628,9 @@ override_options (void) There's no harm in specifying both as long as the ISA levels are the same. */ if (mips_arch_info != 0 && mips_isa != isa_info->isa) - error ("-mips%s conflicts with the other architecture options, " - "which specify a MIPS%d processor", - mips_isa_string, mips_isa); + error ("-mips%s conflicts with the other architecture options, " + "which specify a MIPS%d processor", + mips_isa_string, mips_isa); /* Set architecture based on the given option. */ mips_set_architecture (isa_info); @@ -9249,6 +9253,21 @@ mips_output_division (const char *divisi } return division; } + +/* Used to output (d)div(u).g or (d)mod(u).g instruction of loongson, + which takes three operands, and put the result in the rd register. + Hence emit the divide-by-zeor check before the DIVISION, in case + that the rd and rt are the same one. */ +const char * +mips_output_division_g (const char *division, rtx *operands) +{ + if (TARGET_CHECK_ZERO_DIV) + { + output_asm_insn ("bne\t%2,%.,1f%#\n\tbreak\t7\n1:", operands); + } + return division; +} + /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL with a final "000" replaced by "k". Ignore case. @@ -9411,6 +9430,9 @@ mips_issue_rate (void) case PROCESSOR_R7000: case PROCESSOR_R9000: return 2; + case PROCESSOR_LOONGSON2E: + case PROCESSOR_LOONGSON2F: + return 4; default: return 1; @@ -9433,6 +9455,8 @@ mips_use_dfa_pipeline_interface (void) case PROCESSOR_R7000: case PROCESSOR_R9000: case PROCESSOR_SR71000: + case PROCESSOR_LOONGSON2E: + case PROCESSOR_LOONGSON2F: return true; default: @@ -9662,4 +9686,10 @@ irix_section_type_flags (tree decl, cons #endif /* TARGET_IRIX */ +static int +debug_insn_id(rtx insn) +{ + return INSN_UID(insn); +} + #include "gt-mips.h" diff -up -N gcc-3.4.6/gcc/config/mips/mips.h loongson-gcc-3.4.6/gcc/config/mips/mips.h --- gcc-3.4.6/gcc/config/mips/mips.h 2004-07-15 08:42:49.000000000 +0800 +++ loongson-gcc-3.4.6/gcc/config/mips/mips.h 2008-04-21 20:31:57.000000000 +0800 @@ -67,7 +67,9 @@ enum processor_type { PROCESSOR_R8000, PROCESSOR_R9000, PROCESSOR_SB1, - PROCESSOR_SR71000 + PROCESSOR_SR71000, + PROCESSOR_LOONGSON2E, + PROCESSOR_LOONGSON2F }; /* Which ABI to use. ABI_32 (original 32, or o32), ABI_N32 (n32), @@ -333,6 +335,8 @@ extern const struct mips_cpu_info *mips_ #define TARGET_MIPS9000 (mips_arch == PROCESSOR_R9000) #define TARGET_SB1 (mips_arch == PROCESSOR_SB1) #define TARGET_SR71K (mips_arch == PROCESSOR_SR71000) +#define TARGET_LOONGSON2E (mips_arch == PROCESSOR_LOONGSON2E) +#define TARGET_LOONGSON2F (mips_arch == PROCESSOR_LOONGSON2F) /* Scheduling target defines. */ #define TUNE_MIPS3000 (mips_tune == PROCESSOR_R3000) @@ -346,6 +350,8 @@ extern const struct mips_cpu_info *mips_ #define TUNE_MIPS9000 (mips_tune == PROCESSOR_R9000) #define TUNE_SB1 (mips_tune == PROCESSOR_SB1) #define TUNE_SR71K (mips_tune == PROCESSOR_SR71000) +#define TUNE_LOONGSON2E (mips_tune == PROCESSOR_LOONGSON2E) +#define TUNE_LOONGSON2F (mips_tune == PROCESSOR_LOONGSON2F) #define TARGET_NEWABI (mips_abi == ABI_N32 || mips_abi == ABI_64) @@ -773,7 +779,7 @@ extern const struct mips_cpu_info *mips_ #define GENERATE_BRANCHLIKELY (TARGET_BRANCHLIKELY \ && !TARGET_SR71K \ - && !TARGET_MIPS16) + && !TARGET_MIPS16) /* Generate three-operand multiply instructions for SImode. */ #define GENERATE_MULT3_SI ((TARGET_MIPS3900 \ @@ -783,11 +789,15 @@ extern const struct mips_cpu_info *mips_ || TARGET_MIPS9000 \ || ISA_MIPS32 \ || ISA_MIPS32R2 \ - || ISA_MIPS64) \ + || ISA_MIPS64 \ + || TARGET_LOONGSON2E \ + || TARGET_LOONGSON2F) \ && !TARGET_MIPS16) /* Generate three-operand multiply instructions for DImode. */ -#define GENERATE_MULT3_DI ((TARGET_MIPS3900) \ +#define GENERATE_MULT3_DI ((TARGET_MIPS3900 \ + || TARGET_LOONGSON2E \ + || TARGET_LOONGSON2F) \ && !TARGET_MIPS16) /* Macros to decide whether certain features are available or not, @@ -824,7 +834,9 @@ extern const struct mips_cpu_info *mips_ #define ISA_HAS_CONDMOVE ((ISA_MIPS4 \ || ISA_MIPS32 \ || ISA_MIPS32R2 \ - || ISA_MIPS64) \ + || ISA_MIPS64 \ + || TARGET_LOONGSON2E \ + || TARGET_LOONGSON2F) \ && !TARGET_MIPS5500 \ && !TARGET_MIPS16) diff -up -N gcc-3.4.6/gcc/config/mips/mips.md loongson-gcc-3.4.6/gcc/config/mips/mips.md --- gcc-3.4.6/gcc/config/mips/mips.md 2005-07-31 16:35:15.000000000 +0800 +++ loongson-gcc-3.4.6/gcc/config/mips/mips.md 2008-04-22 00:31:53.000000000 +0800 @@ -119,8 +119,11 @@ ;; frsqrt floating point reciprocal square root ;; multi multiword sequence (or user asm statements) ;; nop no operation +;; multg loongson (d)mult(u).g +;; divg loongson (d)div(u).g, (d)mod(u).g + (define_attr "type" - "unknown,branch,jump,call,load,store,prefetch,prefetchx,move,condmove,xfer,hilo,const,arith,darith,imul,imadd,idiv,icmp,fadd,fmul,fmadd,fdiv,fabs,fneg,fcmp,fcvt,fsqrt,frsqrt,multi,nop" + "unknown,branch,jump,call,load,store,prefetch,prefetchx,move,condmove,xfer,hilo,const,arith,darith,imul,imadd,idiv,icmp,fadd,fmul,fmadd,fdiv,fabs,fneg,fcmp,fcvt,fsqrt,frsqrt,multi,nop,multg,divg" (cond [(eq_attr "jal" "!unset") (const_string "call") (eq_attr "got" "load") (const_string "load")] (const_string "unknown"))) @@ -214,7 +217,7 @@ ;; Attribute describing the processor. This attribute must match exactly ;; with the processor_type enumeration in mips.h. (define_attr "cpu" - "default,4kc,5kc,20kc,m4k,r3000,r3900,r6000,r4000,r4100,r4111,r4120,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,sb1,sr71000" + "default,4kc,5kc,20kc,m4k,r3000,r3900,r6000,r4000,r4100,r4111,r4120,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,sb1,sr71000,loongson2e,loongson2f" (const (symbol_ref "mips_tune"))) ;; The type of hardware hazard associated with this instruction. @@ -614,6 +617,8 @@ (include "7000.md") (include "9000.md") (include "sr71k.md") +(include "loongson2.md") + ;; ;; .................... @@ -1423,7 +1428,6 @@ (set_attr "mode" "SF") (set_attr "length" "8")]) - ;; ??? The R4000 (only) has a cpu bug. If a double-word shift executes while ;; a multiply is in progress, it may give an incorrect result. Avoid ;; this by keeping the mflo with the mult on the R4000. @@ -1434,7 +1438,9 @@ (match_operand:SI 2 "register_operand" "")))] "" { - if (GENERATE_MULT3_SI || TARGET_MAD) + if (TARGET_LOONGSON2E || TARGET_LOONGSON2F) + emit_insn (gen_mulsi3_multg (operands[0], operands[1], operands[2])); + else if (GENERATE_MULT3_SI || TARGET_MAD) emit_insn (gen_mulsi3_mult3 (operands[0], operands[1], operands[2])); else if (!TARGET_MIPS4000 || TARGET_MIPS16) emit_insn (gen_mulsi3_internal (operands[0], operands[1], operands[2])); @@ -1443,14 +1449,25 @@ DONE; }) +(define_insn "mulsi3_multg" + [(set (match_operand:SI 0 "register_operand" "=d,l") + (mult:SI (match_operand:SI 1 "register_operand" "d,d") + (match_operand:SI 2 "register_operand" "d,d")))] + "TARGET_LOONGSON2E || TARGET_LOONGSON2F" +{ + return "mult.g\t%0,%1,%2"; +} + [(set_attr "type" "multg") + (set_attr "mode" "SI")]) + (define_insn "mulsi3_mult3" [(set (match_operand:SI 0 "register_operand" "=d,l") (mult:SI (match_operand:SI 1 "register_operand" "d,d") (match_operand:SI 2 "register_operand" "d,d"))) (clobber (match_scratch:SI 3 "=h,h")) (clobber (match_scratch:SI 4 "=l,X"))] - "GENERATE_MULT3_SI - || TARGET_MAD" + "(GENERATE_MULT3_SI + || TARGET_MAD) && !(TARGET_LOONGSON2E || TARGET_LOONGSON2F)" { if (which_alternative == 1) return "mult\t%1,%2"; @@ -2358,6 +2375,89 @@ "nmsub.s\t%0,%1,%2,%3" [(set_attr "type" "fmadd") (set_attr "mode" "SF")]) + +;; Loongson 3-operand floating point multiply accumulate instructions. + +(define_insn "" + [(set (match_operand:DF 0 "register_operand" "=f") + (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "f") + (match_operand:DF 2 "register_operand" "f")) + (match_dup 0)))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FUSED_MADD" + "madd.d\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "DF")]) + +(define_insn "" + [(set (match_operand:SF 0 "register_operand" "=f") + (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "f") + (match_operand:SF 2 "register_operand" "f")) + (match_dup 0)))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_FUSED_MADD" + "madd.s\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "SF")]) + +(define_insn "" + [(set (match_operand:DF 0 "register_operand" "=f") + (minus:DF (mult:DF (match_operand:DF 1 "register_operand" "f") + (match_operand:DF 2 "register_operand" "f")) + (match_dup 0)))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FUSED_MADD" + "msub.d\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "DF")]) + +(define_insn "" + [(set (match_operand:SF 0 "register_operand" "=f") + (minus:SF (mult:SF (match_operand:SF 1 "register_operand" "f") + (match_operand:SF 2 "register_operand" "f")) + (match_dup 0)))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_FUSED_MADD" + "msub.s\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "SF")]) + +(define_insn "" + [(set (match_operand:DF 0 "register_operand" "=f") + (neg:DF (plus:DF (mult:DF (match_operand:DF 1 "register_operand" "f") + (match_operand:DF 2 "register_operand" "f")) + (match_dup 0))))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FUSED_MADD" + "nmadd.d\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "DF")]) + +(define_insn "" + [(set (match_operand:SF 0 "register_operand" "=f") + (neg:SF (plus:SF (mult:SF (match_operand:SF 1 "register_operand" "f") + (match_operand:SF 2 "register_operand" "f")) + (match_dup 0))))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_FUSED_MADD" + "nmadd.s\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "SF")]) + +(define_insn "" + [(set (match_operand:DF 0 "register_operand" "=f") + (minus:DF (match_dup 0) + (mult:DF (match_operand:DF 1 "register_operand" "f") + (match_operand:DF 2 "register_operand" "f"))))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FUSED_MADD" + "nmsub.d\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "DF")]) + +(define_insn "" + [(set (match_operand:SF 0 "register_operand" "=f") + (minus:SF (match_dup 0) + (mult:SF (match_operand:SF 1 "register_operand" "f") + (match_operand:SF 2 "register_operand" "f"))))] + "(TARGET_LOONGSON2E || TARGET_LOONGSON2F) && TARGET_HARD_FLOAT && TARGET_FUSED_MADD" + "nmsub.s\t%0,%1,%2" + [(set_attr "type" "fmadd") + (set_attr "mode" "SF")]) + ;; ;; .................... @@ -2367,6 +2467,61 @@ ;; .................... ;; +;; For loongson + +(define_insn "divsi3" + [(set (match_operand:SI 0 "register_operand" "=d") + (div:SI (match_operand:SI 1 "register_operand" "d") + (match_operand:SI 2 "register_operand" "d")))] + "TARGET_LOONGSON2E || TARGET_LOONGSON2F" + { return mips_output_division_g ("div.g\t%0,%1,%2", operands); } + [(set_attr "type" "divg") + (set_attr "mode" "SI") + (set (attr "length") + (if_then_else (ne (symbol_ref "TARGET_CHECK_ZERO_DIV") (const_int 0)) + (const_int 16) + (const_int 4)))]) + +(define_insn "udivsi3" + [(set (match_operand:SI 0 "register_operand" "=d") + (udiv:SI (match_operand:SI 1 "register_operand" "d") + (match_operand:SI 2 "register_operand" "d")))] + "TARGET_LOONGSON2E || TARGET_LOONGSON2F" + { return mips_output_division_g ("divu.g\t%0,%1,%2", operands); } + [(set_attr "type" "divg") + (set_attr "mode" "SI") + (set (attr "length") + (if_then_else (ne (symbol_ref "TARGET_CHECK_ZERO_DIV") (const_int 0)) + (const_int 16) + (const_int 4)))]) + +(define_insn "modsi3" + [(set (match_operand:SI 0 "register_operand" "=d") + (mod:SI (match_operand:SI 1 "register_operand" "d") + (match_operand:SI 2 "register_operand" "d")))] + "TARGET_LOONGSON2E || TARGET_LOONGSON2F" + { return mips_output_division_g ("mod.g\t%0,%1,%2", operands); } + [(set_attr "type" "divg") + (set_attr "mode" "SI") + (set (attr "length") + (if_then_else (ne (symbol_ref "TARGET_CHECK_ZERO_DIV") (const_int 0)) + (const_int 16) + (const_int 4)))]) + +(define_insn "umodsi3" + [(set (match_operand:SI 0 "register_operand" "=d") + (umod:SI (match_operand:SI 1 "register_operand" "d") + (match_operand:SI 2 "register_operand" "d")))] + "TARGET_LOONGSON2E || TARGET_LOONGSON2F" + { return mips_output_division_g ("modu.g\t%0,%1,%2", operands); } + [(set_attr "type" "divg") + (set_attr "mode" "SI") + (set (attr "length") + (if_then_else (ne (symbol_ref "TARGET_CHECK_ZERO_DIV") (const_int 0)) + (const_int 16) + (const_int 4)))]) +;; + (define_expand "divdf3" [(set (match_operand:DF 0 "register_operand" "") (div:DF (match_operand:DF 1 "reg_or_const_float_1_operand" "") 2008/4/22, Maxim Kuvyrkov <[EMAIL PROTECTED]>: > Eric Fisher wrote: > > hi > > > > Is there anyone working on the loongson support of gcc? I notice > > that loongson has been added into the currently developing binutils. > > > > Eric, > > I will start working on submitting Loongson patches developed at > CodeSourcery next week. These patches include general support for Loongson > 2E/2F CPUs, support for Loongson intrinsics, scheduling model and tuning > bits. > > -- > Maxim Kuvyrkov > CodeSourcery Inc. >