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

📄 mips.md

📁 GUN开源阻止下的编译器GCC
💻 MD
📖 第 1 页 / 共 5 页
字号:
  "mul.s\\t%0,%1,%2"  [(set_attr "type"	"fmul")   (set_attr "mode"	"SF")   (set_attr "length"	"1")]);; ??? 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 (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_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 "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;}")(define_insn "muldi3_internal"  [(set (match_operand:DI 0 "register_operand" "=l")	(mult:DI (match_operand:DI 1 "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 "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"  [(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"))))   (clobber (match_scratch:DI 3 "=l"))   (clobber (match_scratch:DI 4 "=h"))]  "TARGET_64BIT"  "multu\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "umulsi3_highpart"  [(set (match_operand:SI 0 "register_operand" "=h")	(truncate:SI	 (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "d"))			       (zero_extend:DI (match_operand:SI 2 "register_operand" "d")))		      (const_int 32))))   (clobber (match_scratch:SI 3 "=l"))   (clobber (match_scratch:SI 4 "=a"))]  ""  "multu\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "smuldi3_highpart"  [(set (match_operand:DI 0 "register_operand" "=h")	(truncate:DI	 (lshiftrt:TI (mult:TI (sign_extend:TI (match_operand:DI 1 "register_operand" "d"))			       (sign_extend:TI (match_operand:DI 2 "register_operand" "d")))		      (const_int 64))))   (clobber (match_scratch:DI 3 "=l"))   (clobber (match_scratch:DI 4 "=a"))]  "TARGET_64BIT"  "dmult\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"DI")   (set_attr "length"	"1")])(define_insn "umuldi3_highpart"  [(set (match_operand:DI 0 "register_operand" "=h")	(truncate:DI	 (lshiftrt:TI (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "d"))			       (zero_extend:TI (match_operand:DI 2 "register_operand" "d")))		      (const_int 64))))   (clobber (match_scratch:DI 3 "=l"))   (clobber (match_scratch:DI 4 "=a"))]  "TARGET_64BIT"  "dmultu\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"DI")   (set_attr "length"	"1")]);; The R4650 supports a 32 bit multiply/ 64 bit accumulate;; instruction.  The HI/LO registers are used as a 64 bit accumulator.(define_insn "madsi"  [(set (match_operand:SI 0 "register_operand" "+l")	(plus:SI (mult:SI (match_operand:SI 1 "register_operand" "d")			  (match_operand:SI 2 "register_operand" "d"))		 (match_dup 0)))   (clobber (match_scratch:SI 3 "=h"))   (clobber (match_scratch:SI 4 "=a"))]  "TARGET_MAD"  "mad\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"   "1")])(define_insn "maddi"  [(set (match_operand:DI 0 "register_operand" "+x")	(plus:DI (mult:DI (sign_extend:DI			   (match_operand:SI 1 "register_operand" "d"))			  (sign_extend:DI			   (match_operand:SI 2 "register_operand" "d")))		 (match_dup 0)))   (clobber (match_scratch:SI 3 "=a"))]  "TARGET_MAD && ! TARGET_64BIT"  "mad\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"   "1")])(define_insn "maddi_64bit"  [(set (match_operand:DI 0 "register_operand" "+a")	(plus:DI (mult:DI (sign_extend:DI			   (match_operand:SI 1 "register_operand" "d"))			  (sign_extend:DI			   (match_operand:SI 2 "register_operand" "d")))		 (match_dup 0)))   (clobber (match_scratch:DI 3 "=l"))   (clobber (match_scratch:DI 4 "=h"))]  "TARGET_MAD && TARGET_64BIT"  "mad\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"   "1")])(define_insn "umaddi"  [(set (match_operand:DI 0 "register_operand" "+x")	(plus:DI (mult:DI (zero_extend:DI			   (match_operand:SI 1 "register_operand" "d"))			  (zero_extend:DI			   (match_operand:SI 2 "register_operand" "d")))		 (match_dup 0)))   (clobber (match_scratch:SI 3 "=a"))]  "TARGET_MAD && ! TARGET_64BIT"  "madu\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"   "1")])(define_insn "umaddi_64bit"  [(set (match_operand:DI 0 "register_operand" "+a")	(plus:DI (mult:DI (zero_extend:DI			   (match_operand:SI 1 "register_operand" "d"))			  (zero_extend:DI			   (match_operand:SI 2 "register_operand" "d")))		 (match_dup 0)))   (clobber (match_scratch:DI 3 "=l"))   (clobber (match_scratch:DI 4 "=h"))]  "TARGET_MAD && TARGET_64BIT"  "madu\\t%1,%2"  [(set_attr "type"	"imul")   (set_attr "mode"	"SI")   (set_attr "length"   "1")]);; 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_operand:DF 3 "register_operand" "f")))]  "mips_isa >= 4 && TARGET_HARD_FLOAT"  "madd.d\\t%0,%3,%1,%2"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(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_operand:SF 3 "register_operand" "f")))]  "mips_isa >= 4 && TARGET_HARD_FLOAT"  "madd.s\\t%0,%3,%1,%2"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"SF")   (set_attr "length"	"1")])(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_operand:DF 3 "register_operand" "f")))]  "mips_isa >= 4 && TARGET_HARD_FLOAT"  "msub.d\\t%0,%3,%1,%2"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(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_operand:SF 3 "register_operand" "f")))]		    "mips_isa >= 4 && TARGET_HARD_FLOAT"  "msub.s\\t%0,%3,%1,%2"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"SF")   (set_attr "length"	"1")])(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_operand:DF 3 "register_operand" "f"))))]  "mips_isa >= 4 && TARGET_HARD_FLOAT"  "nmadd.d\\t%0,%3,%1,%2"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(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_operand:SF 3 "register_operand" "f"))))]  "mips_isa >= 4 && TARGET_HARD_FLOAT"  "nmadd.s\\t%0,%3,%1,%2"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"SF")   (set_attr "length"	"1")])(define_insn ""  [(set (match_operand:DF 0 "register_operand" "=f")	(minus:DF (match_operand:DF 1 "register_operand" "f")		  (mult:DF (match_operand:DF 2 "register_operand" "f")			   (match_operand:DF 3 "register_operand" "f"))))]  "mips_isa >= 4 && TARGET_HARD_FLOAT"  "nmsub.d\\t%0,%1,%2,%3"  [(set_attr "type"	"fmadd")   (set_attr "mode"	"DF")

⌨️ 快捷键说明

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