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

📄 mips.md

📁 早期freebsd实现
💻 MD
📖 第 1 页 / 共 5 页
字号:
  [(set (match_operand:DI 0 "register_operand" "=d")	(xor:DI (match_operand:DI 1 "register_operand" "d")		(match_operand:DI 2 "register_operand" "d")))]  "!TARGET_DEBUG_G_MODE"  "xor\\t%M0,%M1,%M2\;xor\\t%L0,%L1,%L2"  [(set_attr "type"	"darith")   (set_attr "mode"	"DI")   (set_attr "length"	"2")])(define_split  [(set (match_operand:DI 0 "register_operand" "")	(xor:DI (match_operand:DI 1 "register_operand" "")		(match_operand:DI 2 "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]))   && GET_CODE (operands[2]) == REG && GP_REG_P (REGNO (operands[2]))"  [(set (subreg:SI (match_dup 0) 0) (xor:SI (subreg:SI (match_dup 1) 0) (subreg:SI (match_dup 2) 0)))   (set (subreg:SI (match_dup 0) 1) (xor:SI (subreg:SI (match_dup 1) 1) (subreg:SI (match_dup 2) 1)))]  "");;;;  ....................;;;;	TRUNCATION;;;;  ....................(define_insn "truncdfsf2"  [(set (match_operand:SF 0 "register_operand" "=f")	(float_truncate:SF (match_operand:DF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "cvt.s.d\\t%0,%1"  [(set_attr "type"	"fcvt")   (set_attr "mode"	"SF")   (set_attr "length"	"1")]);;;;  ....................;;;;	ZERO EXTENSION;;;;  ....................;; Extension insns.;; Those for integer source operand;; are ordered widest source type first.(define_insn "zero_extendhisi2"  [(set (match_operand:SI 0 "register_operand" "=d,d,d")	(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "d,R,m")))]  ""  "*{  if (which_alternative == 0)    return \"andi\\t%0,%1,0xffff\";  else    return mips_move_1word (operands, insn, TRUE);}"  [(set_attr "type"	"arith,load,load")   (set_attr "mode"	"SI")   (set_attr "length"	"1,1,2")])(define_insn "zero_extendqihi2"  [(set (match_operand:HI 0 "register_operand" "=d,d,d")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]  ""  "*{  if (which_alternative == 0)    return \"andi\\t%0,%1,0x00ff\";  else    return mips_move_1word (operands, insn, TRUE);}"  [(set_attr "type"	"arith,load,load")   (set_attr "mode"	"HI")   (set_attr "length"	"1,1,2")])(define_insn "zero_extendqisi2"  [(set (match_operand:SI 0 "register_operand" "=d,d,d")	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,R,m")))]  ""  "*{  if (which_alternative == 0)    return \"andi\\t%0,%1,0x00ff\";  else    return mips_move_1word (operands, insn, TRUE);}"  [(set_attr "type"	"arith,load,load")   (set_attr "mode"	"SI")   (set_attr "length"	"1,1,2")]);;;;  ....................;;;;	SIGN EXTENSION;;;;  ....................;; Extension insns.;; Those for integer source operand;; are ordered widest source type first.;; These patterns originally accepted general_operands, however, slightly;; better code is generated by only accepting register_operands, and then;; letting combine generate the lh and lb insns.(define_expand "extendhisi2"  [(set (match_operand:SI 0 "register_operand" "")	(sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]  ""  "{  if (optimize && GET_CODE (operands[1]) == MEM)    operands[1] = force_not_mem (operands[1]);  if (GET_CODE (operands[1]) != MEM)    {      rtx op1   = gen_lowpart (SImode, operands[1]);      rtx temp  = gen_reg_rtx (SImode);      rtx shift = gen_rtx (CONST_INT, VOIDmode, 16);      emit_insn (gen_ashlsi3 (temp, op1, shift));      emit_insn (gen_ashrsi3 (operands[0], temp, shift));      DONE;    }}")(define_insn "extendhisi2_internal"  [(set (match_operand:SI 0 "register_operand" "=d,d")	(sign_extend:SI (match_operand:HI 1 "memory_operand" "R,m")))]  ""  "* return mips_move_1word (operands, insn, FALSE);"  [(set_attr "type"	"load")   (set_attr "mode"	"SI")   (set_attr "length"	"1,2")])(define_expand "extendqihi2"  [(set (match_operand:HI 0 "register_operand" "")	(sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]  ""  "{  if (optimize && GET_CODE (operands[1]) == MEM)    operands[1] = force_not_mem (operands[1]);  if (GET_CODE (operands[1]) != MEM)    {      rtx op0   = gen_lowpart (SImode, operands[0]);      rtx op1   = gen_lowpart (SImode, operands[1]);      rtx temp  = gen_reg_rtx (SImode);      rtx shift = gen_rtx (CONST_INT, VOIDmode, 24);      emit_insn (gen_ashlsi3 (temp, op1, shift));      emit_insn (gen_ashrsi3 (op0, temp, shift));      DONE;    }}")(define_insn "extendqihi2_internal"  [(set (match_operand:HI 0 "register_operand" "=d,d")	(sign_extend:HI (match_operand:QI 1 "memory_operand" "R,m")))]  ""  "* return mips_move_1word (operands, insn, FALSE);"  [(set_attr "type"	"load")   (set_attr "mode"	"SI")   (set_attr "length"	"1,2")])(define_expand "extendqisi2"  [(set (match_operand:SI 0 "register_operand" "")	(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]  ""  "{  if (optimize && GET_CODE (operands[1]) == MEM)    operands[1] = force_not_mem (operands[1]);  if (GET_CODE (operands[1]) != MEM)    {      rtx op1   = gen_lowpart (SImode, operands[1]);      rtx temp  = gen_reg_rtx (SImode);      rtx shift = gen_rtx (CONST_INT, VOIDmode, 24);      emit_insn (gen_ashlsi3 (temp, op1, shift));      emit_insn (gen_ashrsi3 (operands[0], temp, shift));      DONE;    }}")(define_insn "extendqisi2_insn"  [(set (match_operand:SI 0 "register_operand" "=d,d")	(sign_extend:SI (match_operand:QI 1 "memory_operand" "R,m")))]  ""  "* return mips_move_1word (operands, insn, FALSE);"  [(set_attr "type"	"load")   (set_attr "mode"	"SI")   (set_attr "length"	"1,2")])(define_insn "extendsfdf2"  [(set (match_operand:DF 0 "register_operand" "=f")	(float_extend:DF (match_operand:SF 1 "register_operand" "f")))]  "TARGET_HARD_FLOAT"  "cvt.d.s\\t%0,%1"  [(set_attr "type"	"fcvt")   (set_attr "mode"	"DF")   (set_attr "length"	"1")]);;;;  ....................;;;;	CONVERSIONS;;;;  ....................(define_insn "fix_truncdfsi2"  [(set (match_operand:SI 0 "general_operand" "=d,*f,R,o")	(fix:SI (match_operand:DF 1 "register_operand" "f,*f,f,f")))   (clobber (match_scratch:SI 2 "=d,*d,d,d"))   (clobber (match_scratch:DF 3 "=f,*X,f,f"))]  "TARGET_HARD_FLOAT"  "*{  rtx xoperands[10];  if (which_alternative == 1)    return \"trunc.w.d %0,%1,%2\";  output_asm_insn (\"trunc.w.d %3,%1,%2\", operands);  xoperands[0] = operands[0];  xoperands[1] = operands[3];  output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);  return \"\";}"  [(set_attr "type"	"fcvt")   (set_attr "mode"	"DF")   (set_attr "length"	"11,9,10,11")])(define_insn "fix_truncsfsi2"  [(set (match_operand:SI 0 "general_operand" "=d,*f,R,o")	(fix:SI (match_operand:SF 1 "register_operand" "f,*f,f,f")))   (clobber (match_scratch:SI 2 "=d,*d,d,d"))   (clobber (match_scratch:SF 3 "=f,*X,f,f"))]  "TARGET_HARD_FLOAT"  "*{  rtx xoperands[10];  if (which_alternative == 1)    return \"trunc.w.s %0,%1,%2\";  output_asm_insn (\"trunc.w.s %3,%1,%2\", operands);  xoperands[0] = operands[0];  xoperands[1] = operands[3];  output_asm_insn (mips_move_1word (xoperands, insn, FALSE), xoperands);  return \"\";}"  [(set_attr "type"	"fcvt")   (set_attr "mode"	"SF")   (set_attr "length"	"11,9,10,11")])(define_insn "floatsidf2"  [(set (match_operand:DF 0 "register_operand" "=f,f,f")	(float:DF (match_operand:SI 1 "nonimmediate_operand" "d,R,m")))]  "TARGET_HARD_FLOAT"  "*{  dslots_load_total++;  if (GET_CODE (operands[1]) == MEM)    return \"l.s\\t%0,%1%#\;cvt.d.w\\t%0,%0\";  return \"mtc1\\t%1,%0%#\;cvt.d.w\\t%0,%0\";}"  [(set_attr "type"	"fcvt")   (set_attr "mode"	"DF")   (set_attr "length"	"3,4,3")])(define_insn "floatsisf2"  [(set (match_operand:SF 0 "register_operand" "=f,f,f")	(float:SF (match_operand:SI 1 "nonimmediate_operand" "d,R,m")))]  "TARGET_HARD_FLOAT"  "*{  dslots_load_total++;  if (GET_CODE (operands[1]) == MEM)    return \"l.s\\t%0,%1%#\;cvt.s.w\\t%0,%0\";  return \"mtc1\\t%1,%0%#\;cvt.s.w\\t%0,%0\";}"  [(set_attr "type"	"fcvt")   (set_attr "mode"	"SF")   (set_attr "length"	"3,4,3")])(define_expand "fixuns_truncdfsi2"  [(set (match_operand:SI 0 "register_operand" "")	(unsigned_fix:SI (match_operand:DF 1 "register_operand" "")))]  "TARGET_HARD_FLOAT"  "{  rtx reg1 = gen_reg_rtx (DFmode);  rtx reg2 = gen_reg_rtx (DFmode);  rtx reg3 = gen_reg_rtx (SImode);  rtx label1 = gen_label_rtx ();  rtx label2 = gen_label_rtx ();  REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);  if (reg1)			/* turn off complaints about unreached code */    {      emit_move_insn (reg1, immed_real_const_1 (offset, DFmode));      do_pending_stack_adjust ();      emit_insn (gen_cmpdf (operands[1], reg1));      emit_jump_insn (gen_bge (label1));      emit_insn (gen_fix_truncdfsi2 (operands[0], operands[1]));      emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,			       gen_rtx (LABEL_REF, VOIDmode, label2)));      emit_barrier ();      emit_label (label1);      emit_move_insn (reg2, gen_rtx (MINUS, DFmode, operands[1], reg1));      emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));      emit_insn (gen_fix_truncdfsi2 (operands[0], reg2));      emit_insn (gen_iorsi3 (operands[0], operands[0], reg3));      emit_label (label2);      /* allow REG_NOTES to be set on last insn (labels don't have enough	 fields, and can't be used for REG_NOTES anyway).  */      emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));      DONE;    }}")(define_expand "fixuns_truncsfsi2"  [(set (match_operand:SI 0 "register_operand" "")	(unsigned_fix:SI (match_operand:SF 1 "register_operand" "")))]  "TARGET_HARD_FLOAT"  "{  rtx reg1 = gen_reg_rtx (SFmode);  rtx reg2 = gen_reg_rtx (SFmode);  rtx reg3 = gen_reg_rtx (SImode);  rtx label1 = gen_label_rtx ();  rtx label2 = gen_label_rtx ();  REAL_VALUE_TYPE offset = REAL_VALUE_LDEXP (1.0, 31);  if (reg1)			/* turn off complaints about unreached code */    {      emit_move_insn (reg1, immed_real_const_1 (offset, SFmode));      do_pending_stack_adjust ();      emit_insn (gen_cmpsf (operands[1], reg1));      emit_jump_insn (gen_bge (label1));      emit_insn (gen_fix_truncsfsi2 (operands[0], operands[1]));      emit_jump_insn (gen_rtx (SET, VOIDmode, pc_rtx,			       gen_rtx (LABEL_REF, VOIDmode, label2)));      emit_barrier ();      emit_label (label1);      emit_move_insn (reg2, gen_rtx (MINUS, SFmode, operands[1], reg1));      emit_move_insn (reg3, gen_rtx (CONST_INT, VOIDmode, 0x80000000));      emit_insn (gen_fix_truncsfsi2 (operands[0], reg2));      emit_insn (gen_iorsi3 (operands[0], operands[0], reg3));      emit_label (label2);      /* allow REG_NOTES to be set on last insn (labels don't have enough	 fields, and can't be used for REG_NOTES anyway).  */      emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));      DONE;    }}");;;;  ....................;;;;	DATA MOVEMENT;;;;  ....................;; unaligned word moves generated by the block moves.(define_expand "movsi_unaligned"  [(set (match_operand:SI 0 "general_operand" "")	(unspec [(match_operand:SI 1 "general_operand" "")] 0))]  ""  "{  /* Handle loads.  */  if (GET_CODE (operands[0]) == MEM)    {      rtx reg = gen_reg_rtx (SImode);      rtx insn = emit_insn (gen_movsi_ulw (reg, operands[1]));      rtx addr = XEXP (operands[0], 0);      if (CONSTANT_P (addr))	REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUIV, addr, REG_NOTES (insn));      if (reg_or_0_operand (operands[1], SImode))

⌨️ 快捷键说明

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