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

📄 mips.md

📁 早期freebsd实现
💻 MD
📖 第 1 页 / 共 5 页
字号:
	DONE;      operands[1] = reg;    }  /* Generate appropriate load, store.  If not a load or store,     do a normal movsi.  */  if (GET_CODE (operands[0]) != MEM && GET_CODE (operands[1]) != MEM)    {      emit_insn (gen_movsi (operands[0], operands[1]));      DONE;    }  /* Fall through and generate normal code.  */}")(define_insn "movsi_ulw"  [(set (match_operand:SI 0 "register_operand" "=&d,&d,d,d")	(unspec [(match_operand:SI 1 "general_operand" "R,o,dIKL,M")] 0))]  ""  "*{  enum rtx_code code;  char *ret;  rtx offset;  rtx addr;  rtx mem_addr;  if (which_alternative != 0)    return mips_move_1word (operands, insn, FALSE);  if (TARGET_STATS)    mips_count_memory_refs (operands[1], 2);  /* The stack/frame pointers are always aligned, so we can convert     to the faster lw if we are referencing an aligned stack location.  */  offset = const0_rtx;  addr = XEXP (operands[1], 0);  mem_addr = eliminate_constant_term (addr, &offset);  if ((INTVAL (offset) & (UNITS_PER_WORD-1)) == 0      && (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))    ret = \"lw\\t%0,%1\";  else    {      ret = \"ulw\\t%0,%1\";      if (TARGET_GAS)	{	  enum rtx_code code = GET_CODE (addr);	  if (code == CONST || code == SYMBOL_REF || code == LABEL_REF)	    {	      operands[2] = gen_rtx (REG, SImode, GP_REG_FIRST + 1);	      ret = \"%[la\\t%2,%1\;ulw\\t%0,0(%2)%]\";	    }	}    }  return mips_fill_delay_slot (ret, DELAY_LOAD, operands, insn);}"  [(set_attr "type"	"load,load,move,arith")   (set_attr "mode"	"SI")   (set_attr "length"	"2,4,1,2")])(define_insn "movsi_usw"  [(set (match_operand:SI 0 "memory_operand" "=R,o")	(unspec [(match_operand:SI 1 "reg_or_0_operand" "dJ,dJ")] 0))]  ""  "*{  rtx offset = const0_rtx;  rtx addr = XEXP (operands[0], 0);  rtx mem_addr = eliminate_constant_term (addr, &offset);  if (TARGET_STATS)    mips_count_memory_refs (operands[0], 2);  /* The stack/frame pointers are always aligned, so we can convert     to the faster sw if we are referencing an aligned stack location.  */  if ((INTVAL (offset) & (UNITS_PER_WORD-1)) == 0      && (mem_addr == stack_pointer_rtx || mem_addr == frame_pointer_rtx))    return \"sw\\t%1,%0\";  if (TARGET_GAS)    {      enum rtx_code code = GET_CODE (XEXP (operands[0], 0));      if (code == CONST || code == SYMBOL_REF || code == LABEL_REF)	{	  operands[2] = gen_rtx (REG, SImode, GP_REG_FIRST + 1);	  return \"%[la\\t%2,%0\;usw\\t%z1,0(%2)%]\";	}    }  return \"usw\\t%z1,%0\";}"  [(set_attr "type"	"store")   (set_attr "mode"	"SI")   (set_attr "length"	"2,4")]);; 64-bit integer moves;; Unlike most other insns, the move insns can't be split with;; different predicates, because register spilling and other parts of;; the compiler, have memoized the insn number already.(define_expand "movdi"  [(set (match_operand:DI 0 "nonimmediate_operand" "")	(match_operand:DI 1 "general_operand" ""))]  ""  "{  if ((reload_in_progress | reload_completed) == 0      && !register_operand (operands[0], DImode)      && !register_operand (operands[1], DImode)      && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)      && operands[1] != CONST0_RTX (DImode))    {      rtx temp = force_reg (DImode, operands[1]);      emit_move_insn (operands[0], temp);      DONE;    }}")(define_insn "movdi_internal"  [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,R,o,*d,*x")	(match_operand:DI 1 "general_operand" "d,iF,R,o,d,d,*x,*d"))]  "register_operand (operands[0], DImode)   || register_operand (operands[1], DImode)   || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)   || operands[1] == CONST0_RTX (DImode)"  "* return mips_move_2words (operands, insn); "  [(set_attr "type"	"move,arith,load,load,store,store,hilo,hilo")   (set_attr "mode"	"DI")   (set_attr "length"	"2,4,2,4,2,4,2,2")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(match_operand:DI 1 "register_operand" ""))]  "reload_completed && !TARGET_DEBUG_D_MODE && !TARGET_DEBUG_G_MODE   && GET_CODE (operands[0]) == REG && GP_REG_P (REGNO (operands[0]))   && GET_CODE (operands[1]) == REG && GP_REG_P (REGNO (operands[1]))"  [(set (subreg:SI (match_dup 0) 0) (subreg:SI (match_dup 1) 0))   (set (subreg:SI (match_dup 0) 1) (subreg:SI (match_dup 1) 1))]  "");; 32-bit Integer moves(define_split  [(set (match_operand:SI 0 "register_operand" "")	(match_operand:SI 1 "large_int" ""))]  "!TARGET_DEBUG_D_MODE"  [(set (match_dup 0)	(match_dup 2))   (set (match_dup 0)     	(ior:SI (match_dup 0)		(match_dup 3)))]  "{  operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0xffff0000);  operands[3] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0x0000ffff);}");; Unlike most other insns, the move insns can't be split with;; different predicates, because register spilling and other parts of;; the compiler, have memoized the insn number already.(define_expand "movsi"  [(set (match_operand:SI 0 "nonimmediate_operand" "")	(match_operand:SI 1 "general_operand" ""))]  ""  "{  if ((reload_in_progress | reload_completed) == 0      && !register_operand (operands[0], SImode)      && !register_operand (operands[1], SImode)      && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))    {      rtx temp = force_reg (SImode, operands[1]);      emit_move_insn (operands[0], temp);      DONE;    }}");; The difference between these two is whether or not ints are allowed;; in FP registers (off by default, use -mdebugh to enable).(define_insn "movsi_internal1"  [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*f*z,*f,*f,*f,*R,*m,*x,*d")	(match_operand:SI 1 "general_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*f*z,*d,*f,*R,*m,*f,*f,*d,*x"))]  "TARGET_DEBUG_H_MODE   && (register_operand (operands[0], SImode)       || register_operand (operands[1], SImode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"  "* return mips_move_1word (operands, insn, TRUE);"  [(set_attr "type"	"move,load,arith,arith,load,load,store,store,xfer,xfer,move,load,load,store,store,hilo,hilo")   (set_attr "mode"	"SI")   (set_attr "length"	"1,2,1,2,1,2,1,2,1,1,1,1,2,1,2,1,1")])(define_insn "movsi_internal2"  [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,R,m,*d,*z,*d,*x")	(match_operand:SI 1 "general_operand" "d,S,IKL,Mnis,R,m,dJ,dJ,*z,*d,*x,*d"))]  "!TARGET_DEBUG_H_MODE   && (register_operand (operands[0], SImode)       || register_operand (operands[1], SImode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"  "* return mips_move_1word (operands, insn, TRUE);"  [(set_attr "type"	"move,load,arith,arith,load,load,store,store,xfer,xfer,hilo,hilo")   (set_attr "mode"	"SI")   (set_attr "length"	"1,2,1,2,1,2,1,2,1,1,1,1")]);; 16-bit Integer moves;; Unlike most other insns, the move insns can't be split with;; different predicates, because register spilling and other parts of;; the compiler, have memoized the insn number already.;; Unsigned loads are used because BYTE_LOADS_ZERO_EXTEND is defined(define_expand "movhi"  [(set (match_operand:HI 0 "nonimmediate_operand" "")	(match_operand:HI 1 "general_operand" ""))]  ""  "{  if ((reload_in_progress | reload_completed) == 0      && !register_operand (operands[0], HImode)      && !register_operand (operands[1], HImode)      && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))    {      rtx temp = force_reg (HImode, operands[1]);      emit_move_insn (operands[0], temp);      DONE;    }}");; The difference between these two is whether or not ints are allowed;; in FP registers (off by default, use -mdebugh to enable).(define_insn "movhi_internal1"  [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*f,*f*z,*x,*d")	(match_operand:HI 1 "general_operand"       "d,IK,R,m,dJ,dJ,*f*z,*d,*f,*d,*x"))]  "TARGET_DEBUG_H_MODE   && (register_operand (operands[0], HImode)       || register_operand (operands[1], HImode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"  "* return mips_move_1word (operands, insn, TRUE);"  [(set_attr "type"	"move,arith,load,load,store,store,xfer,xfer,move,hilo,hilo")   (set_attr "mode"	"HI")   (set_attr "length"	"1,1,1,2,1,2,1,1,1,1,1")])(define_insn "movhi_internal2"  [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*z,*x,*d")	(match_operand:HI 1 "general_operand"       "d,IK,R,m,dJ,dJ,*z,*d,*d,*x"))]  "!TARGET_DEBUG_H_MODE   && (register_operand (operands[0], HImode)       || register_operand (operands[1], HImode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"  "* return mips_move_1word (operands, insn, TRUE);"  [(set_attr "type"	"move,arith,load,load,store,store,xfer,xfer,hilo,hilo")   (set_attr "mode"	"HI")   (set_attr "length"	"1,1,1,2,1,2,1,1,1,1")]);; 8-bit Integer moves;; Unlike most other insns, the move insns can't be split with;; different predicates, because register spilling and other parts of;; the compiler, have memoized the insn number already.;; Unsigned loads are used because BYTE_LOADS_ZERO_EXTEND is defined(define_expand "movqi"  [(set (match_operand:QI 0 "nonimmediate_operand" "")	(match_operand:QI 1 "general_operand" ""))]  ""  "{  if ((reload_in_progress | reload_completed) == 0      && !register_operand (operands[0], QImode)      && !register_operand (operands[1], QImode)      && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0))    {      rtx temp = force_reg (QImode, operands[1]);      emit_move_insn (operands[0], temp);      DONE;    }}");; The difference between these two is whether or not ints are allowed;; in FP registers (off by default, use -mdebugh to enable).(define_insn "movqi_internal1"  [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*f*z,*f,*x,*d")	(match_operand:QI 1 "general_operand"       "d,IK,R,m,dJ,dJ,*f*z,*d,*f,*d,*x"))]  "TARGET_DEBUG_H_MODE   && (register_operand (operands[0], QImode)       || register_operand (operands[1], QImode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"  "* return mips_move_1word (operands, insn, TRUE);"  [(set_attr "type"	"move,arith,load,load,store,store,xfer,xfer,move,hilo,hilo")   (set_attr "mode"	"QI")   (set_attr "length"	"1,1,1,2,1,2,1,1,1,1,1")])(define_insn "movqi_internal2"  [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,m,*d,*z,*x,*d")	(match_operand:QI 1 "general_operand"       "d,IK,R,m,dJ,dJ,*z,*d,*d,*x"))]  "!TARGET_DEBUG_H_MODE   && (register_operand (operands[0], QImode)       || register_operand (operands[1], QImode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"  "* return mips_move_1word (operands, insn, TRUE);"  [(set_attr "type"	"move,arith,load,load,store,store,xfer,xfer,hilo,hilo")   (set_attr "mode"	"QI")   (set_attr "length"	"1,1,1,2,1,2,1,1,1,1")]);; 32-bit floating point moves(define_expand "movsf"  [(set (match_operand:SF 0 "nonimmediate_operand" "")	(match_operand:SF 1 "general_operand" ""))]  ""  "{  if ((reload_in_progress | reload_completed) == 0      && !register_operand (operands[0], SFmode)      && !register_operand (operands[1], SFmode)      && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)      && operands[1] != CONST0_RTX (SFmode))    {      rtx temp = force_reg (SFmode, operands[1]);      emit_move_insn (operands[0], temp);      DONE;    }}")(define_insn "movsf_internal1"  [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,f,f,R,m,*f,*d,*d,*d,*d,*R,*m")	(match_operand:SF 1 "general_operand" "f,G,R,Em,fG,fG,*d,*f,*G*d,*R,*E*m,*d,*d"))]  "TARGET_HARD_FLOAT   && (register_operand (operands[0], SFmode)       || register_operand (operands[1], SFmode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)       || operands[1] == CONST0_RTX (SFmode))"  "* return mips_move_1word (operands, insn, FALSE);"  [(set_attr "type"	"move,xfer,load,load,store,store,xfer,xfer,move,load,load,store,store")   (set_attr "mode"	"SF")   (set_attr "length"	"1,1,1,2,1,2,1,1,1,1,2,1,2")])(define_insn "movsf_internal2"  [(set (match_operand:SF 0 "nonimmediate_operand" "=d,d,d,R,m")	(match_operand:SF 1 "general_operand" "      Gd,R,Em,d,d"))]  "TARGET_SOFT_FLOAT   && (register_operand (operands[0], SFmode)       || register_operand (operands[1], SFmode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)       || operands[1] == CONST0_RTX (SFmode))"  "* return mips_move_1word (operands, insn, FALSE);"  [(set_attr "type"	"move,load,load,store,store")   (set_attr "mode"	"SF")   (set_attr "length"	"1,1,2,1,2")]);; 64-bit floating point moves(define_expand "movdf"  [(set (match_operand:DF 0 "nonimmediate_operand" "")	(match_operand:DF 1 "general_operand" ""))]  ""  "{  if ((reload_in_progress | reload_completed) == 0      && !register_operand (operands[0], DFmode)      && !register_operand (operands[1], DFmode)      && (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 0)      && operands[1] != CONST0_RTX (DFmode))    {      rtx temp = force_reg (DFmode, operands[1]);      emit_move_insn (operands[0], temp);      DONE;    }}")(define_insn "movdf_internal1"  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,f,R,o,f,*f,*d,*d,*d,*d,*R,*o")	(match_operand:DF 1 "general_operand" "f,R,o,fG,fG,E,*d,*f,*d*G,*R,*o*E,*d,*d"))]  "TARGET_HARD_FLOAT   && (register_operand (operands[0], DFmode)       || register_operand (operands[1], DFmode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)       || operands[1] == CONST0_RTX (DFmode))"  "* return mips_move_2words (operands, insn); "  [(set_attr "type"	"move,load,load,store,store,load,xfer,xfer,move,load,load,store,store")   (set_attr "mode"	"DF")   (set_attr "length"	"1,2,4,2,4,4,2,2,2,2,4,2,4")])(define_insn "movdf_internal2"  [(set (match_operand:DF 0 "nonimmediate_operand" "=d,d,d,R,o")	(match_operand:DF 1 "general_operand" "dG,R,oE,d,d"))]  "TARGET_SOFT_FLOAT   && (register_operand (operands[0], DFmode)       || register_operand (operands[1], DFmode)       || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0)       || operands[1] == CONST0_RTX (DFmode))"  "* return mips_move_2words (operands, insn); "  [(se

⌨️ 快捷键说明

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