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

📄 fr30.md

📁 linux下的gcc编译器
💻 MD
📖 第 1 页 / 共 3 页
字号:
)(define_peephole  [(set:SI (mem:SI (pre_dec:SI (reg:SI 15)))	   (match_operand:SI 0 "low_register_operand" "l"))   (set:SI (mem:SI (pre_dec:SI (reg:SI 15)))           (match_operand:SI 1 "low_register_operand" "l"))   (set:SI (mem:SI (pre_dec:SI (reg:SI 15)))           (match_operand:SI 2 "low_register_operand" "l"))   (set:SI (mem:SI (pre_dec:SI (reg:SI 15)))           (match_operand:SI 3 "low_register_operand" "l"))]  "fr30_check_multiple_regs (operands, 4, 1)"  "stm0	(%0, %1, %2, %3)"  [(set_attr "delay_type" "other")])(define_peephole  [(set:SI (mem:SI (pre_dec:SI (reg:SI 15)))	   (match_operand:SI 0 "low_register_operand" "l"))   (set:SI (mem:SI (pre_dec:SI (reg:SI 15)))           (match_operand:SI 1 "low_register_operand" "l"))   (set:SI (mem:SI (pre_dec:SI (reg:SI 15)))           (match_operand:SI 2 "low_register_operand" "l"))]  "fr30_check_multiple_regs (operands, 3, 1)"  "stm0	(%0, %1, %2)"  [(set_attr "delay_type" "other")])(define_peephole  [(set:SI (mem:SI (pre_dec:SI (reg:SI 15)))	   (match_operand:SI 0 "low_register_operand" "l"))   (set:SI (mem:SI (pre_dec:SI (reg:SI 15)))           (match_operand:SI 1 "low_register_operand" "l"))]  "fr30_check_multiple_regs (operands, 2, 1)"  "stm0	(%0, %1)"  [(set_attr "delay_type" "other")]);;}}};;{{{ Floating Point Moves ;; Note - Patterns for SF mode moves are compulsory, but;; patterns for DF are optional, as GCC can synthesize them.(define_expand "movsf"  [(set (match_operand:SF 0 "general_operand" "")	(match_operand:SF 1 "general_operand" ""))]  ""  "{  if (!reload_in_progress && !reload_completed      && memory_operand (operands[0], SFmode)      && memory_operand (operands[1], SFmode))    operands[1] = copy_to_mode_reg (SFmode, operands[1]);  }")(define_insn "*movsf_internal"  [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,red,m,r")	(match_operand:SF 1 "general_operand"      "Fn,i,rde,r,rm"))]  ""  "*  {    switch (which_alternative)    {    case 0: return   \"ldi:32\\t%1, %0\";    case 1: if (TARGET_SMALL_MODEL)	      return \"ldi:20\\t%1, %0\";            else	      return \"ldi:32\\t%1, %0\";    case 2: return   \"mov   \\t%1, %0\";    case 3: return   \"st    \\t%1, %0\";    case 4: return   \"ld    \\t%1, %0\";    default: abort ();	           }  }"  [(set (attr "length") (cond [(eq_attr "alternative" "0") (const_int 6)			       (eq_attr "alternative" "1") 			                (if_then_else (eq_attr "size" "small")						      (const_int 4)						      (const_int 6))]			      (const_int 2)))])(define_insn "*movsf_constant_store"  [(set (match_operand:SF 0 "memory_operand"    "=m")	(match_operand:SF 1 "immediate_operand" "F"))]  ""  "*  {  const char *    ldi_instr;  const char *    tmp_reg;  static char     buffer[100];  ldi_instr = fr30_const_double_is_zero (operands[1])	    ? ldi_instr = \"ldi:8\" : \"ldi:32\";  tmp_reg = reg_names [COMPILER_SCRATCH_REGISTER];    sprintf (buffer, \"%s\\t#%%1, %s\\t;\\n\\tst\\t%s, %%0\\t; Created by movsf_constant_store\",    ldi_instr, tmp_reg, tmp_reg);  return buffer;  }"  [(set_attr "length" "8")]);;}}};;}}} ;;{{{ Conversions ;; Signed conversions from a smaller integer to a larger integer(define_insn "extendqisi2"  [(set (match_operand:SI 0 "register_operand"                "=r")	(sign_extend:SI (match_operand:QI 1 "register_operand" "0")))]  ""  "extsb	%0")(define_insn "extendhisi2"  [(set (match_operand:SI 0 "register_operand"                "=r")	(sign_extend:SI (match_operand:HI 1 "register_operand" "0")))]  ""  "extsh	%0");; Unsigned conversions from a smaller integer to a larger integer(define_insn "zero_extendqisi2"  [(set (match_operand:SI 0 "register_operand"                "=r")	(zero_extend:SI (match_operand:QI 1 "register_operand" "0")))]  ""  "extub	%0")(define_insn "zero_extendhisi2"  [(set (match_operand:SI 0 "register_operand"                "=r")	(zero_extend:SI (match_operand:HI 1 "register_operand" "0")))]  ""  "extuh	%0");;}}} ;;{{{ Arithmetic ;;{{{ Addition ;; This is a special pattern just for adjusting the stack size.(define_insn "add_to_stack"  [(set (reg:SI 15)	(plus:SI (reg:SI 15)		 (match_operand:SI 0 "stack_add_operand" "i")))]  ""  "addsp	%0");; We need some trickery to be able to handle the addition of;; large (ie outside +/- 16) constants.  We need to be able to;; handle this because reload assumes that it can generate add;; instructions with arbitary sized constants.(define_expand "addsi3"  [(set (match_operand:SI 0 "register_operand"           "")	(plus:SI (match_operand:SI 1 "register_operand"  "")		 (match_operand:SI 2 "nonmemory_operand" "")))]  ""  "{  if (   GET_CODE (operands[2]) == REG      || GET_CODE (operands[2]) == SUBREG)    emit_insn (gen_addsi_regs (operands[0], operands[1], operands[2]));  else if (GET_CODE (operands[2]) != CONST_INT)    emit_insn (gen_addsi_big_int (operands[0], operands[1], operands[2]));  else if (   (REGNO (operands[1]) != FRAME_POINTER_REGNUM)           && (REGNO (operands[1]) != ARG_POINTER_REGNUM)	   && (INTVAL (operands[2]) >= -16)	   && (INTVAL (operands[2]) <= 15))    emit_insn (gen_addsi_small_int (operands[0], operands[1], operands[2]));  else    emit_insn (gen_addsi_big_int (operands[0], operands[1], operands[2]));  DONE;  }")(define_insn "addsi_regs"  [(set (match_operand:SI 0 "register_operand"          "=r")	(plus:SI (match_operand:SI 1 "register_operand" "%0")		 (match_operand:SI 2 "register_operand"  "r")))]  ""  "addn	%2, %0");; Do not allow an eliminable register in the source register.  It;; might be eliminated in favor of the stack pointer, probably;; increasing the offset, and so rendering the instruction illegal.(define_insn "addsi_small_int"  [(set (match_operand:SI 0 "register_operand"              "=r,r")	(plus:SI (match_operand:SI 1 "register_operand"      "0,0")		 (match_operand:SI 2 "add_immediate_operand" "I,J")))]  "   (REGNO (operands[1]) != FRAME_POINTER_REGNUM)   && (REGNO (operands[1]) != ARG_POINTER_REGNUM)"  "@   addn	%2, %0   addn2	%2, %0")(define_expand "addsi_big_int"  [(set (match_operand:SI 0 "register_operand"           "")	(plus:SI (match_operand:SI 1 "register_operand"  "")		 (match_operand:SI 2 "immediate_operand" "")))]  ""  "{  /* Cope with the possibility that ops 0 and 1 are the same register.  */  if (REGNO (operands[0]) == REGNO (operands[1]))    {      if (reload_in_progress || reload_completed)        {	  rtx reg = gen_rtx_REG (SImode, 0/*COMPILER_SCRATCH_REGISTER*/);	  	  emit_insn (gen_movsi (reg, operands[2]));	  emit_insn (gen_addsi_regs (operands[0], operands[0], reg));	}      else	{	  operands[2] = force_reg (SImode, operands[2]);	  emit_insn (gen_addsi_regs (operands[0], operands[0], operands[2]));	}    }  else    {      emit_insn (gen_movsi (operands[0], operands[2]));      emit_insn (gen_addsi_regs (operands[0], operands[0], operands[1]));    }  DONE;  }")(define_insn "*addsi_for_reload"  [(set (match_operand:SI 0 "register_operand"         "=&r,r,r")	(plus:SI (match_operand:SI 1 "register_operand"  "r,r,r")		 (match_operand:SI 2 "immediate_operand" "L,M,n")))]  "reload_in_progress || reload_completed"  "@  ldi:8\\t#%2, %0  \\n\\taddn\\t%1, %0  ldi:20\\t#%2, %0 \\n\\taddn\\t%1, %0  ldi:32\\t#%2, %0 \\n\\taddn\\t%1, %0"  [(set_attr "length" "4,6,8")]);;}}};;{{{ Subtraction (define_insn "subsi3"  [(set (match_operand:SI 0 "register_operand"       "=r")	(minus:SI (match_operand:SI 1 "register_operand" "0")	          (match_operand:SI 2 "register_operand" "r")))]  ""  "subn	%2, %0");;}}};;{{{ Multiplication ;; Signed multiplication producing 64 bit results from 32 bit inputs(define_insn "mulsidi3"  [(set (match_operand:DI 0 "register_operand"                             "=r")	   (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%r"))		    (sign_extend:DI (match_operand:SI 2 "register_operand"  "r"))))   (clobber (reg:CC 16))]  ""  "mul	%2, %1\\n\\tmov\\tmdh, %0\\n\\tmov\\tmdl, %p0"  [(set_attr "length" "6")]);; Unsigned multiplication producing 64 bit results from 32 bit inputs(define_insn "umulsidi3"  [(set (match_operand:DI 0 "register_operand"                             "=r")	   (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%r"))		    (zero_extend:DI (match_operand:SI 2 "register_operand"  "r"))))   (clobber (reg:CC 16))]  ""  "mulu	%2, %1\\n\\tmov\\tmdh, %0\\n\\tmov\\tmdl, %p0"  [(set_attr "length" "6")]);; Signed multiplication producing 32 bit result from 16 bit inputs(define_insn "mulhisi3"  [(set (match_operand:SI 0 "register_operand"                             "=r")	   (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%r"))		    (sign_extend:SI (match_operand:HI 2 "register_operand"  "r"))))   (clobber (reg:CC 16))]  ""  "mulh	%2, %1\\n\\tmov\\tmdl, %0"  [(set_attr "length" "4")]);; Unsigned multiplication producing 32 bit result from 16 bit inputs(define_insn "umulhisi3"  [(set (match_operand:SI 0 "register_operand"                             "=r")	   (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "%r"))		    (zero_extend:SI (match_operand:HI 2 "register_operand"  "r"))))   (clobber (reg:CC 16))]  ""  "muluh	%2, %1\\n\\tmov\\tmdl, %0"  [(set_attr "length" "4")]);; Signed multiplication producing 32 bit result from 32 bit inputs(define_insn "mulsi3"  [(set (match_operand:SI 0 "register_operand"             "=r")	   (mult:SI (match_operand:SI 1 "register_operand" "%r")		    (match_operand:SI 2 "register_operand"  "r")))   (clobber (reg:CC 16))]  ""  "mul	%2, %1\\n\\tmov\\tmdl, %0"  [(set_attr "length" "4")]);;}}};;{{{ Negation (define_expand "negsi2"  [(set (match_operand:SI 0 "register_operand"         "")	(neg:SI (match_operand:SI 1 "register_operand" "")))]  ""  "{  if (REGNO (operands[0]) == REGNO (operands[1]))    {      if (reload_in_progress || reload_completed)        {	  rtx reg = gen_rtx_REG (SImode, 0/*COMPILER_SCRATCH_REGISTER*/);	  	  emit_insn (gen_movsi (reg, GEN_INT (0)));	  emit_insn (gen_subsi3 (reg, reg, operands[0]));	  emit_insn (gen_movsi (operands[0], reg));	}      else	{	  rtx reg = gen_reg_rtx (SImode);		  emit_insn (gen_movsi (reg, GEN_INT (0)));	  emit_insn (gen_subsi3 (reg, reg, operands[0]));	  emit_insn (gen_movsi (operands[0], reg));	}    }  else    {      emit_insn (gen_movsi_internal (operands[0], GEN_INT (0)));      emit_insn (gen_subsi3 (operands[0], operands[0], operands[1]));    }  DONE;  }");;}}};;}}} ;;{{{ Shifts ;; Arithmetic Shift Left(define_insn "ashlsi3"  [(set (match_operand:SI 0 "register_operand"            "=r,r,r")	(ashift:SI (match_operand:SI 1 "register_operand"  "0,0,0")		   (match_operand:SI 2 "nonmemory_operand" "r,I,K")))   (clobber (reg:CC 16))]  ""  "@  lsl	%2, %0  lsl	%2, %0  lsl2	%x2, %0");; Arithmetic Shift Right(define_insn "ashrsi3"  [(set (match_operand:SI 0 "register_operand"              "=r,r,r")	(ashiftrt:SI (match_operand:SI 1 "register_operand"  "0,0,0")		     (match_operand:SI 2 "nonmemory_operand" "r,I,K")))   (clobber (reg:CC 16))]  ""  "@  asr	%2, %0  asr	%2, %0  asr2	%x2, %0");; Logical Shift Right(define_insn "lshrsi3"  [(set (match_operand:SI 0 "register_operand"              "=r,r,r")	(lshiftrt:SI (match_operand:SI 1 "register_operand"  "0,0,0")		     (match_operand:SI 2 "nonmemory_operand" "r,I,K")))   (clobber (reg:CC 16))]  ""  "@  lsr	%2, %0  lsr	%2, %0  lsr2	%x2, %0");;}}} ;;{{{ Logical Operations ;; Logical AND, 32 bit integers(define_insn "andsi3"  [(set (match_operand:SI 0 "register_operand"         "=r")	(and:SI (match_operand:SI 1 "register_operand" "%r")		(match_operand:SI 2 "register_operand"  "0")))   (clobber (reg:CC 16))]  ""  "and	%1, %0");; Inclusive OR, 32 bit integers(define_insn "iorsi3"  [(set (match_operand:SI 0 "register_operand"         "=r")	(ior:SI (match_operand:SI 1 "register_operand" "%r")		(match_operand:SI 2 "register_operand"  "0")))   (clobber (reg:CC 16))]  ""  "or	%1, %0");; Exclusive OR, 32 bit integers(define_insn "xorsi3"  [(set (match_operand:SI 0 "register_operand"         "=r")	(xor:SI (match_operand:SI 1 "register_operand" "%r")		(match_operand:SI 2 "register_operand"  "0")))   (clobber (reg:CC 16))]  ""  "eor	%1, %0");; One's complement, 32 bit integers(define_expand "one_cmplsi2"  [(set (match_operand:SI 0 "register_operand"         "")	(not:SI (match_operand:SI 1 "register_operand" "")))]  ""  "{  if (REGNO (operands[0]) == REGNO (operands[1]))    {      if (reload_in_progress || reload_completed)        {	  rtx reg = gen_rtx_REG (SImode, 0/*COMPILER_SCRATCH_REGISTER*/);	  	  emit_insn (gen_movsi (reg, GEN_INT (-1)));	  emit_insn (gen_xorsi3 (operands[0], operands[0], reg));	}      else	{	  rtx reg = gen_reg_rtx (SImode);		  emit_insn (gen_movsi (reg, GEN_INT (-1)));	  emit_insn (gen_xorsi3 (operands[0], operands[0], reg));	}    }  else    {      emit_insn (gen_movsi_internal (operands[0], GEN_INT (-1)));      emit_insn (gen_xorsi3 (operands[0], operands[1], operands[0]));    }  DONE;  }");;}}} ;;{{{ Comparisons ;; Note, we store the operands in the comparison insns, and use them later;; when generating the branch or scc operation.;; First the routines called by the machine independent part of the compiler(define_expand "cmpsi"  [(set (reg:CC 16)        (compare:CC (match_operand:SI 0 "register_operand"  "")		    (match_operand:SI 1 "nonmemory_operand" "")))]  ""  "{  fr30_compare_op0 = operands[0];  fr30_compare_op1 = operands[1];  DONE;  }")

⌨️ 快捷键说明

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