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

📄 sparc.md

📁 gcc库的原代码,对编程有很大帮助.
💻 MD
📖 第 1 页 / 共 5 页
字号:
      if (GET_MODE (operands[0]) == SImode)	pat = gen_seqsi_special (operands[0], sparc_compare_op0,				 sparc_compare_op1);      else if (! TARGET_V9)	FAIL;      else	pat = gen_seqsi_special_extend (operands[0], sparc_compare_op0,					sparc_compare_op1);      emit_insn (pat);      DONE;    }  else if (GET_MODE (sparc_compare_op0) == DImode)    {      rtx pat;      if (GET_MODE (operands[0]) == SImode)	pat = gen_seqdi_special_trunc (operands[0], sparc_compare_op0,				       sparc_compare_op1);      else if (! TARGET_V9)	FAIL;      else	pat = gen_seqdi_special (operands[0], sparc_compare_op0,				 sparc_compare_op1);      emit_insn (pat);      DONE;    }  else if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD)    {      emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, EQ);      emit_insn (gen_sne (operands[0]));      DONE;    }        else if (TARGET_V9)    {      if (gen_v9_scc (EQ, operands))	DONE;      /* fall through */    }  operands[1] = gen_compare_reg (EQ, sparc_compare_op0, sparc_compare_op1);}");; ??? v9: Operand 0 needs a mode, so SImode was chosen.;; However, the code handles both SImode and DImode.(define_expand "sne"  [(set (match_operand:SI 0 "intreg_operand" "")	(ne:SI (match_dup 1) (const_int 0)))]  ""  "{  if (GET_MODE (sparc_compare_op0) == SImode)    {      rtx pat;      if (GET_MODE (operands[0]) == SImode)	pat = gen_snesi_special (operands[0], sparc_compare_op0,				 sparc_compare_op1);      else if (! TARGET_V9)	FAIL;      else	pat = gen_snesi_special_extend (operands[0], sparc_compare_op0,					sparc_compare_op1);      emit_insn (pat);      DONE;    }  else if (GET_MODE (sparc_compare_op0) == DImode)    {      rtx pat;      if (GET_MODE (operands[0]) == SImode)	pat = gen_snedi_special_trunc (operands[0], sparc_compare_op0,				       sparc_compare_op1);      else if (! TARGET_V9)	FAIL;      else	pat = gen_snedi_special (operands[0], sparc_compare_op0,				 sparc_compare_op1);      emit_insn (pat);      DONE;    }  else if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD)    {      emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, NE);      emit_insn (gen_sne (operands[0]));      DONE;    }        else if (TARGET_V9)    {      if (gen_v9_scc (NE, operands))	DONE;      /* fall through */    }  operands[1] = gen_compare_reg (NE, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sgt"  [(set (match_operand:SI 0 "intreg_operand" "")	(gt:SI (match_dup 1) (const_int 0)))]  ""  "{  if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD)    {      emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, GT);      emit_insn (gen_sne (operands[0]));      DONE;    }  else if (TARGET_V9)    {      if (gen_v9_scc (GT, operands))	DONE;      /* fall through */    }  operands[1] = gen_compare_reg (GT, sparc_compare_op0, sparc_compare_op1);}")(define_expand "slt"  [(set (match_operand:SI 0 "intreg_operand" "")	(lt:SI (match_dup 1) (const_int 0)))]  ""  "{  if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD)    {      emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, LT);      emit_insn (gen_sne (operands[0]));      DONE;    }  else if (TARGET_V9)    {      if (gen_v9_scc (LT, operands))	DONE;      /* fall through */    }  operands[1] = gen_compare_reg (LT, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sge"  [(set (match_operand:SI 0 "intreg_operand" "")	(ge:SI (match_dup 1) (const_int 0)))]  ""  "{  if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD)    {      emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, GE);      emit_insn (gen_sne (operands[0]));      DONE;    }  else if (TARGET_V9)    {      if (gen_v9_scc (GE, operands))	DONE;      /* fall through */    }  operands[1] = gen_compare_reg (GE, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sle"  [(set (match_operand:SI 0 "intreg_operand" "")	(le:SI (match_dup 1) (const_int 0)))]  ""  "{  if (GET_MODE (sparc_compare_op0) == TFmode && ! TARGET_HARD_QUAD)    {      emit_float_lib_cmp (sparc_compare_op0, sparc_compare_op1, LE);      emit_insn (gen_sne (operands[0]));      DONE;    }  else if (TARGET_V9)    {      if (gen_v9_scc (LE, operands))	DONE;      /* fall through */    }  operands[1] = gen_compare_reg (LE, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sgtu"  [(set (match_operand:SI 0 "intreg_operand" "")	(gtu:SI (match_dup 1) (const_int 0)))]  ""  "{  if (! TARGET_V9)    {      rtx tem;      /* We can do ltu easily, so if both operands are registers, swap them and	 do a LTU.  */      if ((GET_CODE (sparc_compare_op0) == REG	   || GET_CODE (sparc_compare_op0) == SUBREG)	  && (GET_CODE (sparc_compare_op1) == REG	      || GET_CODE (sparc_compare_op1) == SUBREG))	{	  tem = sparc_compare_op0;	  sparc_compare_op0 = sparc_compare_op1;	  sparc_compare_op1 = tem;	  emit_insn (gen_sltu (operands[0]));	  DONE;	}    }  else    {      if (gen_v9_scc (GTU, operands))	DONE;    }  operands[1] = gen_compare_reg (GTU, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sltu"  [(set (match_operand:SI 0 "intreg_operand" "")	(ltu:SI (match_dup 1) (const_int 0)))]  ""  "{  if (TARGET_V9)    {      if (gen_v9_scc (LTU, operands))	DONE;    }  operands[1] = gen_compare_reg (LTU, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sgeu"  [(set (match_operand:SI 0 "intreg_operand" "")	(geu:SI (match_dup 1) (const_int 0)))]  ""  "{  if (TARGET_V9)    {      if (gen_v9_scc (GEU, operands))	DONE;    }  operands[1] = gen_compare_reg (GEU, sparc_compare_op0, sparc_compare_op1);}")(define_expand "sleu"  [(set (match_operand:SI 0 "intreg_operand" "")	(leu:SI (match_dup 1) (const_int 0)))]  ""  "{  if (! TARGET_V9)    {      rtx tem;      /* We can do geu easily, so if both operands are registers, swap them and	 do a GEU.  */      if ((GET_CODE (sparc_compare_op0) == REG	   || GET_CODE (sparc_compare_op0) == SUBREG)	  && (GET_CODE (sparc_compare_op1) == REG	      || GET_CODE (sparc_compare_op1) == SUBREG))	{	  tem = sparc_compare_op0;	  sparc_compare_op0 = sparc_compare_op1;	  sparc_compare_op1 = tem;	  emit_insn (gen_sgeu (operands[0]));	  DONE;	}    }  else    {      if (gen_v9_scc (LEU, operands))	DONE;    }  operands[1] = gen_compare_reg (LEU, sparc_compare_op0, sparc_compare_op1);}");; Now the DEFINE_INSNs for the compare and scc cases.  First the compares.(define_insn "*cmpsi_insn"  [(set (reg:CC 0)	(compare:CC (match_operand:SI 0 "register_operand" "r")		    (match_operand:SI 1 "arith_operand" "rI")))]  ""  "cmp %r0,%1"  [(set_attr "type" "compare")])(define_insn "*cmpsf_fpe_sp32"  [(set (reg:CCFPE 0)	(compare:CCFPE (match_operand:SF 0 "register_operand" "f")		       (match_operand:SF 1 "register_operand" "f")))]  "! TARGET_V9 && TARGET_FPU"  "fcmpes %0,%1"  [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fpe_sp32"  [(set (reg:CCFPE 0)	(compare:CCFPE (match_operand:DF 0 "register_operand" "e")		       (match_operand:DF 1 "register_operand" "e")))]  "! TARGET_V9 && TARGET_FPU"  "fcmped %0,%1"  [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fpe_sp32"  [(set (reg:CCFPE 0)	(compare:CCFPE (match_operand:TF 0 "register_operand" "e")		       (match_operand:TF 1 "register_operand" "e")))]  "! TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD"  "fcmpeq %0,%1"  [(set_attr "type" "fpcmp")])(define_insn "*cmpsf_fp_sp32"  [(set (reg:CCFP 0)	(compare:CCFP (match_operand:SF 0 "register_operand" "f")		      (match_operand:SF 1 "register_operand" "f")))]  "! TARGET_V9 && TARGET_FPU"  "fcmps %0,%1"  [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fp_sp32"  [(set (reg:CCFP 0)	(compare:CCFP (match_operand:DF 0 "register_operand" "e")		      (match_operand:DF 1 "register_operand" "e")))]  "! TARGET_V9 && TARGET_FPU"  "fcmpd %0,%1"  [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fp_sp32"  [(set (reg:CCFP 0)	(compare:CCFP (match_operand:TF 0 "register_operand" "e")		      (match_operand:TF 1 "register_operand" "e")))]  "! TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD"  "fcmpq %0,%1"  [(set_attr "type" "fpcmp")])(define_insn "*cmpdi_sp64"  [(set (reg:CCX 0)	(compare:CCX (match_operand:DI 0 "register_operand" "r")		     (match_operand:DI 1 "arith_double_operand" "rHI")))]  "TARGET_V9"  "cmp %r0,%1"  [(set_attr "type" "compare")])(define_insn "*cmpsf_fpe_sp64"  [(set (match_operand:CCFPE 0 "ccfp_reg_operand" "=c")	(compare:CCFPE (match_operand:SF 1 "register_operand" "f")		       (match_operand:SF 2 "register_operand" "f")))]  "TARGET_V9 && TARGET_FPU"  "fcmpes %0,%1,%2"  [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fpe_sp64"  [(set (match_operand:CCFPE 0 "ccfp_reg_operand" "=c")	(compare:CCFPE (match_operand:DF 1 "register_operand" "e")		       (match_operand:DF 2 "register_operand" "e")))]  "TARGET_V9 && TARGET_FPU"  "fcmped %0,%1,%2"  [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fpe_sp64"  [(set (match_operand:CCFPE 0 "ccfp_reg_operand" "=c")	(compare:CCFPE (match_operand:TF 1 "register_operand" "e")		       (match_operand:TF 2 "register_operand" "e")))]  "TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD"  "fcmpeq %0,%1,%2"  [(set_attr "type" "fpcmp")])(define_insn "*cmpsf_fp_sp64"  [(set (match_operand:CCFP 0 "ccfp_reg_operand" "=c")	(compare:CCFP (match_operand:SF 1 "register_operand" "f")		      (match_operand:SF 2 "register_operand" "f")))]  "TARGET_V9 && TARGET_FPU"  "fcmps %0,%1,%2"  [(set_attr "type" "fpcmp")])(define_insn "*cmpdf_fp_sp64"  [(set (match_operand:CCFP 0 "ccfp_reg_operand" "=c")	(compare:CCFP (match_operand:DF 1 "register_operand" "e")		      (match_operand:DF 2 "register_operand" "e")))]  "TARGET_V9 && TARGET_FPU"  "fcmpd %0,%1,%2"  [(set_attr "type" "fpcmp")])(define_insn "*cmptf_fp_sp64"  [(set (match_operand:CCFP 0 "ccfp_reg_operand" "=c")	(compare:CCFP (match_operand:TF 1 "register_operand" "e")		      (match_operand:TF 2 "register_operand" "e")))]  "TARGET_V9 && TARGET_FPU && TARGET_HARD_QUAD"  "fcmpq %0,%1,%2"  [(set_attr "type" "fpcmp")]);; The SEQ and SNE patterns are special because they can be done;; without any branching and do not involve a COMPARE.(define_insn "*snesi_zero"  [(set (match_operand:SI 0 "register_operand" "=r")	(ne:SI (match_operand:SI 1 "register_operand" "r")	       (const_int 0)))   (clobber (reg:CC 0))]  ""  "subcc %%g0,%1,%%g0\;addx %%g0,0,%0"  [(set_attr "type" "unary")   (set_attr "length" "2")])(define_insn "*neg_snesi_zero"  [(set (match_operand:SI 0 "register_operand" "=r")	(neg:SI (ne:SI (match_operand:SI 1 "register_operand" "r")		       (const_int 0))))   (clobber (reg:CC 0))]  ""  "subcc %%g0,%1,%%g0\;subx %%g0,0,%0"  [(set_attr "type" "unary")   (set_attr "length" "2")])(define_insn "*snedi_zero"  [(set (match_operand:DI 0 "register_operand" "=r")	(ne:DI (match_operand:DI 1 "register_operand" "r")	       (const_int 0)))   (clobber (reg:CCX 0))]  "TARGET_V9"  "mov 0,%0\;movrnz %1,1,%0"  [(set_attr "type" "unary")   (set_attr "length" "2")])(define_insn "*neg_snedi_zero"  [(set (match_operand:DI 0 "register_operand" "=r")

⌨️ 快捷键说明

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