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

📄 m68k.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 5 页
字号:
  operands[1] = GEN_INT (7 - INTVAL (operands[1]));  return output_btst (operands, operands[1], operands[0], insn, 7);}")(define_insn ""  [(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "do")			    (const_int 1)			    (match_operand:SI 1 "const_int_operand" "n")))]  "!TARGET_5200"  "*{  if (GET_CODE (operands[0]) == MEM)    {      operands[0] = adjust_address (operands[0], QImode,				    INTVAL (operands[1]) / 8);      operands[1] = GEN_INT (7 - INTVAL (operands[1]) % 8);      return output_btst (operands, operands[1], operands[0], insn, 7);    }  operands[1] = GEN_INT (31 - INTVAL (operands[1]));  return output_btst (operands, operands[1], operands[0], insn, 31);}");; This is the same as the above pattern except for the constraints.;; The 'o' has been replaced with 'Q'.(define_insn ""  [(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "dQ")			    (const_int 1)			    (match_operand:SI 1 "const_int_operand" "n")))]  "TARGET_5200"  "*{  if (GET_CODE (operands[0]) == MEM)    {      operands[0] = adjust_address (operands[0], QImode,				    INTVAL (operands[1]) / 8);      operands[1] = GEN_INT (7 - INTVAL (operands[1]) % 8);      return output_btst (operands, operands[1], operands[0], insn, 7);    }  operands[1] = GEN_INT (31 - INTVAL (operands[1]));  return output_btst (operands, operands[1], operands[0], insn, 31);}");; move instructions;; A special case in which it is not desirable;; to reload the constant into a data register.(define_insn "pushexthisi_const"  [(set (match_operand:SI 0 "push_operand" "=m")	(match_operand:SI 1 "const_int_operand" "J"))]  "INTVAL (operands[1]) >= -0x8000 && INTVAL (operands[1]) < 0x8000"  "*{  if (operands[1] == const0_rtx)    return \"clr%.l %0\";  return \"pea %a1\";}");This is never used.;(define_insn "swapsi";  [(set (match_operand:SI 0 "nonimmediate_operand" "+r");	(match_operand:SI 1 "general_operand" "+r"));   (set (match_dup 1) (match_dup 0))];  "";  "exg %1,%0");; Special case of fullword move when source is zero.;; The reason this is special is to avoid loading a zero;; into a data reg with moveq in order to store it elsewhere.(define_insn "movsi_const0"  [(set (match_operand:SI 0 "nonimmediate_operand" "=g")	(const_int 0))]  ;; clr insns on 68000 read before writing.  ;; This isn't so on the 68010, but we have no TARGET_68010.  "((TARGET_68020 || TARGET_5200)    || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))"  "*{  if (ADDRESS_REG_P (operands[0]))    {      /* On the '040, 'subl an,an' takes 2 clocks while lea takes only 1 */      if (!TARGET_68040 && !TARGET_68060)	return \"sub%.l %0,%0\";      else	{#ifdef MOTOROLA#ifdef SGS	  /* Many SGS assemblers croak on size specifiers for constants.  */	  return \"lea 0,%0\";#else	  return \"lea 0.w,%0\";#endif#else	  return \"lea 0:w,%0\";#endif	}    }  /* moveq is faster on the 68000.  */  if (DATA_REG_P (operands[0]) && (!TARGET_68020 && !TARGET_5200))#if defined(MOTOROLA) && !defined(CRDS)    return \"moveq%.l %#0,%0\";#else    return \"moveq %#0,%0\";#endif  return \"clr%.l %0\";}");; General case of fullword move.;;;; This is the main "hook" for PIC code.  When generating;; PIC, movsi is responsible for determining when the source address;; needs PIC relocation and appropriately calling legitimize_pic_address;; to perform the actual relocation.;;;; In both the PIC and non-PIC cases the patterns generated will;; matched by the next define_insn.(define_expand "movsi"  [(set (match_operand:SI 0 "nonimmediate_operand" "")	(match_operand:SI 1 "general_operand" ""))]  ""  "{  if (flag_pic && !TARGET_PCREL && symbolic_operand (operands[1], SImode))    {      /* The source is an address which requires PIC relocation.         Call legitimize_pic_address with the source, mode, and a relocation         register (a new pseudo, or the final destination if reload_in_progress         is set).   Then fall through normally */      rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);      operands[1] = legitimize_pic_address (operands[1], SImode, temp);    }  else if (flag_pic && TARGET_PCREL && ! reload_in_progress)    {      /* Don't allow writes to memory except via a register;	 the m68k doesn't consider PC-relative addresses to be writable.  */      if (symbolic_operand (operands[0], SImode))	operands[0] = force_reg (SImode, XEXP (operands[0], 0));      else if (GET_CODE (operands[0]) == MEM	       && symbolic_operand (XEXP (operands[0], 0), SImode))	operands[0] = gen_rtx (MEM, SImode,			       force_reg (SImode, XEXP (operands[0], 0)));    }}");; General case of fullword move.  The register constraints;; force integer constants in range for a moveq to be reloaded;; if they are headed for memory.(define_insn ""  ;; Notes: make sure no alternative allows g vs g.  ;; We don't allow f-regs since fixed point cannot go in them.  ;; We do allow y and x regs since fixed point is allowed in them.  [(set (match_operand:SI 0 "nonimmediate_operand" "=g,d,a<,y,!*x*r*m")        (match_operand:SI 1 "general_src_operand" "daymSKT,n,i,g,*x*r*m"))]  "!TARGET_5200"  "*{  if (which_alternative == 4)    return \"fpmove%.l %x1,fpa0\;fpmove%.l fpa0,%x0\";  if (FPA_REG_P (operands[1]) || FPA_REG_P (operands[0]))    return \"fpmove%.l %x1,%x0\";  return output_move_simode (operands);}")(define_insn ""  [(set (match_operand:SI 0 "nonimmediate_operand" "=r<Q>,g")	(match_operand:SI 1 "general_operand" "g,r<Q>"))]  "TARGET_5200"  "* return output_move_simode (operands);");; Special case of fullword move, where we need to get a non-GOT PIC;; reference into an address register.(define_insn ""  [(set (match_operand:SI 0 "nonimmediate_operand" "=a<")        (match_operand:SI 1 "pcrel_address" ""))]  "TARGET_PCREL"  "*{  if (push_operand (operands[0], SImode))    return \"pea %a1\";  return \"lea %a1,%0\";}")(define_expand "movhi"  [(set (match_operand:HI 0 "nonimmediate_operand" "")	(match_operand:HI 1 "general_operand" ""))]  ""  "")(define_insn ""  [(set (match_operand:HI 0 "nonimmediate_operand" "=g")        (match_operand:HI 1 "general_src_operand" "gS"))]  "!TARGET_5200"  "* return output_move_himode (operands);") (define_insn ""  [(set (match_operand:HI 0 "nonimmediate_operand" "=r<Q>,g")	(match_operand:HI 1 "general_operand" "g,r<Q>"))]  "TARGET_5200"  "* return output_move_himode (operands);")(define_expand "movstricthi"  [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" ""))        (match_operand:HI 1 "general_src_operand" ""))]  ""  "")(define_insn ""  [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" "+dm"))	(match_operand:HI 1 "general_src_operand" "rmSn"))]  "!TARGET_5200"  "* return output_move_stricthi (operands);")(define_insn ""  [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" "+d,m"))	(match_operand:HI 1 "general_src_operand" "rmn,r"))]  "TARGET_5200"  "* return output_move_stricthi (operands);")(define_expand "movqi"  [(set (match_operand:QI 0 "nonimmediate_operand" "")        (match_operand:QI 1 "general_src_operand" ""))]  ""  "")(define_insn ""  [(set (match_operand:QI 0 "nonimmediate_operand" "=d,*a,m")	(match_operand:QI 1 "general_src_operand" "dmSi*a,di*a,dmSi"))]  "!TARGET_5200"  "* return output_move_qimode (operands);")(define_insn ""  [(set (match_operand:QI 0 "nonimmediate_operand" "=d<Q>,dm,d*a")	(match_operand:QI 1 "general_src_operand" "dmi,d<Q>,di*a"))]  "TARGET_5200"  "* return output_move_qimode (operands);")(define_expand "movstrictqi"  [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))        (match_operand:QI 1 "general_src_operand" ""))]  ""  "")(define_insn ""  [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" "+dm"))	(match_operand:QI 1 "general_src_operand" "dmSn"))]  "!TARGET_5200"  "* return output_move_strictqi (operands);")(define_insn ""  [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" "+d,m"))	(match_operand:QI 1 "general_src_operand" "dmn,d"))]  "TARGET_5200"  "* return output_move_strictqi (operands);")(define_expand "pushqi1"  [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int -2)))   (set (mem:QI (plus:SI (reg:SI 15) (const_int 1)))	(match_operand:QI 0 "general_operand" ""))]  "!TARGET_5200"  "")(define_expand "movsf"  [(set (match_operand:SF 0 "nonimmediate_operand" "")	(match_operand:SF 1 "general_operand" ""))]  ""  "")(define_insn ""  [(set (match_operand:SF 0 "nonimmediate_operand" "=rmf,x,y,rm,!x,!rm")	(match_operand:SF 1 "general_operand" "rmfF,xH,rmF,y,rm,x"))];  [(set (match_operand:SF 0 "nonimmediate_operand" "=rmf");	(match_operand:SF 1 "general_operand" "rmfF"))]  "!TARGET_5200"  "*{  if (which_alternative >= 4)    return \"fpmove%.s %1,fpa0\;fpmove%.s fpa0,%0\";  if (FPA_REG_P (operands[0]))    {      if (FPA_REG_P (operands[1]))	return \"fpmove%.s %x1,%x0\";      else if (GET_CODE (operands[1]) == CONST_DOUBLE)	return output_move_const_single (operands);      else if (FP_REG_P (operands[1]))        return \"fmove%.s %1,sp@-\;fpmove%.d sp@+, %0\";      return \"fpmove%.s %x1,%x0\";    }  if (FPA_REG_P (operands[1]))    {      if (FP_REG_P (operands[0]))	return \"fpmove%.s %x1,sp@-\;fmove%.s sp@+,%0\";      else	return \"fpmove%.s %x1,%x0\";    }  if (FP_REG_P (operands[0]))    {      if (FP_REG_P (operands[1]))	return \"f%$move%.x %1,%0\";      else if (ADDRESS_REG_P (operands[1]))	return \"move%.l %1,%-\;f%$move%.s %+,%0\";      else if (GET_CODE (operands[1]) == CONST_DOUBLE)	return output_move_const_single (operands);      return \"f%$move%.s %f1,%0\";    }  if (FP_REG_P (operands[1]))    {      if (ADDRESS_REG_P (operands[0]))	return \"fmove%.s %1,%-\;move%.l %+,%0\";      return \"fmove%.s %f1,%0\";    }  if (operands[1] == CONST0_RTX (SFmode)      /* clr insns on 68000 read before writing.	 This isn't so on the 68010, but we have no TARGET_68010.  */      && ((TARGET_68020 || TARGET_5200)	  || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))    {      if (ADDRESS_REG_P (operands[0]))	{	  /* On the '040, 'subl an,an' takes 2 clocks while lea takes only 1 */	  if (!TARGET_68040 && !TARGET_68060)	    return \"sub%.l %0,%0\";	  else	    {#ifdef MOTOROLA#ifdef SGS	      /* Many SGS assemblers croak on size specifiers for constants.  */	      return \"lea 0,%0\";#else	      return \"lea 0.w,%0\";#endif#else	      return \"lea 0:w,%0\";#endif	    }	}      /* moveq is faster on the 68000.  */      if (DATA_REG_P (operands[0]) && !(TARGET_68020 || TARGET_5200))	{#if defined(MOTOROLA) && !defined(CRDS)	  return \"moveq%.l %#0,%0\";#else	  return \"moveq %#0,%0\";#endif	}      return \"clr%.l %0\";    }  return \"move%.l %1,%0\";}")(define_insn ""  [(set (match_operand:SF 0 "nonimmediate_operand" "=r,g")	(match_operand:SF 1 "general_operand" "g,r"))]  "TARGET_5200"  "* 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<>,y,*rm,x,!x,!*rm")	(match_operand:DF 1 "general_operand"				"*rf,m,0,*rofE<>,*rmE,y,xH,*rm,x"))];  [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,&rf,&rof<>");	(match_operand:DF 1 "general_operand" "rf,m,rofF<>"))]  "!TARGET_5200"  "*{  if (which_alternative == 7)    return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\";  if (FPA_REG_P (operands[0]))    {      if (GET_CODE (operands[1]) == CONST_DOUBLE)	return output_move_const_double (operands);      if (FP_REG_P (operands[1]))        return \"fmove%.d %1,sp@-\;fpmove%.d sp@+,%x0\";      return \"fpmove%.d %x1,%x0\";    }  else if (FPA_REG_P (operands[1]))    {      if (FP_REG_P(operands[0]))        return \"fpmove%.d %x1,sp@-\;fmoved sp@+,%0\";      else        return \"fpmove%.d %x1,%x0\";    }  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);

⌨️ 快捷键说明

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