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

📄 mips.md

📁 早期freebsd实现
💻 MD
📖 第 1 页 / 共 5 页
字号:
   (set_attr "length"	"13")])		;; various tests for dividing by 0 and such(define_insn "udivmodsi4"  [(set (match_operand:SI 0 "register_operand" "=d")	(udiv:SI (match_operand:SI 1 "register_operand" "d")		 (match_operand:SI 2 "register_operand" "d")))   (set (match_operand:SI 3 "register_operand" "=d")	(umod:SI (match_dup 1)		 (match_dup 2)))   (clobber (reg:SI 64))   (clobber (reg:SI 65))]  "optimize"  "*{  if (find_reg_note (insn, REG_UNUSED, operands[3]))    return \"divu\\t%0,%1,%2\";  if (find_reg_note (insn, REG_UNUSED, operands[0]))    return \"remu\\t%3,%1,%2\";  return \"divu\\t%0,%1,%2\;mfhi\\t%3\";}"  [(set_attr "type"	"idiv")   (set_attr "mode"	"SI")   (set_attr "length"	"13")])		;; various tests for dividing by 0 and such(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")))   (clobber (reg:SI 64))   (clobber (reg:SI 65))]  "!optimize"  "div\\t%0,%1,%2"  [(set_attr "type"	"idiv")   (set_attr "mode"	"SI")   (set_attr "length"	"13")])		;; various tests for dividing by 0 and such(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")))   (clobber (reg:SI 64))   (clobber (reg:SI 65))]  "!optimize"  "rem\\t%0,%1,%2"  [(set_attr "type"	"idiv")   (set_attr "mode"	"SI")   (set_attr "length"	"14")])		;; various tests for dividing by 0 and such(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")))   (clobber (reg:SI 64))   (clobber (reg:SI 65))]  "!optimize"  "divu\\t%0,%1,%2"  [(set_attr "type"	"idiv")   (set_attr "mode"	"SI")   (set_attr "length"	"14")])		;; various tests for dividing by 0 and such(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")))   (clobber (reg:SI 64))   (clobber (reg:SI 65))]  "!optimize"  "remu\\t%0,%1,%2"  [(set_attr "type"	"idiv")   (set_attr "mode"	"SI")   (set_attr "length"	"14")])		;; various tests for dividing by 0 and such;;;;  ....................;;;;	SQUARE ROOT;;;;  ....................(define_insn "sqrtdf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(sqrt:DF (match_operand:DF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT && HAVE_SQRT_P()"  "sqrt.d\\t%0,%1"  [(set_attr "type"	"fabs")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(define_insn "sqrtsf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(sqrt:SF (match_operand:SF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT && HAVE_SQRT_P()"  "sqrt.s\\t%0,%1"  [(set_attr "type"	"fabs")   (set_attr "mode"	"SF")   (set_attr "length"	"1")]);;;;  ....................;;;;	ABSOLUTE VALUE;;;;  ....................;; Do not use the integer abs macro instruction, since that signals an;; exception on -2147483648 (sigh).(define_insn "abssi2"  [(set (match_operand:SI 0 "register_operand" "=d")	(abs:SI (match_operand:SI 1 "register_operand" "d")))]  ""  "*{  dslots_jump_total++;  dslots_jump_filled++;  operands[2] = const0_rtx;  return (REGNO (operands[0]) == REGNO (operands[1]))		? \"bgez\\t%1,1f%#\\n\\tsubu\\t%0,%z2,%0\\n1:\"		: \"%(bgez\\t%1,1f\\n\\tmove\\t%0,%1\\n\\tsubu\\t%0,%z2,%0\\n1:%)\";}"  [(set_attr "type"	"multi")   (set_attr "mode"	"SI")   (set_attr "length"	"3")])(define_insn "absdf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(abs:DF (match_operand:DF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "abs.d\\t%0,%1"  [(set_attr "type"	"fabs")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(define_insn "abssf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(abs:SF (match_operand:SF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "abs.s\\t%0,%1"  [(set_attr "type"	"fabs")   (set_attr "mode"	"SF")   (set_attr "length"	"1")]);;;;  ....................;;;;	FIND FIRST BIT INSTRUCTION;;;;  ....................;;(define_insn "ffssi2"  [(set (match_operand:SI 0 "register_operand" "=&d")	(ffs:SI (match_operand:SI 1 "register_operand" "d")))   (clobber (match_scratch:SI 2 "=&d"))   (clobber (match_scratch:SI 3 "=&d"))]  ""  "*{  dslots_jump_total += 2;  dslots_jump_filled += 2;  operands[4] = const0_rtx;  if (optimize && find_reg_note (insn, REG_DEAD, operands[1]))    return \"%(\\move\\t%0,%z4\\n\\\\tbeq\\t%1,%z4,2f\\n\\1:\\tand\\t%2,%1,0x0001\\n\\\\taddu\\t%0,%0,1\\n\\\\tbeq\\t%2,%z4,1b\\n\\\\tsrl\\t%1,%1,1\\n\\2:%)\";  return \"%(\\move\\t%0,%z4\\n\\\\tmove\\t%3,%1\\n\\\\tbeq\\t%3,%z4,2f\\n\\1:\\tand\\t%2,%3,0x0001\\n\\\\taddu\\t%0,%0,1\\n\\\\tbeq\\t%2,%z4,1b\\n\\\\tsrl\\t%3,%3,1\\n\\2:%)\";}"  [(set_attr "type"	"multi")   (set_attr "mode"	"SI")   (set_attr "length"	"6")]);;;;  ....................;;;;	NEGATION and ONE'S COMPLEMENT;;;;  ....................(define_insn "negsi2"  [(set (match_operand:SI 0 "register_operand" "=d")	(neg:SI (match_operand:SI 1 "register_operand" "d")))]  ""  "*{  operands[2] = const0_rtx;  return \"subu\\t%0,%z2,%1\";}"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_expand "negdi3"  [(parallel [(set (match_operand:DI 0 "register_operand" "=d")		   (neg:DI (match_operand:DI 1 "register_operand" "d")))	      (clobber (match_dup 2))])]  "!TARGET_DEBUG_G_MODE"  "operands[2] = gen_reg_rtx (SImode);")(define_insn "negdi3_internal"  [(set (match_operand:DI 0 "register_operand" "=d")	(neg:DI (match_operand:DI 1 "register_operand" "d")))   (clobber (match_operand:SI 2 "register_operand" "=d"))]  "!TARGET_DEBUG_G_MODE"  "*{  operands[3] = const0_rtx;  return \"subu\\t%L0,%z3,%L1\;subu\\t%M0,%z3,%M1\;sltu\\t%2,%z3,%L0\;subu\\t%M0,%M0,%2\";}"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"4")])(define_insn "negdf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(neg:DF (match_operand:DF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "neg.d\\t%0,%1"  [(set_attr "type"	"fneg")   (set_attr "mode"	"DF")   (set_attr "length"	"1")])(define_insn "negsf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(neg:SF (match_operand:SF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "neg.s\\t%0,%1"  [(set_attr "type"	"fneg")   (set_attr "mode"	"SF")   (set_attr "length"	"1")])(define_insn "one_cmplsi2"  [(set (match_operand:SI 0 "register_operand" "=d")	(not:SI (match_operand:SI 1 "register_operand" "d")))]  ""  "*{  operands[2] = const0_rtx;  return \"nor\\t%0,%z2,%1\";}"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "one_cmpldi2"  [(set (match_operand:DI 0 "register_operand" "=d")	(not:SI (match_operand:DI 1 "register_operand" "d")))]  ""  "*{  operands[2] = const0_rtx;  return \"nor\\t%M0,%z2,%M1\;nor\\t%L0,%z2,%L1\";}"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"2")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(not:DI (match_operand:DI 1 "register_operand" "")))]  "reload_completed && !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]))"  [(set (subreg:SI (match_dup 0) 0) (not:SI (subreg:SI (match_dup 1) 0)))   (set (subreg:SI (match_dup 0) 1) (not:SI (subreg:SI (match_dup 1) 1)))]  "");; Simple hack to recognize the "nor" instruction on the MIPS;; This must appear before the normal or patterns, so that the;; combiner will correctly fold things.(define_insn "norsi3"  [(set (match_operand:SI 0 "register_operand" "=d")	(not:SI (ior:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")			(match_operand:SI 2 "reg_or_0_operand" "dJ"))))]  ""  "nor\\t%0,%z1,%z2"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "nordi3"  [(set (match_operand:DI 0 "register_operand" "=d")	(not:DI (ior:DI (match_operand:DI 1 "register_operand" "d")			(match_operand:DI 2 "register_operand" "d"))))]  ""  "nor\\t%M0,%M1,%M2\;nor\\t%L0,%L1,%L2"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"2")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(not:DI (ior:DI (match_operand:DI 1 "register_operand" "")			(match_operand:DI 2 "register_operand" ""))))]  "reload_completed && !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]))   && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"  [(set (subreg:SI (match_dup 0) 0) (not:SI (ior:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0))))   (set (subreg:SI (match_dup 0) 1) (not:SI (ior:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1))))]  "");;;;  ....................;;;;	LOGICAL;;;;  ....................;;(define_insn "andsi3"  [(set (match_operand:SI 0 "register_operand" "=d,d")	(and:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")		(match_operand:SI 2 "uns_arith_operand" "d,K")))]  ""  "@   and\\t%0,%1,%2   andi\\t%0,%1,%x2"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "anddi3"  [(set (match_operand:DI 0 "register_operand" "=d")	(and:DI (match_operand:DI 1 "register_operand" "d")		(match_operand:DI 2 "register_operand" "d")))]  "!TARGET_DEBUG_G_MODE"  "and\\t%M0,%M1,%M2\;and\\t%L0,%L1,%L2"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"2")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(and:DI (match_operand:DI 1 "register_operand" "")		(match_operand:DI 2 "register_operand" "")))]  "reload_completed && !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]))   && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"  [(set (subreg:SI (match_dup 0) 0) (and:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))   (set (subreg:SI (match_dup 0) 1) (and:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]  "")(define_insn "iorsi3"  [(set (match_operand:SI 0 "register_operand" "=d,d")	(ior:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")		(match_operand:SI 2 "uns_arith_operand" "d,K")))]  ""  "@   or\\t%0,%1,%2   ori\\t%0,%1,%x2"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "iordi3"  [(set (match_operand:DI 0 "register_operand" "=d")	(ior:DI (match_operand:DI 1 "register_operand" "d")		(match_operand:DI 2 "register_operand" "d")))]  "!TARGET_DEBUG_G_MODE"  "or\\t%M0,%M1,%M2\;or\\t%L0,%L1,%L2"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"2")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(ior:DI (match_operand:DI 1 "register_operand" "")		(match_operand:DI 2 "register_operand" "")))]  "reload_completed && !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]))   && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"  [(set (subreg:SI (match_dup 0) 0) (ior:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))   (set (subreg:SI (match_dup 0) 1) (ior:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]  "")(define_insn "xorsi3"  [(set (match_operand:SI 0 "register_operand" "=d,d")	(xor:SI (match_operand:SI 1 "uns_arith_operand" "%d,d")		(match_operand:SI 2 "uns_arith_operand" "d,K")))]  ""  "@   xor\\t%0,%1,%2   xori\\t%0,%1,%x2"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr "length"	"1")])(define_insn "xordi3"

⌨️ 快捷键说明

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