⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mips.md

📁 GCC编译器源代码
💻 MD
📖 第 1 页 / 共 5 页
字号:
   (set (subreg:SI (match_dup 0) 0)	(minus:SI (subreg:SI (match_dup 1) 0)		  (subreg:SI (match_dup 2) 0)))   (set (subreg:SI (match_dup 0) 0)	(minus:SI (subreg:SI (match_dup 0) 0)		  (match_dup 3)))]  "")(define_insn "subdi3_internal_2"  [(set (match_operand:DI 0 "register_operand" "=d,d,d")	(minus:DI (match_operand:DI 1 "register_operand" "d,d,d")		  (match_operand:DI 2 "small_int" "P,J,N")))   (clobber (match_operand:SI 3 "register_operand" "=d,d,d"))]  "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && INTVAL (operands[2]) != -32768"  "@   sltu\\t%3,%L1,%2\;subu\\t%L0,%L1,%2\;subu\\t%M0,%M1,%3   move\\t%L0,%L1\;move\\t%M0,%M1   sltu\\t%3,%L1,%2\;subu\\t%L0,%L1,%2\;subu\\t%M0,%M1,1\;subu\\t%M0,%M0,%3"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"3,2,4")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(minus:DI (match_operand:DI 1 "register_operand" "")		  (match_operand:DI 2 "small_int" "")))   (clobber (match_operand:SI 3 "register_operand" ""))]  "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE   && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))   && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))   && INTVAL (operands[2]) > 0"  [(set (match_dup 3)	(ltu:SI (subreg:SI (match_dup 1) 0)		(match_dup 2)))   (set (subreg:SI (match_dup 0) 0)	(minus:SI (subreg:SI (match_dup 1) 0)		  (match_dup 2)))   (set (subreg:SI (match_dup 0) 1)	(minus:SI (subreg:SI (match_dup 1) 1)		  (match_dup 3)))]  "")(define_split  [(set (match_operand:DI 0 "register_operand" "")	(minus:DI (match_operand:DI 1 "register_operand" "")		  (match_operand:DI 2 "small_int" "")))   (clobber (match_operand:SI 3 "register_operand" ""))]  "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE   && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))   && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))   && INTVAL (operands[2]) > 0"  [(set (match_dup 3)	(ltu:SI (subreg:SI (match_dup 1) 1)		(match_dup 2)))   (set (subreg:SI (match_dup 0) 1)	(minus:SI (subreg:SI (match_dup 1) 1)		  (match_dup 2)))   (set (subreg:SI (match_dup 0) 0)	(minus:SI (subreg:SI (match_dup 1) 0)		  (match_dup 3)))]  "")(define_insn "subdi3_internal_3"  [(set (match_operand:DI 0 "register_operand" "=d")	(minus:DI (match_operand:DI 1 "se_reg_or_0_operand" "dJ")		  (match_operand:DI 2 "se_arith_operand" "dI")))]  "TARGET_64BIT && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "*{  return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)    ? \"daddu\\t%0,%z1,%n2\"    : \"dsubu\\t%0,%z1,%2\";}"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"1")])(define_insn "subsi3_internal_2"  [(set (match_operand:DI 0 "register_operand" "=d")	(sign_extend:DI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")				  (match_operand:SI 2 "arith_operand" "dI"))))]  "TARGET_64BIT && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "*{  return (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)    ? \"addu\\t%0,%z1,%n2\"    : \"subu\\t%0,%z1,%2\";}"  [(set_attr "type"	"arith")   (set_attr "mode"	"DI")   (set_attr "length"	"1")]);;;;  ....................;;;;	MULTIPLICATION;;;;  ....................;;;; Early Vr4300 silicon has a CPU bug where multiplies with certain;; operands may corrupt immediately following multiplies. This is a;; simple fix to insert NOPs.(define_expand "muldf3"  [(set (match_operand:DF 0 "register_operand" "=f")	(mult:DF (match_operand:DF 1 "register_operand" "f")		 (match_operand:DF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT"  "{  if (mips_cpu != PROCESSOR_R4300)    emit_insn (gen_muldf3_internal (operands[0], operands[1], operands[2]));  else    emit_insn (gen_muldf3_r4300 (operands[0], operands[1], operands[2]));  DONE;}")(define_insn "muldf3_internal"  [(set (match_operand:DF 0 "register_operand" "=f")	(mult:DF (match_operand:DF 1 "register_operand" "f")		 (match_operand:DF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && mips_cpu != PROCESSOR_R4300"  "mul.d\\t%0,%1,%2"  [(set_attr "type"	"fmul")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(define_insn "muldf3_r4300"  [(set (match_operand:DF 0 "register_operand" "=f")	(mult:DF (match_operand:DF 1 "register_operand" "f")		 (match_operand:DF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && mips_cpu == PROCESSOR_R4300"  "*{  output_asm_insn (\"mul.d\\t%0,%1,%2\", operands);  if (TARGET_4300_MUL_FIX)    output_asm_insn (\"nop\", operands);  return \"\";}"  [(set_attr "type"	"fmul")   (set_attr "mode"	"DF")   (set_attr "length"	"2")])	;; mul.d + nop(define_expand "mulsf3"  [(set (match_operand:SF 0 "register_operand" "=f")	(mult:SF (match_operand:SF 1 "register_operand" "f")		 (match_operand:SF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "{  if (mips_cpu != PROCESSOR_R4300)    emit_insn( gen_mulsf3_internal (operands[0], operands[1], operands[2]));  else    emit_insn( gen_mulsf3_r4300 (operands[0], operands[1], operands[2]));  DONE;}")(define_insn "mulsf3_internal"  [(set (match_operand:SF 0 "register_operand" "=f")	(mult:SF (match_operand:SF 1 "register_operand" "f")		 (match_operand:SF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT && mips_cpu != PROCESSOR_R4300"  "mul.s\\t%0,%1,%2"  [(set_attr "type"	"fmul")   (set_attr "mode"	"SF")   (set_attr "length"	"1")])(define_insn "mulsf3_r4300"  [(set (match_operand:SF 0 "register_operand" "=f")	(mult:SF (match_operand:SF 1 "register_operand" "f")		 (match_operand:SF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT && mips_cpu == PROCESSOR_R4300"  "*{  output_asm_insn (\"mul.s\\t%0,%1,%2\", operands);  if (TARGET_4300_MUL_FIX)    output_asm_insn (\"nop\", operands);  return \"\";}"  [(set_attr "type"	"fmul")   (set_attr "mode"	"SF")   (set_attr "length"	"2")])	;; mul.s + nop;; ??? 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.(define_expand "mulsi3"  [(set (match_operand:SI 0 "register_operand" "=l")	(mult:SI (match_operand:SI 1 "register_operand" "d")		 (match_operand:SI 2 "register_operand" "d")))   (clobber (match_scratch:SI 3 "=h"))   (clobber (match_scratch:SI 4 "=a"))]  ""  "{  if (GENERATE_MULT3)    emit_insn (gen_mulsi3_mult3 (operands[0], operands[1], operands[2]));  else if (TARGET_MAD)    emit_insn (gen_mulsi3_r4650 (operands[0], operands[1], operands[2]));  else if (mips_cpu != PROCESSOR_R4000)    emit_insn (gen_mulsi3_internal (operands[0], operands[1], operands[2]));  else    emit_insn (gen_mulsi3_r4000 (operands[0], operands[1], operands[2]));  DONE;}")(define_insn "mulsi3_mult3"  [(set (match_operand:SI 0 "register_operand" "=d")	(mult:SI (match_operand:SI 1 "register_operand" "d")		 (match_operand:SI 2 "register_operand" "d")))   (clobber (match_scratch:SI 3 "=h"))   (clobber (match_scratch:SI 4 "=l"))   (clobber (match_scratch:SI 5 "=a"))]  "GENERATE_MULT3"  "mult\\t%0,%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "mulsi3_internal"  [(set (match_operand:SI 0 "register_operand" "=l")	(mult:SI (match_operand:SI 1 "register_operand" "d")		 (match_operand:SI 2 "register_operand" "d")))   (clobber (match_scratch:SI 3 "=h"))   (clobber (match_scratch:SI 4 "=a"))]  "mips_cpu != PROCESSOR_R4000"  "mult\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "mulsi3_r4000"  [(set (match_operand:SI 0 "register_operand" "=d")	(mult:SI (match_operand:SI 1 "register_operand" "d")		 (match_operand:SI 2 "register_operand" "d")))   (clobber (match_scratch:SI 3 "=h"))   (clobber (match_scratch:SI 4 "=l"))   (clobber (match_scratch:SI 5 "=a"))]  "mips_cpu == PROCESSOR_R4000"  "*{  rtx xoperands[10];  xoperands[0] = operands[0];  xoperands[1] = gen_rtx (REG, SImode, LO_REGNUM);  output_asm_insn (\"mult\\t%1,%2\", operands);  output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);  return \"\";}"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"3")])		;; mult + mflo + delay(define_insn "mulsi3_r4650"  [(set (match_operand:SI 0 "register_operand" "=d")	(mult:SI (match_operand:SI 1 "register_operand" "d")		 (match_operand:SI 2 "register_operand" "d")))   (clobber (match_scratch:SI 3 "=h"))   (clobber (match_scratch:SI 4 "=l"))   (clobber (match_scratch:SI 5 "=a"))]  "TARGET_MAD"  "mul\\t%0,%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_expand "muldi3"  [(set (match_operand:DI 0 "register_operand" "=l")	(mult:DI (match_operand:DI 1 "se_register_operand" "d")		 (match_operand:DI 2 "register_operand" "d")))   (clobber (match_scratch:DI 3 "=h"))   (clobber (match_scratch:DI 4 "=a"))]  "TARGET_64BIT"  "{  if (mips_cpu != PROCESSOR_R4000)    emit_insn (gen_muldi3_internal (operands[0], operands[1], operands[2]));  else    emit_insn (gen_muldi3_r4000 (operands[0], operands[1], operands[2]));  DONE;}");; Don't accept both operands using se_register_operand, because if;; both operands are sign extended we would prefer to use mult in the;; mulsidi3 pattern.  Commutativity should permit either operand to be;; sign extended.(define_insn "muldi3_internal"  [(set (match_operand:DI 0 "register_operand" "=l")	(mult:DI (match_operand:DI 1 "se_register_operand" "d")		 (match_operand:DI 2 "register_operand" "d")))   (clobber (match_scratch:DI 3 "=h"))   (clobber (match_scratch:DI 4 "=a"))]  "TARGET_64BIT && mips_cpu != PROCESSOR_R4000"  "dmult\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"DI")   (set_attr "length"	"1")])(define_insn "muldi3_r4000"  [(set (match_operand:DI 0 "register_operand" "=d")	(mult:DI (match_operand:DI 1 "se_register_operand" "d")		 (match_operand:DI 2 "register_operand" "d")))   (clobber (match_scratch:DI 3 "=h"))   (clobber (match_scratch:DI 4 "=l"))   (clobber (match_scratch:DI 5 "=a"))]  "TARGET_64BIT && mips_cpu == PROCESSOR_R4000"  "*{  rtx xoperands[10];  xoperands[0] = operands[0];  xoperands[1] = gen_rtx (REG, DImode, LO_REGNUM);  output_asm_insn (\"dmult\\t%1,%2\", operands);  output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);  return \"\";}"  [(set_attr "type"	"imul")   (set_attr "mode"	"DI")   (set_attr "length"	"3")])		;; mult + mflo + delay;; ??? We could define a mulditi3 pattern when TARGET_64BIT.(define_expand "mulsidi3"  [(set (match_operand:DI 0 "register_operand" "=x")	(mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))		 (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))]  ""  "{  if (TARGET_64BIT)    emit_insn (gen_mulsidi3_64bit (operands[0], operands[1], operands[2]));  else    emit_insn (gen_mulsidi3_internal (operands[0], operands[1], operands[2]));  DONE;}")(define_insn "mulsidi3_internal"  [(set (match_operand:DI 0 "register_operand" "=x")	(mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))		 (sign_extend:DI (match_operand:SI 2 "register_operand" "d"))))   (clobber (match_scratch:SI 3 "=a"))]  "!TARGET_64BIT"  "mult\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "mulsidi3_64bit"  [(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"))))   (clobber (match_scratch:DI 3 "=l"))   (clobber (match_scratch:DI 4 "=h"))]  "TARGET_64BIT"  "mult\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "smulsi3_highpart"  [(set (match_operand:SI 0 "register_operand" "=h")	(truncate:SI	 (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "d"))			       (sign_extend:DI (match_operand:SI 2 "register_operand" "d")))		      (const_int 32))))   (clobber (match_scratch:SI 3 "=l"))   (clobber (match_scratch:SI 4 "=a"))]  ""  "mult\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_expand "umulsidi3"  [(set (match_operand:DI 0 "register_operand" "=x")	(mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))		 (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))]  ""  "{  if (TARGET_64BIT)    emit_insn (gen_umulsidi3_64bit (operands[0], operands[1], operands[2]));  else    emit_insn (gen_umulsidi3_internal (operands[0], operands[1], operands[2]));  DONE;}")(define_insn "umulsidi3_internal"  [(set (match_operand:DI 0 "register_operand" "=x")	(mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))		 (zero_extend:DI (match_operand:SI 2 "register_operand" "d"))))   (clobber (match_scratch:SI 3 "=a"))]  "!TARGET_64BIT"  "multu\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "umulsidi3_64bit"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -