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

📄 m68k.md

📁 这是完整的gcc源代码
💻 MD
📖 第 1 页 / 共 5 页
字号:
      return \"clr.l (%0)+\;move%.b %1,-1(%0)\";#else      return \"clr.l (%0)+\;move%.b %1,(-1,%0)\";#endif#else      return \"clrl %0@+\;moveb %1,%0@(-1)\";#endif    }  else    {      output_asm_insn (\"clr%.l %0\", operands);      operands[0] = adj_offsettable_operand (operands[0], 3);      return \"move%.b %1,%0\";    }}");; sign extension instructions;; Note that the one starting from HImode comes before those for QImode;; so that a constant operand will match HImode, not QImode.(define_insn "extendhisi2"  [(set (match_operand:SI 0 "general_operand" "=*d,a")	(sign_extend:SI	 (match_operand:HI 1 "general_operand" "0,rmn")))]  ""  "*{  if (ADDRESS_REG_P (operands[0]))    return \"move%.w %1,%0\";  return \"ext%.l %0\";}")(define_insn "extendqihi2"  [(set (match_operand:HI 0 "general_operand" "=d")	(sign_extend:HI	 (match_operand:QI 1 "general_operand" "0")))]  ""  "ext%.w %0")(define_insn "extendqisi2"  [(set (match_operand:SI 0 "general_operand" "=d")	(sign_extend:SI	 (match_operand:QI 1 "general_operand" "0")))]  "TARGET_68020"  "extb%.l %0");; Conversions between float and double.(define_expand "extendsfdf2"  [(set (match_operand:DF 0 "general_operand" "")	(float_extend:DF	 (match_operand:SF 1 "general_operand" "")))]  "TARGET_68881 || TARGET_FPA"  "")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=x,y")	(float_extend:DF	 (match_operand:SF 1 "general_operand" "xH,rmF")))]  "TARGET_FPA"  "fpstod %w1,%0")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=*fdm,f")	(float_extend:DF	  (match_operand:SF 1 "general_operand" "f,dmF")))]  "TARGET_68881"  "*{  if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))    {      if (REGNO (operands[0]) == REGNO (operands[1]))	{	  /* Extending float to double in an fp-reg is a no-op.	     NOTICE_UPDATE_CC has already assumed that the	     cc will be set.  So cancel what it did.  */	  cc_status = cc_prev_status;	  return \"\";	}      return \"fmove%.x %1,%0\";    }  if (FP_REG_P (operands[0]))    return \"fmove%.s %f1,%0\";  if (DATA_REG_P (operands[0]) && FP_REG_P (operands[1]))    {      output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);      operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);      return \"move%.l %+,%0\";    }  return \"fmove%.d %f1,%0\";}");; This cannot output into an f-reg because there is no way to be;; sure of truncating in that case.;; But on the Sun FPA, we can be sure.(define_expand "truncdfsf2"  [(set (match_operand:SF 0 "general_operand" "")	(float_truncate:SF	  (match_operand:DF 1 "general_operand" "")))]  "TARGET_68881 || TARGET_FPA"  "")(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=x,y")	(float_truncate:SF	  (match_operand:DF 1 "general_operand" "xH,rmF")))]  "TARGET_FPA"  "fpdtos %y1,%0")(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=dm")	(float_truncate:SF	  (match_operand:DF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.s %f1,%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_expand "floatsisf2"  [(set (match_operand:SF 0 "general_operand" "")	(float:SF (match_operand:SI 1 "general_operand" "")))]  "TARGET_68881 || TARGET_FPA"  "")(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=y,x")	(float:SF (match_operand:SI 1 "general_operand" "rmi,x")))]  "TARGET_FPA"  "fpltos %1,%0")(define_insn ""  [(set (match_operand:SF 0 "general_operand" "=f")	(float:SF (match_operand:SI 1 "general_operand" "dmi")))]  "TARGET_68881"  "fmove%.l %1,%0")(define_expand "floatsidf2"  [(set (match_operand:DF 0 "general_operand" "")	(float:DF (match_operand:SI 1 "general_operand" "")))]  "TARGET_68881 || TARGET_FPA"  "")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=y,x")	(float:DF (match_operand:SI 1 "general_operand" "rmi,x")))]  "TARGET_FPA"  "fpltod %1,%0")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=f")	(float:DF (match_operand:SI 1 "general_operand" "dmi")))]  "TARGET_68881"  "fmove%.l %1,%0")(define_insn "floathisf2"  [(set (match_operand:SF 0 "general_operand" "=f")	(float:SF (match_operand:HI 1 "general_operand" "dmn")))]  "TARGET_68881"  "fmove%.w %1,%0")(define_insn "floathidf2"  [(set (match_operand:DF 0 "general_operand" "=f")	(float:DF (match_operand:HI 1 "general_operand" "dmn")))]  "TARGET_68881"  "fmove%.w %1,%0")(define_insn "floatqisf2"  [(set (match_operand:SF 0 "general_operand" "=f")	(float:SF (match_operand:QI 1 "general_operand" "dmn")))]  "TARGET_68881"  "fmove%.b %1,%0")(define_insn "floatqidf2"  [(set (match_operand:DF 0 "general_operand" "=f")	(float:DF (match_operand:QI 1 "general_operand" "dmn")))]  "TARGET_68881"  "fmove%.b %1,%0");; Convert a float to a float whose value is an integer.;; This is the first stage of converting it to an integer type.(define_insn "ftruncdf2"  [(set (match_operand:DF 0 "general_operand" "=f")	(fix:DF (match_operand:DF 1 "general_operand" "fFm")))]  "TARGET_68881"  "*{  if (FP_REG_P (operands[1]))    return \"fintrz%.x %f1,%0\";  return \"fintrz%.d %f1,%0\";}")(define_insn "ftruncsf2"  [(set (match_operand:SF 0 "general_operand" "=f")	(fix:SF (match_operand:SF 1 "general_operand" "dfFm")))]  "TARGET_68881"  "*{  if (FP_REG_P (operands[1]))    return \"fintrz%.x %f1,%0\";  return \"fintrz%.s %f1,%0\";}");; Convert a float whose value is an integer;; to an actual integer.  Second stage of converting float to integer type.(define_insn "fixsfqi2"  [(set (match_operand:QI 0 "general_operand" "=dm")	(fix:QI (match_operand:SF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.b %1,%0")(define_insn "fixsfhi2"  [(set (match_operand:HI 0 "general_operand" "=dm")	(fix:HI (match_operand:SF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.w %1,%0")(define_insn "fixsfsi2"  [(set (match_operand:SI 0 "general_operand" "=dm")	(fix:SI (match_operand:SF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.l %1,%0")(define_insn "fixdfqi2"  [(set (match_operand:QI 0 "general_operand" "=dm")	(fix:QI (match_operand:DF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.b %1,%0")(define_insn "fixdfhi2"  [(set (match_operand:HI 0 "general_operand" "=dm")	(fix:HI (match_operand:DF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.w %1,%0")(define_insn "fixdfsi2"  [(set (match_operand:SI 0 "general_operand" "=dm")	(fix:SI (match_operand:DF 1 "general_operand" "f")))]  "TARGET_68881"  "fmove%.l %1,%0");; Convert a float to an integer.;; On the Sun FPA, this is done in one step.(define_insn "fix_truncsfsi2"  [(set (match_operand:SI 0 "general_operand" "=x,y")	(fix:SI (fix:SF (match_operand:SF 1 "general_operand" "xH,rmF"))))]  "TARGET_FPA"  "fpstol %w1,%0")(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "general_operand" "=x,y")	(fix:SI (fix:DF (match_operand:DF 1 "general_operand" "xH,rmF"))))]  "TARGET_FPA"  "fpdtol %y1,%0");; add instructions;; Note that the last two alternatives are near-duplicates;; in order to handle insns generated by reload.;; This is needed since they are not themselves reloaded,;; so commutativity won't apply to them.(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];	  operands[2] = tmp;	}      /* These insns can result from reloads to access	 stack slots over 64k from the frame pointer.  */      if (GET_CODE (operands[2]) == CONST_INT	  && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000)        return \"move%.l %2,%0\;add%.l %1,%0\";#ifdef SGS      if (GET_CODE (operands[2]) == REG)	return \"lea 0(%1,%2.l),%0\";      else	return \"lea %c2(%1),%0\";#else /* not SGS */#ifdef MOTOROLA      if (GET_CODE (operands[2]) == REG)	return \"lea (%1,%2.l),%0\";      else	return \"lea (%c2,%1),%0\";#else /* not MOTOROLA (MIT syntax) */      if (GET_CODE (operands[2]) == REG)	return \"lea %1@(0,%2:l),%0\";      else	return \"lea %1@(%c2),%0\";#endif /* not MOTOROLA */#endif /* not SGS */    }  if (GET_CODE (operands[2]) == CONST_INT)    {#ifndef NO_ADDSUB_Q      if (INTVAL (operands[2]) > 0	  && INTVAL (operands[2]) <= 8)	return (ADDRESS_REG_P (operands[0])		? \"addq%.w %2,%0\"		: \"addq%.l %2,%0\");      if (INTVAL (operands[2]) < 0	  && INTVAL (operands[2]) >= -8)        {	  operands[2] = gen_rtx (CONST_INT, VOIDmode,			         - INTVAL (operands[2]));	  return (ADDRESS_REG_P (operands[0])		  ? \"subq%.w %2,%0\"		  : \"subq%.l %2,%0\");	}#endif      if (ADDRESS_REG_P (operands[0])	  && INTVAL (operands[2]) >= -0x8000	  && INTVAL (operands[2]) < 0x8000)	return \"add%.w %2,%0\";    }  return \"add%.l %2,%0\";}")(define_insn ""  [(set (match_operand:SI 0 "general_operand" "=a")	(plus:SI (match_operand:SI 1 "general_operand" "0")		 (sign_extend:SI (match_operand:HI 2 "general_operand" "rmn"))))]  ""  "add%.w %2,%0")(define_insn "addhi3"  [(set (match_operand:HI 0 "general_operand" "=m,r")	(plus:HI (match_operand:HI 1 "general_operand" "%0,0")		 (match_operand:HI 2 "general_operand" "dn,rmn")))]  ""  "*{#ifndef NO_ADDSUB_Q  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) > 0	  && INTVAL (operands[2]) <= 8)	return \"addq%.w %2,%0\";    }  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) < 0	  && INTVAL (operands[2]) >= -8)	{	  operands[2] = gen_rtx (CONST_INT, VOIDmode,			         - INTVAL (operands[2]));	  return \"subq%.w %2,%0\";	}    }#endif  return \"add%.w %2,%0\";}")(define_insn ""  [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))	(plus:HI (match_dup 0)		 (match_operand:HI 1 "general_operand" "dn,rmn")))]  ""  "add%.w %1,%0")(define_insn "addqi3"  [(set (match_operand:QI 0 "general_operand" "=m,d")	(plus:QI (match_operand:QI 1 "general_operand" "%0,0")		 (match_operand:QI 2 "general_operand" "dn,dmn")))]  ""  "*{#ifndef NO_ADDSUB_Q  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) > 0	  && INTVAL (operands[2]) <= 8)	return \"addq%.b %2,%0\";    }  if (GET_CODE (operands[2]) == CONST_INT)    {      if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) >= -8)       {	 operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2]));	 return \"subq%.b %2,%0\";       }    }#endif  return \"add%.b %2,%0\";}")(define_insn ""  [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))	(plus:QI (match_dup 0)		 (match_operand:QI 1 "general_operand" "dn,dmn")))]  ""  "add%.b %1,%0")(define_expand "adddf3"  [(set (match_operand:DF 0 "general_operand" "")	(plus:DF (match_operand:DF 1 "general_operand" "")		 (match_operand:DF 2 "general_operand" "")))]  "TARGET_68881 || TARGET_FPA"  "")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=x,y")	(plus:DF (match_operand:DF 1 "general_operand" "%xH,y")		 (match_operand:DF 2 "general_operand" "xH,dmF")))]  "TARGET_FPA"  "*{  if (rtx_equal_p (operands[0], operands[1]))    return \"fpadd%.d %y2,%0\";  if (rtx_equal_p (operands[0], operands[2]))    return \"fpadd%.d %y1,%0\";  if (which_alternative == 0)    return \"fpadd3%.d %w2,%w1,%0\";  return \"fpadd3%.d %x2,%x1,%0\";}")(define_insn ""  [(set (match_operand:DF 0 "general_operand" "=f")	(plus:DF (match_operand:DF 1 "general_operand" "%0")		 (match_operand:DF 2 "general_operand" "fmG")))]

⌨️ 快捷键说明

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