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

📄 mips.md

📁 gcc-you can use this code to learn something about gcc, and inquire further into linux,
💻 MD
📖 第 1 页 / 共 5 页
字号:
(define_insn "subsf3"  [(set (match_operand:SF 0 "register_operand" "=f")	(minus:SF (match_operand:SF 1 "register_operand" "f")		  (match_operand:SF 2 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "sub.s\\t%0,%1,%2"  [(set_attr "type"	"fadd")   (set_attr "mode"	"SF")])(define_expand "subsi3"  [(set (match_operand:SI 0 "register_operand" "=d")	(minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")		  (match_operand:SI 2 "arith_operand" "dI")))]  ""  "{  if (GET_CODE (operands[2]) == CONST_INT      && (INTVAL (operands[2]) == -32768	  || (TARGET_MIPS16	      && INTVAL (operands[2]) == -0x4000)))    operands[2] = force_reg (SImode, operands[2]);}")(define_insn "subsi3_internal"  [(set (match_operand:SI 0 "register_operand" "=d")	(minus:SI (match_operand:SI 1 "reg_or_0_operand" "dJ")		  (match_operand:SI 2 "arith_operand" "dI")))]  "!TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "subu\\t%0,%z1,%2"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")]);; For the mips16, we need to recognize stack pointer subtractions;; explicitly, since we don't have a constraint for $sp.  These insns;; will be generated by the save_restore_insns functions.(define_insn ""  [(set (reg:SI 29)	(minus:SI (reg:SI 29)		  (match_operand:SI 0 "small_int" "I")))]  "TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "addu\\t%$,%$,%n0"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set (attr "length")	(if_then_else (match_operand:VOID 0 "m16_nsimm8_8" "")				      (const_int 4)				      (const_int 8)))])(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=d")	(minus:SI (reg:SI 29)		  (match_operand:SI 1 "small_int" "I")))]  "TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "addu\\t%0,%$,%n1"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set (attr "length")	(if_then_else (match_operand:VOID 1 "m16_nuimm8_4" "")				      (const_int 4)				      (const_int 8)))])(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=d,d,d")	(minus:SI (match_operand:SI 1 "register_operand" "0,d,d")		  (match_operand:SI 2 "arith_operand" "I,O,d")))]  "TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT       || (INTVAL (operands[2]) != -32768 && INTVAL (operands[2]) != -0x4000))"  "*{  if (REGNO (operands[0]) == REGNO (operands[1]))    return \"subu\\t%0,%2\";  return \"subu\\t%0,%1,%2\";}"  [(set_attr "type"	"arith")   (set_attr "mode"	"SI")   (set_attr_alternative "length"		[(if_then_else (match_operand:VOID 2 "m16_nsimm8_1" "")			       (const_int 4)			       (const_int 8))		 (if_then_else (match_operand:VOID 2 "m16_nsimm4_1" "")			       (const_int 4)			       (const_int 8))		 (const_int 4)])]);; On the mips16, we can sometimes split an subtract of a constant;; which is a 4 byte instruction into two adds which are both 2 byte;; instructions.  There are two cases: one where we are setting a;; register to a register minus a constant, and one where we are;; simply subtracting a constant from a register.(define_split  [(set (match_operand:SI 0 "register_operand" "")	(minus:SI (match_dup 0)		  (match_operand:SI 1 "const_int_operand" "")))]  "TARGET_MIPS16 && reload_completed && !TARGET_DEBUG_D_MODE   && GET_CODE (operands[0]) == REG   && M16_REG_P (REGNO (operands[0]))   && GET_CODE (operands[1]) == CONST_INT   && ((INTVAL (operands[1]) > 0x80	&& INTVAL (operands[1]) <= 0x80 + 0x80)       || (INTVAL (operands[1]) < - 0x7f	   && INTVAL (operands[1]) >= - 0x7f - 0x7f))"  [(set (match_dup 0) (minus:SI (match_dup 0) (match_dup 1)))   (set (match_dup 0) (minus:SI (match_dup 0) (match_dup 2)))]  "{  HOST_WIDE_INT val = INTVAL (operands[1]);  if (val >= 0)    {      operands[1] = GEN_INT (0x80);      operands[2] = GEN_INT (val - 0x80);    }  else    {      operands[1] = GEN_INT (- 0x7f);      operands[2] = GEN_INT (val + 0x7f);    }}")(define_split  [(set (match_operand:SI 0 "register_operand" "")	(minus:SI (match_operand:SI 1 "register_operand" "")		  (match_operand:SI 2 "const_int_operand" "")))]  "TARGET_MIPS16 && reload_completed && !TARGET_DEBUG_D_MODE   && GET_CODE (operands[0]) == REG   && M16_REG_P (REGNO (operands[0]))   && GET_CODE (operands[1]) == REG   && M16_REG_P (REGNO (operands[1]))   && REGNO (operands[0]) != REGNO (operands[1])   && GET_CODE (operands[2]) == CONST_INT   && ((INTVAL (operands[2]) > 0x8	&& INTVAL (operands[2]) <= 0x8 + 0x80)       || (INTVAL (operands[2]) < - 0x7	   && INTVAL (operands[2]) >= - 0x7 - 0x7f))"  [(set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2)))   (set (match_dup 0) (minus:SI (match_dup 0) (match_dup 3)))]  "{  HOST_WIDE_INT val = INTVAL (operands[2]);  if (val >= 0)    {      operands[2] = GEN_INT (0x8);      operands[3] = GEN_INT (val - 0x8);    }  else    {      operands[2] = GEN_INT (- 0x7);      operands[3] = GEN_INT (val + 0x7);    }}")(define_expand "subdi3"  [(parallel [(set (match_operand:DI 0 "register_operand" "=d")		   (minus:DI (match_operand:DI 1 "se_register_operand" "d")			     (match_operand:DI 2 "se_register_operand" "d")))	      (clobber (match_dup 3))])]  "TARGET_64BIT || (!TARGET_DEBUG_G_MODE && !TARGET_MIPS16)"  "{  if (TARGET_64BIT)    {      emit_insn (gen_subdi3_internal_3 (operands[0], operands[1],					operands[2]));      DONE;    }  operands[3] = gen_reg_rtx (SImode);}")(define_insn "subdi3_internal"  [(set (match_operand:DI 0 "register_operand" "=d")	(minus:DI (match_operand:DI 1 "register_operand" "d")		  (match_operand:DI 2 "register_operand" "d")))   (clobber (match_operand:SI 3 "register_operand" "=d"))]  "!TARGET_64BIT && !TARGET_DEBUG_G_MODE && !TARGET_MIPS16"  "sltu\\t%3,%L1,%L2\;subu\\t%L0,%L1,%L2\;subu\\t%M0,%M1,%M2\;subu\\t%M0,%M0,%3"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"16")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(minus:DI (match_operand:DI 1 "register_operand" "")		  (match_operand:DI 2 "register_operand" "")))   (clobber (match_operand:SI 3 "register_operand" ""))]  "reload_completed && !WORDS_BIG_ENDIAN && !TARGET_64BIT   && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE && !TARGET_MIPS16   && 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 (match_dup 3)	(ltu: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 1) 0)		  (subreg:SI (match_dup 2) 0)))   (set (subreg:SI (match_dup 0) 4)	(minus:SI (subreg:SI (match_dup 1) 4)		  (subreg:SI (match_dup 2) 4)))   (set (subreg:SI (match_dup 0) 4)	(minus:SI (subreg:SI (match_dup 0) 4)		  (match_dup 3)))]  "")(define_split  [(set (match_operand:DI 0 "register_operand" "")	(minus:DI (match_operand:DI 1 "register_operand" "")		  (match_operand:DI 2 "register_operand" "")))   (clobber (match_operand:SI 3 "register_operand" ""))]  "reload_completed && WORDS_BIG_ENDIAN && !TARGET_64BIT   && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE && !TARGET_MIPS16   && 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 (match_dup 3)	(ltu:SI (subreg:SI (match_dup 1) 4)	        (subreg:SI (match_dup 2) 4)))   (set (subreg:SI (match_dup 0) 4)	(minus:SI (subreg:SI (match_dup 1) 4)		  (subreg:SI (match_dup 2) 4)))   (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 && !TARGET_MIPS16   && 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"	"12,8,16")])(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 && !TARGET_MIPS16   && 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) 4)	(minus:SI (subreg:SI (match_dup 1) 4)		  (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 && !TARGET_MIPS16   && 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) 4)		(match_dup 2)))   (set (subreg:SI (match_dup 0) 4)	(minus:SI (subreg:SI (match_dup 1) 4)		  (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 && !TARGET_MIPS16   && (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")]);; For the mips16, we need to recognize stack pointer subtractions;; explicitly, since we don't have a constraint for $sp.  These insns;; will be generated by the save_restore_insns functions.(define_insn ""  [(set (reg:DI 29)	(minus:DI (reg:DI 29)		  (match_operand:DI 0 "small_int" "I")))]  "TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "daddu\\t%$,%$,%n0"  [(set_attr "type"	"arith")   (set_attr "mode"	"DI")   (set (attr "length")	(if_then_else (match_operand:VOID 0 "m16_nsimm8_8" "")				      (const_int 4)				      (const_int 8)))])(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=d")	(minus:DI (reg:DI 29)		  (match_operand:DI 1 "small_int" "I")))]  "TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != -32768)"  "daddu\\t%0,%$,%n1"  [(set_attr "type"	"arith")   (set_attr "mode"	"DI")   (set (attr "length")	(if_then_else (match_operand:VOID 0 "m16_nuimm5_4" "")				      (const_int 4)				      (const_int 8)))])(define_insn ""  [(set (match_operand:DI 0 "register_operand" "=d,d,d")	(minus:DI (match_operand:DI 1 "register_operand" "0,d,d")		  (match_operand:DI 2 "arith_operand" "I,O,d")))]  "TARGET_MIPS16   && (GET_CODE (operands[2]) != CONST_INT       || (INTVAL (operands[2]) != -32768 && INTVAL (operands[2]) != -0x4000))"  "*{  if (REGNO (operands[0]) == REGNO (operands[1]))    return \"dsubu\\t%0,%2\";  return \"dsubu\\t%0,%1,%2\";}"  [(set_attr "type"	"arith")   (set_attr "mode"	"DI")   (set_attr_alternative "length"		[(if_then_else (match_operand:VOID 2 "m16_nsimm5_1" "")			       (const_int 4)			       (const_int 8))		 (if_then_else (match_operand:VOID 2 "m16_nsimm4_1" "")			       (const_int 4)			       (const_int 8))		 (const_int 4)])]);; On the mips16, we can sometimes split an add of a constant which is;; a 4 byte instruction into two adds which are both 2 byte;; instructions.  There are two cases: one where we are adding a;; constant plus a register to another register, and one where we are;; simply adding a constant to a register.(define_split  [(set (match_operand:DI 0 "register_operand" "")	(minus:DI (match_dup 0)		  (match_operand:DI 1 "const_int_operand" "")))]  "TARGET_MIPS16 && TARGET_64BIT && reload_completed && !TARGET_DEBUG_D_MODE   && GET_CODE (operands[0]) == REG   && M16_REG_P (REGNO (operands[0]))   && GET_CODE (operands[1]) == CONST_INT   && ((INTVAL (operands[1]) > 0x10	&& INTVAL (operands[1]) <= 0x10 + 0x10)       || (INTVAL (operands[1]) < - 0xf	   && INTVAL (operands[1]) >= - 0xf - 0xf))"  [(set (match_dup 0) (minus:DI (match_dup 0) (match_dup 1)))   (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 2)))]  "{  HOST_WIDE_INT val = INTVAL (operands[1]);  if (val >= 0)

⌨️ 快捷键说明

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