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

📄 m68k.md

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 MD
📖 第 1 页 / 共 5 页
字号:
  "TARGET_COLDFIRE"{  return "move%.l %1,%0";})(define_expand "movdf"  [(set (match_operand:DF 0 "nonimmediate_operand" "")	(match_operand:DF 1 "general_operand" ""))]  ""  "")(define_insn ""  [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,rf,rf,&rof<>")	(match_operand:DF 1 "general_operand" "*rf,m,0,*rofE<>"))];  [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,&rf,&rof<>");	(match_operand:DF 1 "general_operand" "rf,m,rofF<>"))]  "!TARGET_COLDFIRE"{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return "f%&move%.x %1,%0";      if (REG_P (operands[1]))	{	  rtx xoperands[2];	  xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);	  output_asm_insn ("move%.l %1,%-", xoperands);	  output_asm_insn ("move%.l %1,%-", operands);	  return "f%&move%.d %+,%0";	}      if (GET_CODE (operands[1]) == CONST_DOUBLE)	return output_move_const_double (operands);      return "f%&move%.d %f1,%0";    }  else if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	{	  output_asm_insn ("fmove%.d %f1,%-\;move%.l %+,%0", operands);	  operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);	  return "move%.l %+,%0";	}      else        return "fmove%.d %f1,%0";    }  return output_move_double (operands);})(define_insn ""  [(set (match_operand:DF 0 "nonimmediate_operand" "=r,g")	(match_operand:DF 1 "general_operand" "g,r"))]  "TARGET_COLDFIRE"{  return output_move_double (operands);});; ??? The XFmode patterns are schizophrenic about whether constants are;; allowed.  Most but not all have predicates and constraint that disallow;; constants.  Most but not all have output templates that handle constants.;; See also LEGITIMATE_CONSTANT_P.(define_expand "movxf"  [(set (match_operand:XF 0 "nonimmediate_operand" "")	(match_operand:XF 1 "general_operand" ""))]  ""{  /* We can't rewrite operands during reload.  */  if (! reload_in_progress)    {      if (CONSTANT_P (operands[1]))	{	  operands[1] = force_const_mem (XFmode, operands[1]);	  if (! memory_address_p (XFmode, XEXP (operands[1], 0)))	    operands[1] = adjust_address (operands[1], XFmode, 0);	}      if (flag_pic && TARGET_PCREL)	{	  /* Don't allow writes to memory except via a register; the	     m68k doesn't consider PC-relative addresses to be writable.  */	  if (GET_CODE (operands[0]) == MEM	      && symbolic_operand (XEXP (operands[0], 0), SImode))	    operands[0] = gen_rtx_MEM (XFmode,				   force_reg (SImode, XEXP (operands[0], 0)));	}    }})(define_insn ""  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f,!r")	(match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r,!r"))]  "TARGET_68881"{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return "fmove%.x %1,%0";      if (REG_P (operands[1]))	{	  rtx xoperands[2];	  xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);	  output_asm_insn ("move%.l %1,%-", xoperands);	  xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);	  output_asm_insn ("move%.l %1,%-", xoperands);	  output_asm_insn ("move%.l %1,%-", operands);	  return "fmove%.x %+,%0";	}      if (GET_CODE (operands[1]) == CONST_DOUBLE)        return "fmove%.x %1,%0";      return "fmove%.x %f1,%0";    }  if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	{	  output_asm_insn ("fmove%.x %f1,%-\;move%.l %+,%0", operands);	  operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);	  output_asm_insn ("move%.l %+,%0", operands);	  operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);	  return "move%.l %+,%0";	}      /* Must be memory destination.  */      return "fmove%.x %f1,%0";    }  return output_move_double (operands);})(define_insn ""  [(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>")	(match_operand:XF 1 "nonimmediate_operand" "rf,m,rof<>"))]  "! TARGET_68881 && ! TARGET_COLDFIRE"{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return "fmove%.x %1,%0";      if (REG_P (operands[1]))	{	  rtx xoperands[2];	  xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);	  output_asm_insn ("move%.l %1,%-", xoperands);	  xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);	  output_asm_insn ("move%.l %1,%-", xoperands);	  output_asm_insn ("move%.l %1,%-", operands);	  return "fmove%.x %+,%0";	}      if (GET_CODE (operands[1]) == CONST_DOUBLE)        return "fmove%.x %1,%0";      return "fmove%.x %f1,%0";    }  if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))        {          output_asm_insn ("fmove%.x %f1,%-\;move%.l %+,%0", operands);          operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);          output_asm_insn ("move%.l %+,%0", operands);          operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);          return "move%.l %+,%0";        }      else        return "fmove%.x %f1,%0";    }  return output_move_double (operands);})(define_insn ""  [(set (match_operand:XF 0 "nonimmediate_operand" "=r,g")	(match_operand:XF 1 "nonimmediate_operand" "g,r"))]  "! TARGET_68881 && TARGET_COLDFIRE"  "* return output_move_double (operands);")(define_expand "movdi"  ;; Let's see if it really still needs to handle fp regs, and, if so, why.  [(set (match_operand:DI 0 "nonimmediate_operand" "")	(match_operand:DI 1 "general_operand" ""))]  ""  "");; movdi can apply to fp regs in some cases(define_insn ""  ;; Let's see if it really still needs to handle fp regs, and, if so, why.  [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,r,&ro<>")	(match_operand:DI 1 "general_operand" "rF,m,roi<>F"))];  [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,&r,&ro<>,!&rm,!&f");	(match_operand:DI 1 "general_operand" "r,m,roi<>,fF"))];  [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,&rf,&ro<>,!&rm,!&f");	(match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfF"))]  "!TARGET_COLDFIRE"{  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return "fmove%.x %1,%0";      if (REG_P (operands[1]))	{	  rtx xoperands[2];	  xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);	  output_asm_insn ("move%.l %1,%-", xoperands);	  output_asm_insn ("move%.l %1,%-", operands);	  return "fmove%.d %+,%0";	}      if (GET_CODE (operands[1]) == CONST_DOUBLE)	return output_move_const_double (operands);      return "fmove%.d %f1,%0";    }  else if (FP_REG_P (operands[1]))    {      if (REG_P (operands[0]))	{	  output_asm_insn ("fmove%.d %f1,%-\;move%.l %+,%0", operands);	  operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);	  return "move%.l %+,%0";	}      else        return "fmove%.d %f1,%0";    }  return output_move_double (operands);})(define_insn ""  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,g")	(match_operand:DI 1 "general_operand" "g,r"))]  "TARGET_COLDFIRE"  "* return output_move_double (operands);");; Thus 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 "nonimmediate_operand" "=dm,d")	(truncate:QI	 (match_operand:SI 1 "general_src_operand" "doJS,i")))]  ""{  if (GET_CODE (operands[0]) == REG)    {      /* Must clear condition codes, since the move.l bases them on	 the entire 32 bits, not just the desired 8 bits.  */      CC_STATUS_INIT;      return "move%.l %1,%0";    }  if (GET_CODE (operands[1]) == MEM)    operands[1] = adjust_address (operands[1], QImode, 3);  return "move%.b %1,%0";})(define_insn "trunchiqi2"  [(set (match_operand:QI 0 "nonimmediate_operand" "=dm,d")	(truncate:QI	 (match_operand:HI 1 "general_src_operand" "doJS,i")))]  ""{  if (GET_CODE (operands[0]) == REG      && (GET_CODE (operands[1]) == MEM	  || GET_CODE (operands[1]) == CONST_INT))    {      /* Must clear condition codes, since the move.w bases them on	 the entire 16 bits, not just the desired 8 bits.  */      CC_STATUS_INIT;      return "move%.w %1,%0";    }  if (GET_CODE (operands[0]) == REG)    {      /* Must clear condition codes, since the move.l bases them on	 the entire 32 bits, not just the desired 8 bits.  */      CC_STATUS_INIT;      return "move%.l %1,%0";    }  if (GET_CODE (operands[1]) == MEM)    operands[1] = adjust_address (operands[1], QImode, 1);  return "move%.b %1,%0";})(define_insn "truncsihi2"  [(set (match_operand:HI 0 "nonimmediate_operand" "=dm,d")	(truncate:HI	 (match_operand:SI 1 "general_src_operand" "roJS,i")))]  ""{  if (GET_CODE (operands[0]) == REG)    {      /* Must clear condition codes, since the move.l bases them on	 the entire 32 bits, not just the desired 8 bits.  */      CC_STATUS_INIT;      return "move%.l %1,%0";    }  if (GET_CODE (operands[1]) == MEM)    operands[1] = adjust_address (operands[1], QImode, 2);  return "move%.w %1,%0";});; zero extension instructions;; two special patterns to match various post_inc/pre_dec patterns(define_insn_and_split "*zero_extend_inc"  [(set (match_operand 0 "post_inc_operand" "")	(zero_extend (match_operand 1 "register_operand" "")))]  "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT &&   GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT &&   GET_MODE_SIZE (GET_MODE (operands[0])) == GET_MODE_SIZE (GET_MODE (operands[1])) * 2"  "#"  ""  [(set (match_dup 0)	(const_int 0))   (set (match_dup 0)	(match_dup 1))]{  operands[0] = adjust_address (operands[0], GET_MODE (operands[1]), 0);})(define_insn_and_split "*zero_extend_dec"  [(set (match_operand 0 "pre_dec_operand" "")	(zero_extend (match_operand 1 "register_operand" "")))]  "(GET_MODE (operands[0]) != HImode || XEXP (XEXP (operands[0], 0), 0) != stack_pointer_rtx) &&   GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT &&   GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT &&   GET_MODE_SIZE (GET_MODE (operands[0])) == GET_MODE_SIZE (GET_MODE (operands[1])) * 2"  "#"  ""  [(set (match_dup 0)	(match_dup 1))   (set (match_dup 0)	(const_int 0))]{  operands[0] = adjust_address (operands[0], GET_MODE (operands[1]), 0);})(define_insn_and_split "zero_extendqidi2"  [(set (match_operand:DI 0 "register_operand" "")	(zero_extend:DI (match_operand:QI 1 "nonimmediate_src_operand" "")))]  ""  "#"  ""  [(set (match_dup 2)	(zero_extend:SI (match_dup 1)))   (set (match_dup 3)	(const_int 0))]{  operands[2] = gen_lowpart (SImode, operands[0]);  operands[3] = gen_highpart (SImode, operands[0]);})(define_insn_and_split "zero_extendhidi2"  [(set (match_operand:DI 0 "register_operand" "")	(zero_extend:DI (match_operand:HI 1 "nonimmediate_src_operand" "")))]  ""  "#"  ""  [(set (match_dup 2)	(zero_extend:SI (match_dup 1)))   (set (match_dup 3)	(const_int 0))]{  operands[2] = gen_lowpart (SImode, operands[0]);  operands[3] = gen_highpart (SImode, operands[0]);})(define_expand "zero_extendsidi2"  [(set (match_operand:DI 0 "nonimmediate_operand" "")	(zero_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "")))]  ""  "")(define_insn_and_split "*zero_extendsidi2"  [(set (match_operand:DI 0 "nonimmediate_operand" "")	(zero_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "")))]  "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"  "#"  ""  [(set (match_dup 2)	(match_dup 1))   (set (match_dup 3)	(const_int 0))]{  operands[2] = gen_lowpart (SImode, operands[0]);  operands[3] = gen_highpart (SImode, operands[0]);})(define_insn "*zero_extendhisi2_cf"  [(set (match_operand:SI 0 "register_operand" "=d")	(zero_extend:SI (match_operand:HI 1 "nonimmediate_src_operand" "rmS")))]  "TARGET_CFV4"  "mvz%.w %1,%0")(define_insn "zero_extendhisi2"  [(set (match_operand:SI 0 "register_operand" "=d")	(zero_extend:SI (match_operand:HI 1 "nonimmediate_src_operand" "rmS")))]  ""  "#")(define_expand "zero_extendqihi2"  [(set (match_operand:HI 0 "register_operand" "")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_src_operand" "")))]  "!TARGET_COLDFIRE"  "")(define_insn "*zero_extendqihi2"  [(set (match_operand:HI 0 "register_operand" "=d")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_src_operand" "dmS")))]  "!TARGET_COLDFIRE"  "#")(define_insn "*zero_extendqisi2_cfv4"  [(set (match_operand:SI 0 "register_operand" "=d")	(zero_extend:SI (match_operand:QI 1 "nonimmediate_src_operand" "dmS")))]  "TARGET_CFV4"  "mvz%.b %1,%0")(define_insn "zero_extendqisi2"

⌨️ 快捷键说明

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