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

📄 fx80.md

📁 gcc-2.95.3 Linux下最常用的C编译器
💻 MD
📖 第 1 页 / 共 5 页
字号:
;; different constraints for each target type.  The constraints for;; TARGET_CE allow general registers because they sometimes need to;; hold floats, but they are not preferable.(define_expand "movsf"  [(set (match_operand:SF 0 "general_operand" "")	(match_operand:SF 1 "nonimmediate_operand" ""))]  ""  "")(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=f,m,!*r,!f*m")	(match_operand:SF 1 "nonimmediate_operand" "fm,f,f*r*m,*r"))]  "TARGET_CE"  "*{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return \"fmove%.s %1,%0\";      if (REG_P (operands[1]))	return \"mov%.l %1,%-\;fmove%.s %+,%0\";      return \"fmove%.s %1,%0\";    }  if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	return \"fmove%.s %1,%-\;mov%.l %+,%0\";      return \"fmove%.s %1,%0\";    }  return \"mov%.l %1,%0\";}")(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=frm")	(match_operand:SF 1 "nonimmediate_operand" "frm"))]  "!TARGET_CE"  "*{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return \"fmove%.s %1,%0\";      if (REG_P (operands[1]))	return \"mov%.l %1,%-\;fmove%.s %+,%0\";      return \"fmove%.s %1,%0\";    }  if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	return \"fmove%.s %1,%-\;mov%.l %+,%0\";      return \"fmove%.s %1,%0\";    }  return \"mov%.l %1,%0\";}")(define_expand "movdf"  [(set (match_operand:DF 0 "general_operand" "")	(match_operand:DF 1 "nonimmediate_operand" ""))]  ""  "")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=f,m,!*r,!f*m")	(match_operand:DF 1 "nonimmediate_operand" "fm,f,f*r*m,*r"))]  "TARGET_CE"  "*{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return \"fmove%.d %1,%0\";      if (REG_P (operands[1]))	{	  rtx xoperands[2];	  xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);	  output_asm_insn (\"mov%.l %1,%-\", xoperands);	  output_asm_insn (\"mov%.l %1,%-\", operands);	  return \"fmove%.d %+,%0\";	}      return \"fmove%.d %1,%0\";    }  else if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	{	  output_asm_insn (\"fmove%.d %1,%-\;mov%.l %+,%0\", operands);	  operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);	  return \"mov%.l %+,%0\";	}      return \"fmove%.d %1,%0\";    }  return output_move_double (operands);}")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=frm")	(match_operand:DF 1 "nonimmediate_operand" "frm"))]  "!TARGET_CE"  "*{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return \"fmove%.d %1,%0\";      if (REG_P (operands[1]))	{	  rtx xoperands[2];	  xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);	  output_asm_insn (\"mov%.l %1,%-\", xoperands);	  output_asm_insn (\"mov%.l %1,%-\", operands);	  return \"fmove%.d %+,%0\";	}      return \"fmove%.d %1,%0\";    }  else if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	{	  output_asm_insn (\"fmove%.d %1,%-\;mov%.l %+,%0\", operands);	  operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);	  return \"mov%.l %+,%0\";	}      return \"fmove%.d %1,%0\";    }  return output_move_double (operands);}")(define_insn "movdi"  [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro<>")	(match_operand:DI 1 "general_operand" "r,m,roi<>"))]  ""  "*{  return output_move_double (operands);}");; This goes after the move instructions;; because the move instructions are better (require no spilling);; when they can apply.  It goes before the add/sub insns;; so we will prefer it to them.(define_insn "pushasi"  [(set (match_operand:SI 0 "push_operand" "=m")	(match_operand:SI 1 "address_operand" "p"))]  ""  "pea %a1");; truncation instructions(define_insn "truncsiqi2"  [(set (match_operand:QI 0 "general_operand" "=dm,d")	(truncate:QI	 (match_operand:SI 1 "general_operand" "doJ,i")))]  ""  "*{  if (GET_CODE (operands[0]) == REG)    return \"mov%.l %1,%0\";  if (GET_CODE (operands[1]) == MEM)    operands[1] = adj_offsettable_operand (operands[1], 3);  return \"mov%.b %1,%0\";}")(define_insn "trunchiqi2"  [(set (match_operand:QI 0 "general_operand" "=dm,d")	(truncate:QI	 (match_operand:HI 1 "general_operand" "doJ,i")))]  ""  "*{  if (GET_CODE (operands[0]) == REG      && (GET_CODE (operands[1]) == MEM	  || GET_CODE (operands[1]) == CONST_INT))    return \"mov%.w %1,%0\";  if (GET_CODE (operands[0]) == REG)    return \"mov%.l %1,%0\";  if (GET_CODE (operands[1]) == MEM)    operands[1] = adj_offsettable_operand (operands[1], 1);  return \"mov%.b %1,%0\";}")(define_insn "truncsihi2"  [(set (match_operand:HI 0 "general_operand" "=dm,d")	(truncate:HI	 (match_operand:SI 1 "general_operand" "roJ,i")))]  ""  "*{  if (GET_CODE (operands[0]) == REG)    return \"mov%.l %1,%0\";  if (GET_CODE (operands[1]) == MEM)    operands[1] = adj_offsettable_operand (operands[1], 2);  return \"mov%.w %1,%0\";}");; zero extension instructions(define_expand "zero_extendhisi2"  [(set (match_operand:SI 0 "register_operand" "")	(const_int 0))   (set (strict_low_part (subreg:HI (match_dup 0) 0))	(match_operand:HI 1 "general_operand" ""))]  ""  "operands[1] = make_safe_from (operands[1], operands[0]);")(define_expand "zero_extendqihi2"  [(set (match_operand:HI 0 "register_operand" "")	(const_int 0))   (set (strict_low_part (subreg:QI (match_dup 0) 0))	(match_operand:QI 1 "general_operand" ""))]  ""  "operands[1] = make_safe_from (operands[1], operands[0]);")(define_expand "zero_extendqisi2"  [(set (match_operand:SI 0 "register_operand" "")	(const_int 0))   (set (strict_low_part (subreg:QI (match_dup 0) 0))	(match_operand:QI 1 "general_operand" ""))]  ""  " operands[1] = make_safe_from (operands[1], operands[0]); ");; Patterns to recognize zero-extend insns produced by the combiner.(define_insn ""  [(set (match_operand:SI 0 "general_operand" "=do<>")	(zero_extend:SI	 (match_operand:HI 1 "nonimmediate_operand" "rm")))]  ""  "*{  if (DATA_REG_P (operands[0]))    {      if (GET_CODE (operands[1]) == REG	  && REGNO (operands[0]) == REGNO (operands[1]))	return \"and%.l %#0xFFFF,%0\";      if (reg_mentioned_p (operands[0], operands[1]))        return \"mov%.w %1,%0\;and%.l %#0xFFFF,%0\";      return \"clr%.l %0\;mov%.w %1,%0\";    }  else if (GET_CODE (operands[0]) == MEM	   && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)    return \"mov%.w %1,%0\;clr%.w %0\";  else if (GET_CODE (operands[0]) == MEM	   && GET_CODE (XEXP (operands[0], 0)) == POST_INC)    return \"clr%.w %0\;mov%.w %1,%0\";  else    {      output_asm_insn (\"clr%.w %0\", operands);      operands[0] = adj_offsettable_operand (operands[0], 2);      return \"mov%.w %1,%0\";    }}")(define_insn ""  [(set (match_operand:HI 0 "general_operand" "=do<>")	(zero_extend:HI	 (match_operand:QI 1 "nonimmediate_operand" "dm")))]  ""  "*{  if (DATA_REG_P (operands[0]))    {      if (GET_CODE (operands[1]) == REG	  && REGNO (operands[0]) == REGNO (operands[1]))	return \"and%.w %#0xFF,%0\";      if (reg_mentioned_p (operands[0], operands[1]))        return \"mov%.b %1,%0\;and%.w %#0xFF,%0\";      return \"clr%.w %0\;mov%.b %1,%0\";    }  else if (GET_CODE (operands[0]) == MEM	   && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)    {      if (REGNO (XEXP (XEXP (operands[0], 0), 0))	  == STACK_POINTER_REGNUM)	return \"clr%.w %-\;mov%.b %1,%0\";      else	return \"mov%.b %1,%0\;clr%.b %0\";    }  else if (GET_CODE (operands[0]) == MEM	   && GET_CODE (XEXP (operands[0], 0)) == POST_INC)    return \"clr%.b %0\;mov%.b %1,%0\";  else    {      output_asm_insn (\"clr%.b %0\", operands);      operands[0] = adj_offsettable_operand (operands[0], 1);      return \"mov%.b %1,%0\";    }}")(define_insn ""  [(set (match_operand:SI 0 "general_operand" "=do<>")	(zero_extend:SI	 (match_operand:QI 1 "nonimmediate_operand" "dm")))]  ""  "*{  if (DATA_REG_P (operands[0]))    {      if (GET_CODE (operands[1]) == REG	  && REGNO (operands[0]) == REGNO (operands[1]))	return \"and%.l %#0xFF,%0\";      if (reg_mentioned_p (operands[0], operands[1]))        return \"mov%.b %1,%0\;and%.l %#0xFF,%0\";      return \"clr%.l %0\;mov%.b %1,%0\";    }  else if (GET_CODE (operands[0]) == MEM	   && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)    {      operands[0] = XEXP (XEXP (operands[0], 0), 0);      return \"clr%.l %0@-\;mov%.b %1,%0@(3)\";    }  else if (GET_CODE (operands[0]) == MEM	   && GET_CODE (XEXP (operands[0], 0)) == POST_INC)    {      operands[0] = XEXP (XEXP (operands[0], 0), 0);      return \"clr%.l %0@+\;mov%.b %1,%0@(-1)\";    }  else    {      output_asm_insn (\"clr%.l %0\", operands);      operands[0] = adj_offsettable_operand (operands[0], 3);      return \"mov%.b %1,%0\";    }}");; sign extension instructions(define_insn "extendhisi2"  [(set (match_operand:SI 0 "general_operand" "=*d,a")	(sign_extend:SI	 (match_operand:HI 1 "nonimmediate_operand" "0,rmn")))]  ""  "@   ext%.l %0   mov%.w %1,%0")(define_insn "extendqihi2"  [(set (match_operand:HI 0 "general_operand" "=d")	(sign_extend:HI	 (match_operand:QI 1 "nonimmediate_operand" "0")))]  ""  "ext%.w %0")(define_insn "extendqisi2"  [(set (match_operand:SI 0 "general_operand" "=d")	(sign_extend:SI	 (match_operand:QI 1 "nonimmediate_operand" "0")))]  "TARGET_68020"  "extb%.l %0");; Conversions between float and double.(define_insn "extendsfdf2"  [(set (match_operand:DF 0 "general_operand" "=f,m")	(float_extend:DF	  (match_operand:SF 1 "nonimmediate_operand" "fm,f")))]  "TARGET_CE"  "fmovesd %1,%0")(define_insn "truncdfsf2"  [(set (match_operand:SF 0 "general_operand" "=f,m")	(float_truncate:SF	  (match_operand:DF 1 "nonimmediate_operand" "fm,f")))]  "TARGET_CE"  "fmoveds %1,%0");; Conversion between fixed point and floating point.;; Note that among the fix-to-float insns;; the ones that start with SImode come first.;; That is so that an operand that is a CONST_INT;; (and therefore lacks a specific machine mode).;; will be recognized as SImode (which is always valid);; rather than as QImode or HImode.(define_insn "floatsisf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(float:SF (match_operand:SI 1 "nonimmediate_operand" "dm")))]  "TARGET_CE"  "fmovels %1,%0")(define_insn "floatsidf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(float:DF (match_operand:SI 1 "nonimmediate_operand" "dm")))]  "TARGET_CE"  "fmoveld %1,%0")(define_insn "floathisf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(float:SF (match_operand:HI 1 "nonimmediate_operand" "dm")))]  "TARGET_CE"  "fmovews %1,%0")(define_insn "floathidf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(float:DF (match_operand:HI 1 "nonimmediate_operand" "dm")))]  "TARGET_CE"  "fmovewd %1,%0")(define_insn "floatqisf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(float:SF (match_operand:QI 1 "nonimmediate_operand" "dm")))]  "TARGET_CE"  "fmovebs %1,%0")(define_insn "floatqidf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(float:DF (match_operand:QI 1 "nonimmediate_operand" "dm")))]  "TARGET_CE"  "fmovebd %1,%0");; Float-to-fix conversion insns.(define_insn "fix_truncsfqi2"  [(set (match_operand:QI 0 "general_operand" "=dm")	(fix:QI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]  "TARGET_CE"  "fmovesb %1,%0")(define_insn "fix_truncsfhi2"  [(set (match_operand:HI 0 "general_operand" "=dm")	(fix:HI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]  "TARGET_CE"  "fmovesw %1,%0")(define_insn "fix_truncsfsi2"  [(set (match_operand:SI 0 "general_operand" "=dm")	(fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))]  "TARGET_CE"  "fmovesl %1,%0")(define_insn "fix_truncdfqi2"  [(set (match_operand:QI 0 "general_operand" "=dm")	(fix:QI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]  "TARGET_CE"  "fmovedb %1,%0")(define_insn "fix_truncdfhi2"  [(set (match_operand:HI 0 "general_operand" "=dm")	(fix:HI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]  "TARGET_CE"  "fmovedw %1,%0")(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "general_operand" "=dm")	(fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))]  "TARGET_CE"  "fmovedl %1,%0");; add instructions(define_insn "addsi3"  [(set (match_operand:SI 0 "general_operand" "=m,r,!a,!a")	(plus:SI (match_operand:SI 1 "general_operand" "%0,0,a,rJK")		 (match_operand:SI 2 "general_operand" "dIKLs,mrIKLs,rJK,a")))]  ""  "*{  if (! operands_match_p (operands[0], operands[1]))    {      if (!ADDRESS_REG_P (operands[1]))	{	  rtx tmp = operands[1];	  operands[1] = operands[2];

⌨️ 快捷键说明

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